dramatis 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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"