channels 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/lib/channel.rb +28 -6
  2. data/lib/channels.rb +1 -0
  3. metadata +2 -2
data/lib/channel.rb CHANGED
@@ -1,21 +1,36 @@
1
1
  class Channel
2
- attr_reader :thread
2
+ attr_reader :thread, :sender, :channel_out
3
3
 
4
4
  def initialize(*params, &block)
5
5
  @writing_thread = nil
6
6
  @reading_thread = nil
7
+ @channel_out = params.last || self
7
8
  @mutex = Mutex.new
9
+ @sender = nil
8
10
  @value = []
9
11
  @write_mutex = Mutex.new
10
- @thread = Thread.new do
11
- yield self
12
+ if block_given?
13
+ @thread = new_thread { yield self }
14
+ else
15
+ raise "Must implement run" unless respond_to?(:run)
16
+ @thread = new_thread { run }
12
17
  end
13
18
  end
14
19
 
15
- def write(value)
20
+ def new_thread(&block)
21
+ @thread = Thread.new {
22
+ begin
23
+ yield block
24
+ rescue => e
25
+ puts "error running thread #{e}"
26
+ end
27
+ }
28
+ end
29
+
30
+ def write(value, sender = nil)
16
31
  @write_mutex.synchronize {
17
32
  @mutex.synchronize {
18
- @value.push value
33
+ @value.push(:value => value, :sender => sender)
19
34
  if @reading_thread.nil?
20
35
  @writing_thread = Thread.current
21
36
  @mutex.sleep
@@ -29,6 +44,10 @@ class Channel
29
44
  }
30
45
  end
31
46
 
47
+ def write_out(value)
48
+ @channel_out.write(value, self)
49
+ end
50
+
32
51
  def read
33
52
  @mutex.synchronize {
34
53
  if @writing_thread
@@ -39,10 +58,13 @@ class Channel
39
58
  @mutex.sleep
40
59
  @reading_thread = nil
41
60
  end
42
- @value.shift
61
+ response = @value.shift
62
+ @sender = response[:sender]
63
+ response[:value]
43
64
  }
44
65
  end
45
66
 
67
+
46
68
  def kill
47
69
  @thread.kill
48
70
  end
data/lib/channels.rb CHANGED
@@ -1 +1,2 @@
1
1
  require 'channel'
2
+ require 'main_channel'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: channels
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2010-01-20 00:00:00.000000000 Z
12
+ date: 2012-01-20 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Go-lang style channels in ruby
15
15
  email: towski@gmail.com