ruby--ruby/lib/thwait.rb

129 lines
2.4 KiB
Ruby
Raw Normal View History

#
# thwait.rb -
# $Release Version: $
# $Revision: 1.1 $
# $Date: 1997/08/18 03:13:14 $
# by Keiju ISHITSUKA(Nippon Rational Inc.)
#
# --
#
#
#
require "thread.rb"
require "e2mmap.rb"
class ThreadsWait
RCS_ID='-$Header: /home/keiju/var/src/var.lib/ruby/RCS/thwait.rb,v 1.1 1997/08/18 03:13:14 keiju Exp keiju $-'
Exception2MessageMapper.extend_to(binding)
def_exception("ErrWaitThreadsNothing", "Wait threads nothing.")
def_exception("FinshedThreadsNothing", "finished thread nothing.")
# class mthods
# all_waits
#
# <20><><EFBFBD><EFBFBD><EAA4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>åɤ<C3A5><C9A4><EFBFBD><EFBFBD>ƽ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>ޤ<EFBFBD><DEA4>Ԥ<EFBFBD>. <20><><EFBFBD>ƥ졼<C6A5><ECA1BC><EFBFBD>Ȥ<EFBFBD><C8A4>ƸƤФ<C6A4><D0A4><EFBFBD><EFBFBD><EFBFBD>
# <20><><EFBFBD><EFBFBD><EAA4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>åɤ<C3A5><C9A4><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5>ƥ졼<C6A5><ECA1BC><EFBFBD><EFBFBD><EFBFBD>ƤӽФ<D3BD>.
#
def ThreadsWait.all_waits(*threads)
tw = ThreadsWait.new(th1, th2, th3, th4, th5)
if iterator?
tw.all_waits do
|th|
yield th
end
else
tw.all_waits
end
end
# initialize and terminating:
# initialize
#
# <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20>Ԥĥ<D4A4><C4A5><EFBFBD><EFBFBD>åɤλ<C9A4><CEBB><EFBFBD>Ǥ<EFBFBD><C7A4><EFBFBD>.
#
def initialize(*threads)
@threads = []
@wait_queue = Queue.new
join_nowait(*threads) unless threads.empty?
end
# accessing
# threads
# <20>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>åɤΰ<C9A4><CEB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD>.
attr :threads
# testing
# empty?
# finished?
#
#
# <20>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>åɤ<C3A5>¸<EFBFBD>ߤ<EFBFBD><DFA4><EFBFBD>ɤ<EFBFBD><C9A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD>.
def empty?
@threads.empty?
end
#
# <20><><EFBFBD>Ǥ˽<C7A4>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>åɤ<C3A5><C9A4><EFBFBD><EFBFBD><EFBFBD>ɤ<EFBFBD><C9A4><EFBFBD><EFBFBD>֤<EFBFBD>
def finished?
!@wait_queue.empty?
end
# main process:
# join
# join_nowait
# next_wait
# all_wait
#
# <20>ԤäƤ<C3A4><C6A4><EFBFBD><EBA5B9><EFBFBD>åɤ<C3A5><C9A4>ɲä<C9B2><C3A4>Ԥ<EFBFBD><D4A4>ˤϤ<CBA4><CFA4><EFBFBD>.
#
def join(*threads)
join_nowait(*threads)
next_wait
end
#
# <20>ԤäƤ<C3A4><C6A4><EFBFBD><EBA5B9><EFBFBD>åɤ<C3A5><C9A4>ɲä<C9B2><C3A4><EFBFBD>. <20>Ԥ<EFBFBD><D4A4>ˤ<EFBFBD><CBA4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʤ<EFBFBD>.
#
def join_nowait(*threads)
@threads.concat threads
for th in threads
Thread.start do
th = Thread.join(th)
@wait_queue.push th
end
end
end
#
# <20><><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><D4A4>ˤϤ<CBA4><CFA4><EFBFBD>.
# <20>ԤĤ٤<C4A4><D9A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>åɤ<C3A5><C9A4>ʤ<EFBFBD><CAA4><EFBFBD><EFBFBD><EFBFBD>, <20>㳰ErrWaitThreadsNothing <20><><EFBFBD>֤<EFBFBD>.
# nonnlock<63><6B><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>ˤ<EFBFBD>, nonblocking<6E><67>Ĵ<EFBFBD>٤<EFBFBD>. ¸<>ߤ<EFBFBD><DFA4>ʤ<EFBFBD><CAA4><EFBFBD><EFBFBD><EFBFBD>, <20>
# FinishedThreadNothing<6E><67><EFBFBD>֤<EFBFBD>.
#
def next_wait(nonblock = nil)
Threads.Wait.fail ErrWaitThreadsNothing if @threads.empty?
th = @wait_queue.pop(nonblock)
@threads.delete th
th
end
#
# <20><><EFBFBD>ƤΥ<C6A4><CEA5><EFBFBD><EFBFBD>åɤ<C3A5><C9A4><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>ޤ<EFBFBD><DEA4>Ԥ<EFBFBD>. <20><><EFBFBD>ƥ졼<C6A5><ECA1BC><EFBFBD>Ȥ<EFBFBD><C8A4>ƸƤФ줿<D0A4><ECA4BF><EFBFBD><EFBFBD>, <20><>
# <20><><EFBFBD>åɤ<C3A5><C9A4><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>٤<EFBFBD>, <20><><EFBFBD>ƥ졼<C6A5><ECA1BC><EFBFBD><EFBFBD><EFBFBD>ƤӽФ<D3BD>.
#
def all_waits
until @threads.empty?
th = next_wait
yield th if iterator?
end
end
end