dramatis 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. data/History.txt +7 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +119 -0
  4. data/README.txt +57 -0
  5. data/Rakefile +4 -0
  6. data/config/hoe.rb +70 -0
  7. data/config/requirements.rb +17 -0
  8. data/examples/README.txt +20 -0
  9. data/examples/auction.rb +90 -0
  10. data/examples/bank/bank.rb +7 -0
  11. data/examples/bank/bank_test.rb +7 -0
  12. data/examples/exception.rb +40 -0
  13. data/examples/fib/conservative.rb +50 -0
  14. data/examples/fib/future.rb +5 -0
  15. data/examples/fib/original.rb +33 -0
  16. data/examples/fib/threads.rb +51 -0
  17. data/examples/im/distributed/chat/client.rb +49 -0
  18. data/examples/im/distributed/chat/screen/fox.rb +92 -0
  19. data/examples/im/distributed/chat/screen.rb +11 -0
  20. data/examples/im/distributed/chat/server.rb +72 -0
  21. data/examples/im/distributed/chat.rb +5 -0
  22. data/examples/im/distributed/client.rb +9 -0
  23. data/examples/im/distributed/run.rb +18 -0
  24. data/examples/im/distributed/server.rb +11 -0
  25. data/examples/im/single/chat/client.rb +50 -0
  26. data/examples/im/single/chat/screen/fox.rb +96 -0
  27. data/examples/im/single/chat/screen/wxs.rb +63 -0
  28. data/examples/im/single/chat/screen.rb +11 -0
  29. data/examples/im/single/chat/server.rb +72 -0
  30. data/examples/im/single/chat.rb +5 -0
  31. data/examples/im/single/fox.rb +18 -0
  32. data/examples/im/single/wxchat.rb +19 -0
  33. data/examples/pingpong/actor.rb +33 -0
  34. data/examples/pingpong/actor_rec.rb +34 -0
  35. data/examples/pingpong/pingpong.txt +315 -0
  36. data/examples/pingpong/scala.rb +41 -0
  37. data/examples/pingpong/serial.rb +26 -0
  38. data/examples/pretty.txt +108 -0
  39. data/examples/telephone/.irbrc +2 -0
  40. data/examples/telephone/3esl.txt +21877 -0
  41. data/examples/telephone/fifth/kid.rb +36 -0
  42. data/examples/telephone/fifth/run.rb +26 -0
  43. data/examples/telephone/first/kid.rb +31 -0
  44. data/examples/telephone/first/run.rb +20 -0
  45. data/examples/telephone/fourth/kid.rb +31 -0
  46. data/examples/telephone/fourth/run.rb +26 -0
  47. data/examples/telephone/mangler.rb +53 -0
  48. data/examples/telephone/second/kid.rb +26 -0
  49. data/examples/telephone/second/run.rb +20 -0
  50. data/examples/telephone/seventh/kid.rb +40 -0
  51. data/examples/telephone/seventh/run.rb +35 -0
  52. data/examples/telephone/seventh/test.rb +28 -0
  53. data/examples/telephone/seventh/test2.rb +10 -0
  54. data/examples/telephone/sixth/kid.rb +39 -0
  55. data/examples/telephone/sixth/run.rb +26 -0
  56. data/examples/telephone/third/kid.rb +31 -0
  57. data/examples/telephone/third/run.rb +21 -0
  58. data/lib/dramatis/actor/interface.rb +118 -0
  59. data/lib/dramatis/actor/name/interface.rb +128 -0
  60. data/lib/dramatis/actor/name.rb +44 -0
  61. data/lib/dramatis/actor.rb +96 -0
  62. data/lib/dramatis/deadlock.rb +123 -0
  63. data/lib/dramatis/error/uncaught.rb +19 -0
  64. data/lib/dramatis/error.rb +125 -0
  65. data/lib/dramatis/future/interface.rb +45 -0
  66. data/lib/dramatis/future.rb +32 -0
  67. data/lib/dramatis/runtime/actor/main.rb +3 -0
  68. data/lib/dramatis/runtime/actor.rb +294 -0
  69. data/lib/dramatis/runtime/gate.rb +244 -0
  70. data/lib/dramatis/runtime/scheduler.rb +374 -0
  71. data/lib/dramatis/runtime/task.rb +390 -0
  72. data/lib/dramatis/runtime/thread_pool.rb +149 -0
  73. data/lib/dramatis/runtime/timer.rb +5 -0
  74. data/lib/dramatis/runtime.rb +129 -0
  75. data/lib/dramatis/shoes/runtime.rb +7 -0
  76. data/lib/dramatis/shoes.rb +14 -0
  77. data/lib/dramatis/version.rb +8 -0
  78. data/lib/dramatis.rb +73 -0
  79. data/log/debug.log +0 -0
  80. data/script/destroy +14 -0
  81. data/script/generate +14 -0
  82. data/script/txt2html +74 -0
  83. data/setup.rb +1585 -0
  84. data/spec/dramatis/actor/become_spec.rb +17 -0
  85. data/spec/dramatis/actor/future_spec.rb +189 -0
  86. data/spec/dramatis/actor/name_spec.rb +141 -0
  87. data/spec/dramatis/actor/task_spec.rb +75 -0
  88. data/spec/dramatis/actor_spec.rb +492 -0
  89. data/spec/dramatis/dramatis_spec.rb +23 -0
  90. data/spec/dramatis/exc_spec.rb +78 -0
  91. data/spec/dramatis/runtime/gate_spec.rb +57 -0
  92. data/spec/dramatis/runtime/thread_pool.rb +30 -0
  93. data/spec/dramatis/shoes_spec.rb +11 -0
  94. data/spec/dramatis/simple_spec.rb +32 -0
  95. data/spec/exp_spec.rb +21 -0
  96. data/spec/simple2_spec.rb +36 -0
  97. data/spec/simple_spec.rb +30 -0
  98. data/spec/spec.opts +0 -0
  99. data/spec/spec_helper.rb +26 -0
  100. data/spec/thread_spec.rb +13 -0
  101. data/tasks/deployment.rake +34 -0
  102. data/tasks/environment.rake +7 -0
  103. data/tasks/rspec.rake +21 -0
  104. data/tasks/website.rake +17 -0
  105. data/test/jruby_lm.rb +13 -0
  106. data/test/test.rb +19 -0
  107. data/test/test10.rb +43 -0
  108. data/test/test11.rb +45 -0
  109. data/test/test12.rb +60 -0
  110. data/test/test13.rb +71 -0
  111. data/test/test2.rb +12 -0
  112. data/test/test3.rb +10 -0
  113. data/test/test4.rb +29 -0
  114. data/test/test5.rb +8 -0
  115. data/test/test6.rb +32 -0
  116. data/test/test7.rb +48 -0
  117. data/test/test8.rb +133 -0
  118. data/test/test9.rb +105 -0
  119. data/test/test_exc.rb +22 -0
  120. metadata +180 -0
