summaryrefslogtreecommitdiff
path: root/lib/thwait.rb
blob: 84ba2c8749549d00fbec436a0e267c90c60bd850 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#
#   thwait.rb - ����å�Ʊ�����饹
#   	$Release Version: 0.9 $
#   	$Revision: 1.3 $
#   	$Date: 1998/06/26 03:19:34 $
#   	by Keiju ISHITSUKA(Nihpon Rational Software Co.,Ltd.)
#
# --
#  ��ǽ:
#  ʣ���Υ���åɤ�ؤ������Υ���åɤ���λ����ޤ�wait���뵡ǽ����
#  ������. 
#
#  ���饹�᥽�å�:
#  * ThreadsWait.all_waits(thread1,...)
#    ���ƤΥ���åɤ���λ����ޤ��Ԥ�. ���ƥ졼���Ȥ��ƸƤФ줿���ˤ�, 
#    ����åɤ���λ�����٤˥��ƥ졼����¹Ԥ���.
#  * th = ThreadsWait.new(thread1,...)
#    Ʊ�����륹��åɤ���ꤷƱ�����֥������Ȥ�����.
#  
#  �᥽�å�:
#  * th.threads
#    Ʊ�����٤�����åɤΰ���
#  * th.empty?
#    Ʊ�����٤�����åɤ����뤫�ɤ���
#  * th.finished?
#    ���Ǥ˽�λ��������åɤ����뤫�ɤ���
#  * th.join(thread1,...) 
#    Ʊ�����륹��åɤ���ꤷ, �����줫�Υ���åɤ���λ����ޤ��Ԥ��ˤϤ���.
#  * th.join_nowait(threa1,...)
#    Ʊ�����륹��åɤ���ꤹ��. �Ԥ��ˤ�����ʤ�.
#  * th.next_wait
#    �����줫�Υ���åɤ���λ����ޤ��Ԥ��ˤϤ���.
#  * th.all_waits
#    ���ƤΥ���åɤ���λ����ޤ��Ԥ�. ���ƥ졼���Ȥ��ƸƤФ줿���ˤ�, 
#    ����åɤ���λ�����٤˥��ƥ졼����¹Ԥ���.
#

require "thread.rb"
require "e2mmap.rb"

class ThreadsWait
  RCS_ID='-$Id: thwait.rb,v 1.3 1998/06/26 03:19:34 keiju Exp keiju $-'
  
  Exception2MessageMapper.extend_to(binding)
  def_exception("ErrNoWaitingThread", "No threads for waiting.")
  def_exception("ErrNoFinshedThread", "No finished threads.")
  
  # class mthods
  #	all_waits
  
  #
  # ���ꤷ������åɤ����ƽ�λ����ޤ��Ԥ�. ���ƥ졼���Ȥ��ƸƤФ���
  # ���ꤷ������åɤ���λ����Ȥ��ν�λ��������åɤ�����Ȥ��ƥ��ƥ졼
  # ����ƤӽФ�. 
  #
  def ThreadsWait.all_waits(*threads)
    tw = ThreadsWait.new(*threads)
    if iterator?
      tw.all_waits do
	|th|
	yield th
      end
    else
      tw.all_waits
    end
  end
  
  # initialize and terminating:
  #	initialize
  
  #
  # �����. �Ԥĥ���åɤλ��꤬�Ǥ���.
  #
  def initialize(*threads)
    @threads = []
    @wait_queue = Queue.new
    join_nowait(*threads) unless threads.empty?
  end
  
  # accessing
  #	threads
  
  # �Ԥ�����åɤΰ������֤�.
  attr :threads
  
  # testing
  #	empty?
  #	finished?
  #
  
  #
  # �Ԥ�����åɤ�¸�ߤ��뤫�ɤ������֤�.
  def empty?
    @threads.empty?
  end
  
  #
  # ���Ǥ˽�λ��������åɤ����뤫�ɤ����֤�
  def finished?
    !@wait_queue.empty?
  end
  
  # main process:
  #	join
  #	join_nowait
  #	next_wait
  #	all_wait
  
  #
  # �ԤäƤ��륹��åɤ��ɲä�. �����줫�Υ���åɤ�1�Ľ�λ����ޤ���
  # ���ˤϤ���.
  #
  def join(*threads)
    join_nowait(*threads)
    next_wait
  end
  
  #
  # �ԤäƤ��륹��åɤ��ɲä���. �Ԥ��ˤ�����ʤ�.
  #
  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
  
  #
  # �����줫�Υ���åɤ���λ����ޤ��Ԥ��ˤϤ���.
  # �ԤĤ٤�����åɤ��ʤ����, �㳰ErrNoWaitingThread���֤�.
  # nonnlock�����λ��ˤ�, nonblocking��Ĵ�٤�. ¸�ߤ��ʤ����, �㳰
  # ErrNoFinishedThread���֤�.
  #
  def next_wait(nonblock = nil)
    ThreadsWait.fail ErrNoWaitingThread if @threads.empty?
    begin
      @threads.delete(th = @wait_queue.pop(nonblock))
      th
    rescue ThreadError
      ThreadsWait.fail ErrNoFinshedThread
    end
  end
  
  #
  # ���ƤΥ���åɤ���λ����ޤ��Ԥ�. ���ƥ졼���Ȥ��ƸƤФ줿����, ��
  # ��åɤ���λ�����٤�, ���ƥ졼����ƤӽФ�.
  #
  def all_waits
    until @threads.empty?
      th = next_wait
      yield th if iterator?
    end
  end
end

ThWait = ThreadsWait