mailbox 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/README ADDED
@@ -0,0 +1,7 @@
1
+ == About Mailbox
2
+
3
+ Mailbox is a JRuby module that simplifies the creation of Actor-Model functions that are backed by JVM threads.
4
+ "Unobtrusive concurrency for a multicore world" - pgfarley
5
+
6
+ * jretlang gem is required to use mailbox
7
+
data/Rakefile ADDED
@@ -0,0 +1,27 @@
1
+ require "rubygems"
2
+ require "rake/testtask"
3
+ require "jeweler"
4
+
5
+ task :default => :test
6
+
7
+ Rake::TestTask.new do |t|
8
+ t.libs << "test"
9
+ t.test_files = FileList['test/**/*_test.rb']
10
+ t.verbose = true
11
+ end
12
+
13
+ Jeweler::Tasks.new do |gemspec|
14
+ gemspec.name = "mailbox"
15
+ gemspec.summary = "Mailbox is a JRuby module that simplifies concurrency and is backed by JVM threads."
16
+ gemspec.description = gemspec.summary
17
+ gemspec.email = "asher.friedman@gmail.com"
18
+ gemspec.homepage = "http://joelash.github.com/mailbox"
19
+ gemspec.authors = ["Joel Friedman", "Patrick Farley"]
20
+
21
+ gemspec.rubyforge_project = "mailbox"
22
+ end
23
+
24
+ Jeweler::RubyforgeTasks.new do |rubyforge|
25
+ rubyforge.doc_task = "rdoc"
26
+ end
27
+
data/VERSION.yml ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
data/lib/mailbox.rb ADDED
@@ -0,0 +1,78 @@
1
+ require 'rubygems'
2
+ require 'jretlang'
3
+
4
+ module Mailbox
5
+
6
+ def self.included(base)
7
+ base.extend(Mailbox::ClassMethods)
8
+ end
9
+
10
+ def register_channel(channel_name, channel)
11
+ channel_registry = self.class.__channel_registry__
12
+ channel_registry.each_pair { |key, value| __subscribe__(channel, key) if value == channel_name }
13
+ end
14
+
15
+ def __subscribe__(channel, method)
16
+ channel.subscribe_on_fiber(__fiber__) { |*args| self.send(method, *args) }
17
+ end
18
+
19
+ def __started_fiber__
20
+ fiber = JRL::Fiber.new
21
+ fiber.start
22
+ fiber
23
+ end
24
+
25
+ def __fiber__
26
+ @fiber ||= __started_fiber__
27
+ end
28
+
29
+ module ClassMethods
30
+
31
+ attr_accessor :__channel_registry__
32
+
33
+ def mailslot(params={})
34
+ @next_channel_name = params[:channel]
35
+ @mailslot = true
36
+ end
37
+
38
+ def method_added(method_name, &block)
39
+ return if @adding_mailbox_to_method == method_name
40
+
41
+ unless @mailslot == true
42
+ private method_name
43
+ return
44
+ end
45
+
46
+ @mailslot = false
47
+
48
+ if @next_channel_name.nil?
49
+ __setup_on_fiber__(method_name)
50
+ else
51
+ __setup_on_channel__(method_name)
52
+ end
53
+
54
+ end
55
+
56
+ def __setup_on_fiber__(method_name)
57
+ alias_method :"__#{method_name}__", method_name
58
+
59
+ @adding_mailbox_to_method = method_name
60
+
61
+ define_method( method_name, lambda do |*args|
62
+ __fiber__.execute { self.send(:"__#{method_name}__", *args ) }
63
+ end )
64
+
65
+ @adding_mailbox_to_method = nil
66
+ end
67
+
68
+ def __setup_on_channel__(method_name)
69
+ private method_name
70
+ @__channel_registry__ ||= {}
71
+ __channel_registry__[method_name] = @next_channel_name
72
+ @next_channel_name = nil
73
+ end
74
+
75
+ end
76
+
77
+ end
78
+
data/mailbox.gemspec ADDED
@@ -0,0 +1,45 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{mailbox}
8
+ s.version = "0.0.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Joel Friedman", "Patrick Farley"]
12
+ s.date = %q{2009-10-13}
13
+ s.description = %q{Mailbox is a JRuby module that simplifies concurrency and is backed by JVM threads.}
14
+ s.email = %q{asher.friedman@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "README"
17
+ ]
18
+ s.files = [
19
+ "README",
20
+ "Rakefile",
21
+ "VERSION.yml",
22
+ "lib/mailbox.rb",
23
+ "mailbox.gemspec",
24
+ "test/mailbox_test.rb"
25
+ ]
26
+ s.homepage = %q{http://joelash.github.com/mailbox}
27
+ s.rdoc_options = ["--charset=UTF-8"]
28
+ s.require_paths = ["lib"]
29
+ s.rubyforge_project = %q{mailbox}
30
+ s.rubygems_version = %q{1.3.3}
31
+ s.summary = %q{Mailbox is a JRuby module that simplifies concurrency and is backed by JVM threads.}
32
+ s.test_files = [
33
+ "test/mailbox_test.rb"
34
+ ]
35
+
36
+ if s.respond_to? :specification_version then
37
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
38
+ s.specification_version = 3
39
+
40
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
41
+ else
42
+ end
43
+ else
44
+ end
45
+ end
@@ -0,0 +1,75 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+
4
+ require File.dirname(__FILE__) + "/../lib/mailbox"
5
+
6
+ module Latches
7
+ include_package 'java.util.concurrent'
8
+ end
9
+
10
+ class MailboxTest < Test::Unit::TestCase
11
+
12
+ def test_mailslot_causes_execution_on_separate_thread
13
+
14
+ klass = Class.new do
15
+ include Mailbox
16
+
17
+ mailslot
18
+ def test_method(latch, thread_ids)
19
+ thread_ids << Thread.current.object_id
20
+ latch.count_down
21
+ end
22
+ end
23
+
24
+ thread_ids = []
25
+ latch = Latches::CountDownLatch.new( 1 )
26
+ klass.new.test_method(latch, thread_ids)
27
+
28
+ assert( latch.await( 1, Latches::TimeUnit::SECONDS ), "Timed out" )
29
+ assert_not_equal Thread.current.object_id, thread_ids.first
30
+
31
+ end
32
+
33
+ def test_non_mailslot_methods_become_private
34
+
35
+ klass = Class.new do
36
+ include Mailbox
37
+
38
+ def bar
39
+ end
40
+ end
41
+
42
+ exception = assert_raise NoMethodError do
43
+ klass.new.bar
44
+ end
45
+
46
+ assert_match /private method `bar'/, exception.message
47
+ end
48
+
49
+ def test_should_supports_channels
50
+
51
+ klass = Class.new do
52
+ include Mailbox
53
+
54
+ def initialize(channel)
55
+ register_channel :test_channel, channel
56
+ end
57
+
58
+ mailslot :channel => :test_channel
59
+ def test_method(latch)
60
+ latch.count_down
61
+ end
62
+ end
63
+
64
+ thread_ids = []
65
+ latch = Latches::CountDownLatch.new 1
66
+ a_channel = JRL::Channel.new
67
+
68
+ klass.new(a_channel)
69
+ a_channel.publish latch
70
+
71
+ assert latch.await( 1, Latches::TimeUnit::SECONDS ), "Timed out"
72
+
73
+ end
74
+
75
+ end
metadata ADDED
@@ -0,0 +1,63 @@
1
+ --- !ruby/object:Gem::Specification
2
+ required_ruby_version: !ruby/object:Gem::Requirement
3
+ requirements:
4
+ - - '>='
5
+ - !ruby/object:Gem::Version
6
+ version: "0"
7
+ version:
8
+ email: asher.friedman@gmail.com
9
+ cert_chain: []
10
+
11
+ summary: Mailbox is a JRuby module that simplifies concurrency and is backed by JVM
12
+ threads.
13
+ post_install_message:
14
+ extra_rdoc_files:
15
+ - README
16
+ homepage: http://joelash.github.com/mailbox
17
+ signing_key:
18
+ name: mailbox
19
+ rdoc_options:
20
+ - --charset=UTF-8
21
+ rubyforge_project: mailbox
22
+ autorequire:
23
+ licenses: []
24
+
25
+ executables: []
26
+
27
+ description: Mailbox is a JRuby module that simplifies concurrency and is backed by
28
+ JVM threads.
29
+ specification_version: 3
30
+ default_executable:
31
+ files:
32
+ - README
33
+ - Rakefile
34
+ - VERSION.yml
35
+ - lib/mailbox.rb
36
+ - mailbox.gemspec
37
+ - test/mailbox_test.rb
38
+ required_rubygems_version: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - '>='
41
+ - !ruby/object:Gem::Version
42
+ version: "0"
43
+ version:
44
+ extensions: []
45
+
46
+ rubygems_version: 1.3.3
47
+ requirements: []
48
+
49
+ authors:
50
+ - Joel Friedman
51
+ - Patrick Farley
52
+ date: 2009-10-13 05:00:00 +00:00
53
+ platform: ruby
54
+ test_files:
55
+ - test/mailbox_test.rb
56
+ version: !ruby/object:Gem::Version
57
+ version: 0.0.0
58
+ require_paths:
59
+ - lib
60
+ dependencies: []
61
+
62
+ bindir: bin
63
+ has_rdoc: true