]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blob - lib/rbot/compat19.rb
ruby 2.0.0: fix for changed @waiters in compat19
[user/henk/code/ruby/rbot.git] / lib / rbot / compat19.rb
1 #-- vim:sw=2:et
2 #++
3 #
4 # :title: ruby 1.9 compatibility (monkey)patches
5
6 require 'timeout'
7 require "thread"
8
9 class ConditionVariable
10
11   def wait(mutex, timeout=nil)
12     begin
13       # TODO: mutex should not be used
14       @waiters_mutex.synchronize do
15         if @waiters.instance_of? Hash # ruby 2.0.0?
16           @waiters[Thread.current] = true
17         else
18           @waiters.push(Thread.current)
19         end
20       end
21       if timeout
22         elapsed = mutex.sleep timeout if timeout > 0.0
23         unless timeout > 0.0 and elapsed < timeout
24           t = @waiters_mutex.synchronize { @waiters.delete Thread.current }
25           signal unless t # if we got notified, pass it along
26           raise TimeoutError, "wait timed out"
27         end
28       else
29         mutex.sleep
30       end
31     end
32     nil
33   end
34
35 end
36
37 require 'monitor'
38
39 module MonitorMixin
40
41   class ConditionVariable
42
43     def wait(timeout = nil)
44       #if timeout
45       #  raise NotImplementedError, "timeout is not implemented yet"
46       #end
47       @monitor.__send__(:mon_check_owner)
48       count = @monitor.__send__(:mon_exit_for_cond)
49       begin
50         @cond.wait(@monitor.instance_variable_get("@mon_mutex"), timeout)
51         return true
52       rescue TimeoutError
53         return false
54       ensure
55         @monitor.__send__(:mon_enter_for_cond, count)
56       end
57     end
58
59     def signal
60       @monitor.__send__(:mon_check_owner)
61       @cond.signal
62     end
63
64     def broadcast
65       @monitor.__send__(:mon_check_owner)
66       @cond.broadcast
67     end
68
69   end  # ConditionVariable
70
71   def self.extend_object(obj)
72     super(obj)
73     obj.__send__(:mon_initialize)
74   end
75
76 end # MonitorMixin