lib/openwfe/expressions/fe_reserve.rb in ruote-0.9.19 vs lib/openwfe/expressions/fe_reserve.rb in ruote-0.9.20

- old
+ new

@@ -1,47 +1,30 @@ -# #-- -# Copyright (c) 2007-2008, John Mettraux, OpenWFE.org -# All rights reserved. +# Copyright (c) 2007-2009, John Mettraux, jmettraux@gmail.com # -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: # -# . Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. # -# . Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. # -# . Neither the name of the "OpenWFE" nor the names of its contributors may be -# used to endorse or promote products derived from this software without -# specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. +# Made in Japan. #++ -# -# -# "made in Japan" -# -# John Mettraux at openwfe.org -# -#require 'thread' - - module OpenWFE # # The 'reserve' expression ensures that its nested child expression # executes while a reserved mutex is set. @@ -68,16 +51,10 @@ # be used to prevent segments of totally different process instances from # running. # class ReserveExpression < FlowExpression - # - # A mutex for the whole class, it's meant to prevent 'reserve' - # from reserving a workflow mutex simultaneaously. - # - #@@mutex = Mutex.new - names :reserve # # The name of the mutex this expressions uses. # It's a variable name, that means it can be prefixed with @@ -93,48 +70,43 @@ attr_accessor :applied_workitem def apply (workitem) - return reply_to_parent(workitem) \ - if @children.size < 1 + return reply_to_parent(workitem) if has_no_expression_child - @mutex_name = lookup_string_attribute :mutex, workitem + @mutex_name = lookup_string_attribute(:mutex, workitem) - #FlowMutex.synchronize do - mutex = lookup_variable(@mutex_name) || FlowMutex.new(@mutex_name) - mutex.register self, workitem - #end + mutex.register(self, workitem) end def reply (workitem) - lookup_variable(@mutex_name).release self + lookup_variable(@mutex_name).release(self) - reply_to_parent workitem + reply_to_parent(workitem) end # # takes care of exiting the critical section once the children # have been cancelled # def cancel super - lookup_variable(@mutex_name).release self + lookup_variable(@mutex_name).release(self) end # # Called by the FlowMutex to enter the 'reserved/critical' section. # def enter (workitem=nil) - get_expression_pool.apply( - @children[0], workitem || @applied_workitem) + apply_child(first_expression_child, workitem || @applied_workitem) end end # # A FlowMutex is a process variable (thus serializable) that keeps @@ -167,18 +139,18 @@ def register (fexp, workitem) @feis << fexp.fei - fexp.set_variable @mutex_name, self + fexp.set_variable(@mutex_name, self) if @feis.size == 1 # # immediately let the expression enter the critical section # - fexp.store_itself - fexp.enter workitem + #fexp.store_itself + fexp.enter(workitem) else # # later... # fexp.applied_workitem = workitem @@ -188,20 +160,17 @@ def release (releaser) next_fei = nil - #@@class_mutex.synchronize do - current_fei = @feis.delete_at 0 - releaser.set_variable @mutex_name, self + releaser.set_variable(@mutex_name, self) log.warn "release() BAD! c:#{current_fei} r:#{releaser.fei}" \ if releaser.fei != current_fei next_fei = @feis.first - #end return unless next_fei releaser.get_expression_pool.fetch_expression(next_fei).enter end