slyphon-zookeeper 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/ext/extconf.rb CHANGED
@@ -12,7 +12,7 @@ $CXXFLAGS = " -std=gnu++98 #{$CFLAGS}"
12
12
  $CPPFLAGS = $ARCH_FLAG = $DLDFLAGS = ""
13
13
 
14
14
  if ENV['DEBUG']
15
- puts "Setting debug flags."
15
+ $stderr.puts "*** Setting debug flags. ***"
16
16
  $CFLAGS << " -O0 -ggdb3 -DHAVE_DEBUG"
17
17
  $EXTRA_CONF = " --enable-debug"
18
18
  $CFLAGS.gsub!(/ -O[^0] /, ' ')
@@ -87,22 +87,24 @@ class ZookeeperBase < CZookeeper
87
87
  end
88
88
 
89
89
  if @dispatcher
90
- wake_event_loop! unless @_closed
90
+ unless @_closed
91
+ wake_event_loop!
92
+ end
91
93
  @dispatcher.join
92
94
  end
93
95
 
94
96
  @start_stop_mutex.synchronize do
95
97
  unless @_closed
96
98
  close_handle
97
-
98
- # this is set up in the C init method, but it's easier to
99
- # do the teardown here
100
- begin
101
- @selectable_io.close if @selectable_io
102
- rescue IOError
103
- end
104
99
  end
105
100
  end
101
+
102
+ # this is set up in the C init method, but it's easier to
103
+ # do the teardown here
104
+ begin
105
+ @selectable_io.close if @selectable_io
106
+ rescue IOError
107
+ end
106
108
  end
107
109
 
108
110
  def set_debug_level(int)
@@ -126,7 +128,19 @@ class ZookeeperBase < CZookeeper
126
128
  @start_stop_mutex.synchronize { false|@_running }
127
129
  end
128
130
 
131
+ def state
132
+ return ZOO_CLOSED_STATE if closed?
133
+ super
134
+ end
135
+
129
136
  protected
137
+ def barf_unless_running!
138
+ @start_stop_mutex.synchronize do
139
+ raise ShuttingDownException unless (@_running and not @_closed)
140
+ yield
141
+ end
142
+ end
143
+
130
144
  def setup_dispatch_thread!
131
145
  @dispatcher = Thread.new do
132
146
  while running?
data/ext/zookeeper_c.c CHANGED
@@ -472,6 +472,10 @@ static int is_running(VALUE self) {
472
472
  return RTEST(rval);
473
473
  }
474
474
 
475
+ static int is_closed(VALUE self) {
476
+ VALUE rval = rb_iv_get(self, "@_closed");
477
+ return RTEST(rval);
478
+ }
475
479
 
476
480
  /* slyphon: NEED TO PROTECT THIS AGAINST SHUTDOWN */
477
481
 