data/spec/exp_spec.rb ADDED
@@ -0,0 +1,21 @@
1
+ class Demo < StandardError
2
+
3
+ def set_backtrace *args
4
+ super
5
+ end
6
+
7
+ def backtrace
8
+ super
9
+ end
10
+
11
+ end
12
+
13
+ d = Demo.new
14
+
15
+ # p d.backtrace
16
+
17
+ begin
18
+ raise d
19
+ rescue Exception => e
20
+ # p e.backtrace
21
+ end
@@ -0,0 +1,36 @@
1
+ describe "ruby" do
2
+
3
+ it "should work" do
4
+
5
+ module Simple2M
6
+
7
+ class Wrapper
8
+ def initialize wrapped
9
+ end
10
+ end
11
+
12
+ def self.included cls
13
+ class << cls
14
+ def new
15
+ Wrapper.new super
16
+ end
17
+ end
18
+ end
19
+
20
+ end
21
+
22
+ class Simple2C; include Simple2M; end
23
+
24
+ Simple2C.new.should be_kind_of( Simple2M::Wrapper )
25
+
26
+ class Simple2C
27
+ class << self
28
+ remove_method :new
29
+ end
30
+ end
31
+
32
+ Simple2C.new.should be_kind_of( Simple2C )
33
+
34
+ end
35
+
36
+ end
@@ -0,0 +1,30 @@
1
+ describe "ruby" do
2
+
3
+ it "should work" do
4
+
5
+ module SimpleM
6
+
7
+ class Wrapper
8
+ def initialize wrapped
9
+ end
10
+ end
11
+
12
+ module Class
13
+ def new
14
+ Wrapper.new super
15
+ end
16
+ end
17
+
18
+ def self.included cls
19
+ cls.extend Class
20
+ end
21
+
22
+ end
23
+
24
+ class SimpleC; include SimpleM; end
25
+
26
+ SimpleC.new.should be_kind_of( SimpleM::Wrapper )
27
+
28
+ end
29
+
30
+ end
data/spec/spec.opts ADDED
File without changes
@@ -0,0 +1,26 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ gem 'rspec'
6
+ require 'spec'
7
+ end
8
+
9
+ $:.push File.join( File.dirname(__FILE__), "..", "lib" )
10
+
11
+ module DramatisSpecHelper
12
+
13
+ def runtime_check
14
+ begin
15
+ Dramatis::Runtime.current.quiesce
16
+ Dramatis::Runtime.current.exceptions.length.should equal( 0 )
17
+ Thread.list.length.should \
18
+ equal( 1 + Dramatis::Runtime::Scheduler.current.thread_count )
19
+ ensure
20
+ Dramatis::Runtime.reset
21
+ Thread.list.length.should == 1
22
+ end
23
+ end
24
+
25
+ end
26
+
@@ -0,0 +1,13 @@
1
+ describe "ruby" do
2
+
3
+ it "should allow threads to access lexically scoped vars" do
4
+
5
+ x = 12;
6
+
7
+ Thread.new do
8
+ # p x
9
+ end
10
+
11
+ end
12
+
13
+ end
@@ -0,0 +1,34 @@
1
+ desc 'Release the website and new gem version'
2
+ task :deploy => [:check_version, :website, :release] do
3
+ puts "Remember to create SVN tag:"
4
+ puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
5
+ "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
6
+ puts "Suggested comment:"
7
+ puts "Tagging release #{CHANGES}"
8
+ end
9
+
10
+ desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
11
+ task :local_deploy => [:website_generate, :install_gem]
12
+
13
+ task :check_version do
14
+ unless ENV['VERSION']
15
+ puts 'Must pass a VERSION=x.y.z release version'
16
+ exit
17
+ end
18
+ unless ENV['VERSION'] == VERS
19
+ puts "Please update your version.rb to match the release version, currently #{VERS}"
20
+ exit
21
+ end
22
+ end
23
+
24
+ desc 'Install the package as a gem, without generating documentation(ri/rdoc)'
25
+ task :install_gem_no_doc => [:clean, :package] do
26
+ sh "#{'sudo ' unless Hoe::WINDOZE }gem install pkg/*.gem --no-rdoc --no-ri"
27
+ end
28
+
29
+ namespace :manifest do
30
+ desc 'Recreate Manifest.txt to include ALL files'
31
+ task :refresh do
32
+ `rake check_manifest | patch -p0 > Manifest.txt`
33
+ end
34
+ end
@@ -0,0 +1,7 @@
1
+ task :ruby_env do
2
+ RUBY_APP = if RUBY_PLATFORM =~ /java/
3
+ "jruby"
4
+ else
5
+ "ruby"
6
+ end unless defined? RUBY_APP
7
+ end
data/tasks/rspec.rake ADDED
@@ -0,0 +1,21 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ require 'spec'
6
+ end
7
+ begin
8
+ require 'spec/rake/spectask'
9
+ rescue LoadError
10
+ puts <<-EOS
11
+ To use rspec for testing you must install rspec gem:
12
+ gem install rspec
13
+ EOS
14
+ exit(0)
15
+ end
16
+
17
+ desc "Run the specs under spec/models"
18
+ Spec::Rake::SpecTask.new do |t|
19
+ t.spec_opts = ['--options', "spec/spec.opts"]
20
+ t.spec_files = FileList['spec/**/*_spec.rb']
21
+ end
@@ -0,0 +1,17 @@
1
+ desc 'Generate website files'
2
+ task :website_generate => :ruby_env do
3
+ (Dir['website/**/*.txt'] - Dir['website/version*.txt']).each do |txt|
4
+ sh %{ #{RUBY_APP} script/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
5
+ end
6
+ end
7
+
8
+ desc 'Upload website files to rubyforge'
9
+ task :website_upload do
10
+ host = "#{rubyforge_username}@rubyforge.org"
11
+ remote_dir = "/var/www/gforge-projects/#{PATH}/"
12
+ local_dir = 'website'
13
+ sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}}
14
+ end
15
+
16
+ desc 'Generate and upload website files'
17
+ task :website => [:website_generate, :website_upload, :publish_docs]
data/test/jruby_lm.rb ADDED
@@ -0,0 +1,13 @@
1
+ def f &block
2
+ re = Regexp.new( "^lib\\/(.*)\\.rb$" )
3
+ yield re
4
+ end
5
+
6
+ fn = "lib/foo.rb"
7
+
8
+ f { |re|
9
+ fn =~ re
10
+ raise "hell" if Regexp.last_match.to_s != "lib/foo.rb"
11
+ }
12
+
13
+ raise "hell" if Regexp.last_match.to_s != "lib/foo.rb"
data/test/test.rb ADDED
@@ -0,0 +1,19 @@
1
+ #!/bin/env ruby
2
+
3
+ $:.push File.join( File.dirname(__FILE__), "..", "lib" )
4
+
5
+ require 'dramatis/actor/name'
6
+ require 'thread'
7
+ require 'pp'
8
+
9
+ begin
10
+ Dramatis::Actor.new.foo
11
+ raise "hell"
12
+ rescue Dramatis::Deadlock => e
13
+ # puts "got expected #{e}"
14
+ end
15
+ # pp Thread.list
16
+ Dramatis::Runtime.current.quiesce
17
+ # pp Thread.list
18
+ raise "hell" if Thread.list.length > 1
19
+
data/test/test10.rb ADDED
@@ -0,0 +1,43 @@
1
+ #!/bin/env ruby
2
+
3
+ $:.push File.join( File.dirname(__FILE__), "..", "lib" )
4
+
5
+ require 'dramatis/actor/name'
6
+ require 'dramatis/runtime'
7
+
8
+ require 'pp'
9
+
10
+ a = Class.new do
11
+
12
+ include Dramatis::Actor
13
+
14
+ def a
15
+ p "b4b"
16
+ begin
17
+ actor.name.b
18
+ rescue Exception => e
19
+ p "got a #{e}"
20
+ raise e
21
+ end
22
+ p "a4b"
23
+ end
24
+
25
+ def b
26
+ p "bbb"
27
+ end
28
+
29
+ end
30
+
31
+ # non-call threaded
32
+ # This should deadlock nicely
33
+
34
+ begin
35
+ p "b4"
36
+ a.new.a
37
+ p "a4"
38
+ raise "should have deadlocked"
39
+ rescue Dramatis::Deadlock
40
+ p "got it. yeah!"
41
+ end
42
+
43
+ p "done"
data/test/test11.rb ADDED
@@ -0,0 +1,45 @@
1
+ #!/bin/env ruby
2
+
3
+ $:.push File.join( File.dirname(__FILE__), "..", "lib" )
4
+
5
+ require 'dramatis/actor/name'
6
+ require 'dramatis/actor'
7
+ require 'dramatis/runtime'
8
+
9
+ require 'pp'
10
+
11
+ # call threading test
12
+
13
+ a = Class.new do
14
+
15
+ include Dramatis::Actor
16
+
17
+ def initialize
18
+ actor.enable_call_threading
19
+ end
20
+
21
+ def a
22
+ actor.name.b
23
+ end
24
+
25
+ def b
26
+ end
27
+
28
+ def c
29
+ other = self.class.new
30
+ other.d actor.name
31
+ end
32
+
33
+ def d first
34
+ first.a
35
+ end
36
+
37
+ end
38
+
39
+ # recursion allowd
40
+
41
+ a.new.a
42
+
43
+ # co-recursion allowed
44
+
45
+ a.new.c
data/test/test12.rb ADDED
@@ -0,0 +1,60 @@
1
+ #!/bin/env ruby
2
+
3
+ $:.push File.join( File.dirname(__FILE__), "..", "lib" )
4
+
5
+ require 'dramatis/actor/name'
6
+ require 'dramatis/runtime'
7
+
8
+ require 'pp'
9
+
10
+ include Dramatis
11
+
12
+ a = Class.new do
13
+
14
+ include Dramatis::Actor
15
+
16
+ attr_reader :block_called
17
+
18
+ def initialize
19
+ actor.refuse :c
20
+ actor.always :block_called, true
21
+ end
22
+
23
+ def a other
24
+ block = lambda do |c|
25
+ # warn "block continuation #{c}"
26
+ @block_called = true
27
+ end
28
+ ( interface( other ).continue( &block ) ).b
29
+ other.c
30
+ end
31
+
32
+ def enable
33
+ actor.default :c
34
+ end
35
+
36
+ def b
37
+ end
38
+
39
+ def c
40
+ end
41
+
42
+ end
43
+
44
+ # non-call threaded
45
+
46
+ a1 = a.new
47
+ a2 = a.new
48
+ ( interface( a1 ).continue nil ).a a2
49
+
50
+ Dramatis::Runtime.current.quiesce
51
+
52
+ raise "hell" if a1.block_called
53
+
54
+ a2.enable
55
+
56
+ Dramatis::Runtime.current.quiesce
57
+
58
+ raise "hell" if !a1.block_called
59
+
60
+
data/test/test13.rb ADDED
@@ -0,0 +1,71 @@
1
+ #!/bin/env ruby
2
+
3
+ $:.push File.join( File.dirname(__FILE__), "..", "lib" )
4
+
5
+ require 'dramatis/actor/name'
6
+ require 'dramatis/runtime'
7
+
8
+ require 'pp'
9
+
10
+ include Dramatis
11
+
12
+ a = Class.new do
13
+
14
+ include Dramatis::Actor
15
+
16
+ attr_reader :block_called, :exception_raised
17
+
18
+ def initialize
19
+ actor.refuse :c
20
+ actor.always :block_called, true
21
+ actor.always :exception_raised, true
22
+ end
23
+
24
+ def a other
25
+ result = lambda do |r|
26
+ # warn "block continuation #{r}"
27
+ @block_called = true
28
+ end
29
+ except = lambda do |exception|
30
+ # warn "#{exception} (a good thing)"
31
+ raise "hell: #{exception.to_s}" if exception.to_s != "hell"
32
+ # warn "exception continuation"
33
+ @exception_raised = true
34
+ end
35
+ ( interface( other ).continue :exception => except, &result ).bb
36
+ ( interface( other ).continue :exception => except, &result ).b
37
+ other.c
38
+ end
39
+
40
+ def enable
41
+ actor.default :c
42
+ end
43
+
44
+ def bb
45
+ end
46
+
47
+ def b
48
+ raise "hell"
49
+ end
50
+
51
+ def c
52
+ end
53
+
54
+ end
55
+
56
+ # non-call threaded
57
+
58
+ a1 = a.new
59
+ a2 = a.new
60
+ ( interface( a1 ).continue nil ).a a2
61
+
62
+ Dramatis::Runtime.current.quiesce
63
+
64
+ raise "hell" if a1.block_called
65
+ raise "hell" if !a1.exception_raised
66
+
67
+ a2.enable
68
+
69
+ Dramatis::Runtime.current.quiesce
70
+
71
+ raise "hell" if !a1.block_called
data/test/test2.rb ADDED
@@ -0,0 +1,12 @@
1
+ #!/bin/env ruby
2
+
3
+ $:.push File.join( File.dirname(__FILE__), "..", "lib" )
4
+
5
+ require 'dramatis/actor/name'
6
+
7
+ include Dramatis
8
+
9
+ name = Dramatis::Actor.new
10
+
11
+ interface( name ).bind Object.new
12
+
data/test/test3.rb ADDED
@@ -0,0 +1,10 @@
1
+ #!/bin/env ruby
2
+
3
+ $:.push File.join( File.dirname(__FILE__), "..", "lib" )
4
+
5
+ require 'pp'
6
+ a = [ :a, :b, :c ]
7
+ pp a
8
+ pp a[1,-1]
9
+ b = [ :a ]
10
+ pp b[1,b.length]
data/test/test4.rb ADDED
@@ -0,0 +1,29 @@
1
+ #!/bin/env ruby
2
+
3
+ $:.push File.join( File.dirname(__FILE__), "..", "lib" )
4
+
5
+ require 'dramatis/actor/name'
6
+ require 'dramatis/runtime'
7
+
8
+ include Dramatis
9
+
10
+ require 'pp'
11
+
12
+ class Foo
13
+ include Dramatis::Actor
14
+ def foo arg
15
+ raise "hell" if arg != :bar
16
+ :foobar
17
+ end
18
+ end
19
+
20
+ actor = Foo.new
21
+
22
+ result = nil
23
+ retval = ( interface( actor ).continue {|value| result = value } ).foo :bar
24
+
25
+ raise "hell: [#{retval.inspect}]" if retval != nil
26
+
27
+ Dramatis::Runtime.current.quiesce
28
+
29
+ raise "hell: [#{result.inspect}]" if result != :foobar
data/test/test5.rb ADDED
@@ -0,0 +1,8 @@
1
+ #!/bin/env ruby
2
+ require 'pp'
3
+ def foo *args
4
+ pp args
5
+ end
6
+ args = [ :a, :b, :c ]
7
+ foo( *args )
8
+ p foo
data/test/test6.rb ADDED
@@ -0,0 +1,32 @@
1
+ #!/bin/env ruby
2
+
3
+ $:.push File.join( File.dirname(__FILE__), "..", "lib" )
4
+
5
+ require 'dramatis/actor/name'
6
+ require 'dramatis/runtime'
7
+
8
+ require 'pp'
9
+
10
+ cls = Class.new do
11
+ include Dramatis::Actor
12
+
13
+ def rpc other
14
+ warn "e"
15
+ other.foo
16
+ warn "f"
17
+ end
18
+
19
+ end
20
+
21
+ a = cls.new
22
+ b = cls.new
23
+
24
+ begin
25
+ a.rpc b
26
+ raise "hell"
27
+ rescue NoMethodError
28
+ rescue Exception => e
29
+ warn "!! #{e}"
30
+ raise e
31
+ end
32
+
data/test/test7.rb ADDED
@@ -0,0 +1,48 @@
1
+ #!/bin/env ruby
2
+
3
+ $:.push File.join( File.dirname(__FILE__), "..", "lib" )
4
+
5
+ require 'dramatis/actor/name'
6
+ require 'dramatis/runtime'
7
+
8
+ require 'pp'
9
+
10
+ include Dramatis
11
+
12
+ a = Class.new do
13
+
14
+ include Dramatis::Actor
15
+
16
+ def initialize
17
+ actor.refuse :fromB
18
+ end
19
+
20
+ end
21
+
22
+ b = Class.new do
23
+
24
+ include Dramatis::Actor
25
+
26
+ def initialize anA
27
+ @anA = anA
28
+ end
29
+
30
+ def startB
31
+ @anA.fromB
32
+ end
33
+
34
+ def shouldDeadlock
35
+ end
36
+
37
+ end
38
+
39
+ anA = a.new
40
+ aB = b.new anA
41
+
42
+ ( interface( aB ).continue nil ).startB
43
+
44
+ warn "b4"
45
+ # Dramatis::Runtime.current.quiesce
46
+ warn "a5"
47
+
48
+ warn "expect a final deadlock"