@@ -484,7 +488,7 @@ static VALUE method_get_next_event(VALUE self, VALUE blocking) {
484
488
  // we use the is_running(self) method here because it allows us to have a
485
489
  // ruby-land semaphore that we can also use in the java extension
486
490
  //
487
- if (!is_running(self)) {
491
+ if (is_closed(self) || !is_running(self)) {
488
492
  /* fprintf(stderr, "method_get_next_event: running is false, returning nil\n");*/
489
493
  return Qnil; // this case for shutdown
490
494
  }
@@ -517,7 +521,7 @@ static VALUE method_get_next_event(VALUE self, VALUE blocking) {
517
521
  rb_raise(rb_eRuntimeError, "read failed: %d", errno);
518
522
  }
519
523
  else if (ZKRBDebugging) {
520
- fprintf(stderr, "read %d bytes from the queue's pipe\n", bytes_read);
524
+ fprintf(stderr, "read %d bytes from the queue (%p)'s pipe\n", bytes_read, zk->queue);
521
525
  }
522
526
 
523
527
  continue;
data/ext/zookeeper_lib.c CHANGED
@@ -23,6 +23,16 @@ int ZKRBDebugging;
23
23
 
24
24
  pthread_mutex_t zkrb_q_mutex = PTHREAD_MUTEX_INITIALIZER;
25
25
 
26
+
27
+ /********************************************************************************
28
+ *
29
+ * NOTE: be *very careful* in these functions, calling *ANY* ruby interpreter
30
+ * function when you're not in an interpreter thread can hork ruby, trigger a
31
+ * [BUG], corrupt the stack, kill you dog, knock up your daughter, etc. etc.
32
+ *
33
+ *********************************************************************************
34
+ */
35
+
26
36
  /* push/pop is a misnomer, this is a queue */
27
37
  void zkrb_enqueue(zkrb_queue_t *q, zkrb_event_t *elt) {
28
38
  pthread_mutex_lock(&zkrb_q_mutex);
@@ -37,8 +47,19 @@ void zkrb_enqueue(zkrb_queue_t *q, zkrb_event_t *elt) {
37
47
  q->tail->next = NULL;
38
48
  ssize_t ret = write(q->pipe_write, "0", 1); /* Wake up Ruby listener */
39
49
  pthread_mutex_unlock(&zkrb_q_mutex);
40
- if (ret == -1)
41
- rb_raise(rb_eRuntimeError, "write to pipe failed: %d", errno);
50
+
51
+ // XXX(slyphon): can't raise a ruby exception here as we may not be calling
52
+ // this from a ruby thread. Calling into the interpreter from a non-ruby
53
+ // thread is bad, mm'kay?
54
+
55
+ if (ZKRBDebugging) {
56
+ if ((ret == -1)) {
57
+ fprintf(stderr, "WARNING: write to queue (%p) pipe failed!\n", q);
58
+ }
59
+ /* else {*/
60
+ /* fprintf(stderr, "successfully enqueued event on queue (%p)\n", q);*/
61
+ /* }*/
62
+ }
42
63
  }
43
64
 
44
65
  zkrb_event_t * zkrb_peek(zkrb_queue_t *q) {
@@ -79,6 +100,9 @@ void zkrb_signal(zkrb_queue_t *q) {
79
100
 
80
101
  zkrb_queue_t *zkrb_queue_alloc(void) {
81
102
  int pfd[2];
103
+
104
+ // XXX(slyphon): close-on-exec settings?
105
+
82
106
  if (pipe(pfd) == -1)
83
107
  rb_raise(rb_eRuntimeError, "create of pipe failed: %d", errno);
84
108
 
data/lib/zookeeper.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # Ruby wrapper for the Zookeeper C API
2
2
 
3
3
  require 'thread'
4
+ require 'monitor'
4
5
  require 'zookeeper/common'
5
6
  require 'zookeeper/constants'
6
7
  require 'zookeeper/callbacks'
@@ -56,6 +56,7 @@ module ZookeeperExceptions
56
56
  # these are Ruby client exceptions
57
57
  class ConnectionClosed < ZookeeperException; end
58
58
  class NotConnected < ZookeeperException; end
59
+ class ShuttingDownException < ZookeeperException; end
59
60
 
60
61
  def self.by_code(code)
61
62
  case code
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "slyphon-zookeeper"
6
- s.version = '0.2.0'
6
+ s.version = '0.2.1'
7
7
 
8
8
  s.authors = ["Phillip Pearson", "Eric Maland", "Evan Weaver", "Brian Wickman", "Neil Conway", "Jonathan D. Simms"]
9
9
  s.email = ["slyphon@gmail.com"]
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slyphon-zookeeper
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 21
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 0
10
- version: 0.2.0
9
+ - 1
10
+ version: 0.2.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Phillip Pearson
@@ -20,7 +20,7 @@ autorequire:
20
20
  bindir: bin
21
21
  cert_chain: []
22
22
 
23
- date: 2011-06-17 00:00:00 +00:00
23
+ date: 2011-06-27 00:00:00 +00:00
24
24
  default_executable:
25
25
  dependencies:
26
26
  - !ruby/object:Gem::Dependency