slyphon-zookeeper 0.3.0-java → 0.8.0-java

Sign up to get free protection for your applications and to get access to all the features.
data/ext/zookeeper_c.c CHANGED
@@ -2,6 +2,7 @@
2
2
  * Phillip Pearson <pp@myelin.co.nz>
3
3
  * Eric Maland <eric@twitter.com>
4
4
  * Brian Wickman <wickman@twitter.com>
5
+ * Jonathan D. Simms <slyphon@gmail.com>
5
6
  *
6
7
  * This fork is a 90% rewrite of the original. It takes a more evented
7
8
  * approach to isolate the ZK state machine from the ruby interpreter via an
@@ -108,6 +109,7 @@ static int zkrb_dup(int orig) {
108
109
  return fd;
109
110
  }
110
111
 
112
+ #if 0
111
113
  static VALUE create_selectable_io(zkrb_queue_t *q) {
112
114
  // rb_cIO is the ruby IO class?
113
115
 
@@ -127,8 +129,11 @@ static VALUE create_selectable_io(zkrb_queue_t *q) {
127
129
 
128
130
  return reader;
129
131
  }
132
+ #endif
130
133
 
131
- static VALUE method_init(int argc, VALUE* argv, VALUE self) {
134
+ #define session_timeout_msec(self) rb_iv_get(self, "@_session_timeout_msec")
135
+
136
+ static VALUE method_zkrb_init(int argc, VALUE* argv, VALUE self) {
132
137
  VALUE hostPort;
133
138
  VALUE options;
134
139
 
@@ -157,6 +162,9 @@ static VALUE method_init(int argc, VALUE* argv, VALUE self) {
157
162
  data = Data_Make_Struct(Zookeeper, struct zkrb_instance_data, 0, free_zkrb_instance_data, zk_local_ctx);
158
163
  zk_local_ctx->queue = zkrb_queue_alloc();
159
164
 
165
+ if (zk_local_ctx->queue == NULL)
166
+ rb_raise(rb_eRuntimeError, "could not allocate zkrb queue!");
167
+
160
168
  zoo_deterministic_conn_order(0);
161
169
 
162
170
  zkrb_calling_context *ctx =
@@ -168,7 +176,7 @@ static VALUE method_init(int argc, VALUE* argv, VALUE self) {
168
176
  zookeeper_init(
169
177
  RSTRING_PTR(hostPort),
170
178
  zkrb_state_callback,
171
- 10000,
179
+ session_timeout_msec(self),
172
180
  &zk_local_ctx->myid,
173
181
  ctx,
174
182
  0);
@@ -179,10 +187,9 @@ static VALUE method_init(int argc, VALUE* argv, VALUE self) {
179
187
  }
180
188
 
181
189
  rb_iv_set(self, "@_data", data);
182
- rb_iv_set(self, "@selectable_io", create_selectable_io(zk_local_ctx->queue));
183
- rb_iv_set(self, "@_running", Qtrue);
184
-
190
+ rb_funcall(self, rb_intern("zkc_set_running_and_notify!"), 0);
185
191
 
192
+ error:
186
193
  return Qnil;
187
194
  }
188
195
 
@@ -282,6 +289,19 @@ static VALUE method_exists(VALUE self, VALUE reqid, VALUE path, VALUE async, VAL
282
289
  return output;
283
290
  }
284
291
 
292
+ // this method is *only* called asynchronously
293
+ static VALUE method_sync(VALUE self, VALUE reqid, VALUE path) {
294
+ VALUE async = Qtrue;
295
+ VALUE watch = Qfalse;
296
+ int rc;
297
+
298
+ STANDARD_PREAMBLE(self, zk, reqid, path, async, watch, data_ctx, watch_ctx, call_type);
299
+
300
+ rc = zoo_async(zk->zh, RSTRING_PTR(path), zkrb_string_callback, data_ctx);
301
+
302
+ return INT2FIX(rc);
303
+ }
304
+
285
305
  static VALUE method_create(VALUE self, VALUE reqid, VALUE path, VALUE data, VALUE async, VALUE acls, VALUE flags) {
286
306
  VALUE watch = Qfalse;
287
307
  STANDARD_PREAMBLE(self, zk, reqid, path, async, watch, data_ctx, watch_ctx, call_type);
@@ -477,46 +497,39 @@ static VALUE method_get_acl(VALUE self, VALUE reqid, VALUE path, VALUE async) {
477
497
  return output;
478
498
  }
479
499
 
480
- static int is_running(VALUE self) {
481
- VALUE rval = rb_iv_get(self, "@_running");
482
- return RTEST(rval);
483
- }
484
-
485
- static int is_closed(VALUE self) {
486
- VALUE rval = rb_iv_get(self, "@_closed");
487
- return RTEST(rval);
488
- }
489
-
490
- /* slyphon: NEED TO PROTECT THIS AGAINST SHUTDOWN */
500
+ #define is_running(self) RTEST(rb_iv_get(self, "@_running"))
501
+ #define is_closed(self) RTEST(rb_iv_get(self, "@_closed"))
502
+ #define is_shutting_down(self) RTEST(rb_iv_get(self, "@_shutting_down"))
491
503
 
492
504
  static VALUE method_get_next_event(VALUE self, VALUE blocking) {
505
+ // dbg.h
506
+ check_debug(!is_closed(self), "we are closed, not trying to get event");
507
+
493
508
  char buf[64];
494
509
  FETCH_DATA_PTR(self, zk);
495
510
 
496
511
  for (;;) {
497
-
498
- // we use the is_running(self) method here because it allows us to have a
499
- // ruby-land semaphore that we can also use in the java extension
500
- //
501
- if (is_closed(self) || !is_running(self)) {
502
- zkrb_debug_inst(self, "is_closed(self): %d, is_running(self): %d, method_get_next_event is exiting loop", is_closed(self), is_running(self));
503
- return Qnil; // this case for shutdown
504
- }
512
+ check_debug(!is_closed(self), "we're closed in the middle of method_get_next_event, bailing");
505
513
 
506
514
  zkrb_event_t *event = zkrb_dequeue(zk->queue, 1);
507
515
 
508
516
  /* Wait for an event using rb_thread_select() on the queue's pipe */
509
517
  if (event == NULL) {
510
518
  if (NIL_P(blocking) || (blocking == Qfalse)) {
511
- return Qnil; // no event for us
519
+ goto error;
512
520
  }
513
521
  else {
522
+ // if we're shutting down, don't enter this section, we don't want to block
523
+ check_debug(!is_shutting_down(self), "method_get_next_event, we're shutting down, don't enter blocking section");
524
+
514
525
  int fd = zk->queue->pipe_read;
515
526
  ssize_t bytes_read = 0;
516
527
 
517
528
  // wait for an fd to become readable, opposite of rb_thread_fd_writable
518
529
  rb_thread_wait_fd(fd);
519
530
 
531
+ // clear all bytes here, we'll catch all the events on subsequent calls
532
+ // (until we run out of events)
520
533
  bytes_read = read(fd, buf, sizeof(buf));
521
534
 
522
535
  if (bytes_read == -1) {
@@ -533,6 +546,9 @@ static VALUE method_get_next_event(VALUE self, VALUE blocking) {
533
546
  zkrb_event_free(event);
534
547
  return hash;
535
548
  }
549
+
550
+ error:
551
+ return Qnil;
536
552
  }
537
553
 
538
554
  static VALUE method_has_events(VALUE self) {
@@ -554,15 +570,6 @@ static VALUE method_wake_event_loop_bang(VALUE self) {
554
570
  return Qnil;
555
571
  };
556
572
 
557
- // static VALUE method_signal_pending_close(VALUE self) {
558
- // FETCH_DATA_PTR(self, zk);
559
- //
560
- // zk->pending_close = 1;
561
- // zkrb_signal(zk->queue);
562
- //
563
- // return Qnil;
564
- // }
565
-
566
573
  static VALUE method_close_handle(VALUE self) {
567
574
  FETCH_DATA_PTR(self, zk);
568
575
 
@@ -597,7 +604,7 @@ static VALUE method_is_unrecoverable(VALUE self) {
597
604
  return is_unrecoverable(zk->zh) == ZINVALIDSTATE ? Qtrue : Qfalse;
598
605
  }
599
606
 
600
- static VALUE method_state(VALUE self) {
607
+ static VALUE method_zkrb_state(VALUE self) {
601
608
  FETCH_DATA_PTR(self, zk);
602
609
  return INT2NUM(zoo_state(zk->zh));
603
610
  }
@@ -630,7 +637,7 @@ static VALUE method_client_id(VALUE self) {
630
637
  return client_id_obj;
631
638
  }
632
639
 
633
- static VALUE klass_method_set_debug_level(VALUE klass, VALUE level) {
640
+ static VALUE klass_method_zkrb_set_debug_level(VALUE klass, VALUE level) {
634
641
  Check_Type(level, T_FIXNUM);
635
642
  ZKRBDebugging = (FIX2INT(level) == ZOO_LOG_LEVEL_DEBUG);
636
643
  zoo_set_debug_level(FIX2INT(level));
@@ -647,7 +654,8 @@ static void zkrb_define_methods(void) {
647
654
  #define DEFINE_CLASS_METHOD(method, args) { \
648
655
  rb_define_singleton_method(Zookeeper, #method, method_ ## method, args); }
649
656
 
650
- DEFINE_METHOD(init, -1);
657
+ // the number after the method name should be actual arity of C function - 1
658
+ DEFINE_METHOD(zkrb_init, -1);
651
659
  DEFINE_METHOD(get_children, 4);
652
660
  DEFINE_METHOD(exists, 4);
653
661
  DEFINE_METHOD(create, 6);
@@ -661,10 +669,11 @@ static void zkrb_define_methods(void) {
661
669
  DEFINE_METHOD(deterministic_conn_order, 1);
662
670
  DEFINE_METHOD(is_unrecoverable, 0);
663
671
  DEFINE_METHOD(recv_timeout, 1);
664
- DEFINE_METHOD(state, 0);
672
+ DEFINE_METHOD(zkrb_state, 0);
673
+ DEFINE_METHOD(sync, 2);
674
+
665
675
  // TODO
666
676
  // DEFINE_METHOD(add_auth, 3);
667
- // DEFINE_METHOD(async, 1);
668
677
 
669
678
  // methods for the ruby-side event manager
670
679
  DEFINE_METHOD(get_next_event, 1);
@@ -673,11 +682,11 @@ static void zkrb_define_methods(void) {
673
682
  // Make these class methods?
674
683
  DEFINE_METHOD(zerror, 1);
675
684
 
676
- rb_define_singleton_method(Zookeeper, "set_debug_level", klass_method_set_debug_level, 1);
685
+ rb_define_singleton_method(Zookeeper, "set_zkrb_debug_level", klass_method_zkrb_set_debug_level, 1);
677
686
 
678
687
  rb_attr(Zookeeper, rb_intern("selectable_io"), 1, 0, Qtrue);
679
-
680
688
  rb_define_method(Zookeeper, "wake_event_loop!", method_wake_event_loop_bang, 0);
689
+
681
690
  }
682
691
 
683
692
  // class CZookeeper::ClientId
@@ -695,8 +704,10 @@ static VALUE zkrb_client_id_method_initialize(VALUE self) {
695
704
  return Qnil;
696
705
  }
697
706
 
707
+
698
708
  void Init_zookeeper_c() {
699
709
  ZKRBDebugging = 0;
710
+
700
711
  /* initialize Zookeeper class */
701
712
  Zookeeper = rb_define_class("CZookeeper", rb_cObject);
702
713
  zkrb_define_methods();
data/ext/zookeeper_lib.c CHANGED
@@ -6,6 +6,17 @@ This file contains three sets of helpers:
6
6
  - functions for translating between Ruby and C versions of ZK datatypes
7
7
 
8
8
  wickman@twitter.com
9
+
10
+ *********************************************************************************
11
+ *
12
+ * NOTE: be *very careful* in these functions, calling *ANY* ruby interpreter
13
+ * function when you're not in an interpreter thread can hork ruby, trigger a
14
+ * [BUG], corrupt the stack, kill your dog, knock up your daughter, etc. etc.
15
+ *
16
+ *********************************************************************************
17
+
18
+ slyphon@gmail.com
19
+
9
20
  */
10
21
 
11
22
  #include "ruby.h"
@@ -23,104 +34,117 @@ wickman@twitter.com
23
34
 
24
35
  int ZKRBDebugging;
25
36
 
37
+ // XXX(slyphon): need to check these for error, but what to do if they fail?
26
38
  pthread_mutex_t zkrb_q_mutex = PTHREAD_MUTEX_INITIALIZER;
27
39
 
40
+ #define LOG_PTHREAD_ERR(A, M, ...) if (A) { log_err(M, ##__VA_ARGS__); errno=0; }
41
+
42
+ #define GLOBAL_MUTEX_LOCK(F) LOG_PTHREAD_ERR(pthread_mutex_lock(&zkrb_q_mutex), F)
43
+ #define GLOBAL_MUTEX_UNLOCK(F) LOG_PTHREAD_ERR(pthread_mutex_unlock(&zkrb_q_mutex), F)
28
44
 
29
- /********************************************************************************
30
- *
31
- * NOTE: be *very careful* in these functions, calling *ANY* ruby interpreter
32
- * function when you're not in an interpreter thread can hork ruby, trigger a
33
- * [BUG], corrupt the stack, kill your dog, knock up your daughter, etc. etc.
34
- *
35
- *********************************************************************************
36
- */
37
45
 
38
- /* push/pop is a misnomer, this is a queue */
39
46
  void zkrb_enqueue(zkrb_queue_t *q, zkrb_event_t *elt) {
40
- pthread_mutex_lock(&zkrb_q_mutex);
41
- if (q == NULL || q->tail == NULL) {
42
- pthread_mutex_unlock(&zkrb_q_mutex);
43
- return;
44
- }
47
+ GLOBAL_MUTEX_LOCK("zkrb_enqueue");
48
+
49
+ check_debug(q != NULL && q->tail != NULL, "zkrb_enqueue: queue ptr or tail was NULL\n");
50
+
45
51
  q->tail->event = elt;
46
52
  q->tail->next = (struct zkrb_event_ll_t *) malloc(sizeof(struct zkrb_event_ll_t));
47
53
  q->tail = q->tail->next;
48
54
  q->tail->event = NULL;
49
55
  q->tail->next = NULL;
50
56
  ssize_t ret = write(q->pipe_write, "0", 1); /* Wake up Ruby listener */
51
- pthread_mutex_unlock(&zkrb_q_mutex);
52
57
 
53
58
  // XXX(slyphon): can't raise a ruby exception here as we may not be calling
54
59
  // this from a ruby thread. Calling into the interpreter from a non-ruby
55
60
  // thread is bad, mm'kay?
56
61
 
57
- if ((ret == -1)) {
58
- fprintf(stderr, "WARNING: write to queue (%p) pipe failed!\n", q);
59
- }
62
+ check(ret != -1, "write to queue (%p) pipe failed!\n", q);
63
+
64
+ error:
65
+ GLOBAL_MUTEX_UNLOCK("zkrb_enqueue");
60
66
  }
61
67
 
68
+ // NOTE: the zkrb_event_t* returned *is* the same pointer that's part of the
69
+ // queue, the only place this is used is in method_has_events, and it is simply
70
+ // tested for null-ness. it's probably better to make the null-test here and
71
+ // not return the pointer
72
+ //
62
73
  zkrb_event_t * zkrb_peek(zkrb_queue_t *q) {
63
- pthread_mutex_lock(&zkrb_q_mutex);
64
74
  zkrb_event_t *event = NULL;
75
+
76
+ GLOBAL_MUTEX_LOCK("zkrb_peek");
77
+
65
78
  if (q != NULL && q->head != NULL && q->head->event != NULL) {
66
79
  event = q->head->event;
67
80
  }
68
- pthread_mutex_unlock(&zkrb_q_mutex);
81
+
82
+ GLOBAL_MUTEX_UNLOCK("zkrb_peek");
69
83
  return event;
70
84
  }
71
85
 
86
+ #define ZKRB_QUEUE_EMPTY(q) (q == NULL || q->head == NULL || q->head->event == NULL)
87
+
72
88
  zkrb_event_t* zkrb_dequeue(zkrb_queue_t *q, int need_lock) {
89
+ zkrb_event_t *rv = NULL;
90
+
73
91
  if (need_lock)
74
- pthread_mutex_lock(&zkrb_q_mutex);
75
- if (q == NULL || q->head == NULL || q->head->event == NULL) {
76
- if (need_lock)
77
- pthread_mutex_unlock(&zkrb_q_mutex);
78
- return NULL;
79
- } else {
92
+ GLOBAL_MUTEX_LOCK("zkrb_dequeue");
93
+
94
+ if (!ZKRB_QUEUE_EMPTY(q)) {
80
95
  struct zkrb_event_ll_t *old_root = q->head;
81
96
  q->head = q->head->next;
82
- zkrb_event_t *rv = old_root->event;
97
+ rv = old_root->event;
83
98
  free(old_root);
84
- if (need_lock)
85
- pthread_mutex_unlock(&zkrb_q_mutex);
86
- return rv;
87
99
  }
100
+
101
+ if (need_lock)
102
+ GLOBAL_MUTEX_UNLOCK("zkrb_dequeue");
103
+
104
+ return rv;
88
105
  }
89
106
 
90
107
  void zkrb_signal(zkrb_queue_t *q) {
91
- pthread_mutex_lock(&zkrb_q_mutex);
92
- ssize_t ret = write(q->pipe_write, "0", 1); /* Wake up Ruby listener */
93
- pthread_mutex_unlock(&zkrb_q_mutex);
94
- if (ret == -1)
95
- log_err("write to pipe failed");
108
+ GLOBAL_MUTEX_LOCK("zkrb_signal");
109
+
110
+ if (!write(q->pipe_write, "0", 1)) /* Wake up Ruby listener */
111
+ log_err("zkrb_signal: write to pipe failed, could not wake");
112
+
113
+ GLOBAL_MUTEX_UNLOCK("zkrb_signal");
96
114
  }
97
115
 
98
116
  zkrb_queue_t *zkrb_queue_alloc(void) {
99
- int pfd[2];
117
+ // some of the locking is a little coarse, but it
118
+ // eases the logic of releasing in case of error.
119
+ GLOBAL_MUTEX_LOCK("zkrb_queue_alloc");
100
120
 
101
- // XXX(slyphon): close-on-exec settings?
121
+ int pfd[2];
122
+ zkrb_queue_t *rq = NULL;
123
+
124
+ check(pipe(pfd) == 0, "creating the signal pipe failed");
102
125
 
103
- if (pipe(pfd) == -1)
104
- rb_raise(rb_eRuntimeError, "create of pipe failed: %d", errno);
126
+ rq = malloc(sizeof(zkrb_queue_t));
127
+ check_mem(rq);
105
128
 
106
- pthread_mutex_lock(&zkrb_q_mutex);
107
- zkrb_queue_t *rq = malloc(sizeof(zkrb_queue_t));
108
129
  rq->head = malloc(sizeof(struct zkrb_event_ll_t));
130
+ check_mem(rq->head);
131
+
109
132
  rq->head->event = NULL; rq->head->next = NULL;
110
133
  rq->tail = rq->head;
111
134
  rq->pipe_read = pfd[0];
112
135
  rq->pipe_write = pfd[1];
113
- pthread_mutex_unlock(&zkrb_q_mutex);
114
136
 
137
+ GLOBAL_MUTEX_UNLOCK("zkrb_queue_alloc");
115
138
  return rq;
139
+
140
+ error:
141
+ GLOBAL_MUTEX_UNLOCK("zkrb_queue_alloc");
142
+ return NULL;
116
143
  }
117
144
 
118
145
  void zkrb_queue_free(zkrb_queue_t *queue) {
119
- pthread_mutex_lock(&zkrb_q_mutex);
120
- if (queue == NULL) {
121
- pthread_mutex_unlock(&zkrb_q_mutex);
122
- return;
123
- }
146
+ GLOBAL_MUTEX_LOCK("zkrb_queue_free");
147
+ check_debug(queue != NULL, "zkrb_queue_free: queue was NULL");
124
148
 
125
149
  zkrb_event_t *elt;
126
150
  while ((elt = zkrb_dequeue(queue, 0)) != NULL) {
@@ -130,7 +154,9 @@ void zkrb_queue_free(zkrb_queue_t *queue) {
130
154
  close(queue->pipe_read);
131
155
  close(queue->pipe_write);
132
156
  free(queue);
133
- pthread_mutex_unlock(&zkrb_q_mutex);
157
+
158
+ error:
159
+ GLOBAL_MUTEX_UNLOCK("zkrb_queue_free");
134
160
  }
135
161
 
136
162
  zkrb_event_t *zkrb_event_alloc(void) {
@@ -324,12 +350,10 @@ void zkrb_print_calling_context(zkrb_calling_context *ctx) {
324
350
 
325
351
  void zkrb_state_callback(
326
352
  zhandle_t *zh, int type, int state, const char *path, void *calling_ctx) {
327
- /* logging */
328
- if (ZKRBDebugging) {
329
- fprintf(stderr, "ZOOKEEPER_C_STATE WATCHER "
353
+
354
+ zkrb_debug("ZOOKEEPER_C_STATE WATCHER "
330
355
  "type = %d, state = %d, path = %p, value = %s\n",
331
356
  type, state, (void *) path, path ? path : "NULL");
332
- }
333
357
 
334
358
  /* save callback context */
335
359
  struct zkrb_watcher_completion *wc = malloc(sizeof(struct zkrb_watcher_completion));
@@ -358,11 +382,10 @@ void zkrb_state_callback(
358
382
 
359
383
  void zkrb_data_callback(
360
384
  int rc, const char *value, int value_len, const struct Stat *stat, const void *calling_ctx) {
361
- if (ZKRBDebugging) {
362
- fprintf(stderr, "ZOOKEEPER_C_DATA WATCHER "
363
- "rc = %d (%s), value = %s, len = %d\n",
364
- rc, zerror(rc), value ? value : "NULL", value_len);
365
- }
385
+
386
+ zkrb_debug("ZOOKEEPER_C_DATA WATCHER "
387
+ "rc = %d (%s), value = %s, len = %d\n",
388
+ rc, zerror(rc), value ? value : "NULL", value_len);
366
389
 
367
390
  /* copy data completion */
368
391
  struct zkrb_data_completion *dc = malloc(sizeof(struct zkrb_data_completion));
@@ -388,10 +411,8 @@ void zkrb_data_callback(
388
411
 
389
412
  void zkrb_stat_callback(
390
413
  int rc, const struct Stat *stat, const void *calling_ctx) {
391
- if (ZKRBDebugging) {
392
- fprintf(stderr, "ZOOKEEPER_C_STAT WATCHER "
414
+ zkrb_debug("ZOOKEEPER_C_STAT WATCHER "
393
415
  "rc = %d (%s)\n", rc, zerror(rc));
394
- }
395
416
 
396
417
  struct zkrb_stat_completion *sc = malloc(sizeof(struct zkrb_stat_completion));
397
418
  sc->stat = NULL;
@@ -407,10 +428,9 @@ void zkrb_stat_callback(
407
428
 
408
429
  void zkrb_string_callback(
409
430
  int rc, const char *string, const void *calling_ctx) {
410
- if (ZKRBDebugging) {
411
- fprintf(stderr, "ZOOKEEPER_C_STRING WATCHER "
431
+
432
+ zkrb_debug("ZOOKEEPER_C_STRING WATCHER "
412
433
  "rc = %d (%s)\n", rc, zerror(rc));
413
- }
414
434
 
415
435
  struct zkrb_string_completion *sc = malloc(sizeof(struct zkrb_string_completion));
416
436
  sc->value = NULL;
@@ -427,10 +447,8 @@ void zkrb_string_callback(
427
447
 
428
448
  void zkrb_strings_callback(
429
449
  int rc, const struct String_vector *strings, const void *calling_ctx) {
430
- if (ZKRBDebugging) {
431
- fprintf(stderr, "ZOOKEEPER_C_STRINGS WATCHER "
450
+ zkrb_debug("ZOOKEEPER_C_STRINGS WATCHER "
432
451
  "rc = %d (%s), calling_ctx = %p\n", rc, zerror(rc), calling_ctx);
433
- }
434
452
 
435
453
  /* copy string vector */
436
454
  struct zkrb_strings_completion *sc = malloc(sizeof(struct zkrb_strings_completion));
@@ -446,10 +464,8 @@ void zkrb_strings_callback(
446
464
 
447
465
  void zkrb_strings_stat_callback(
448
466
  int rc, const struct String_vector *strings, const struct Stat *stat, const void *calling_ctx) {
449
- if (ZKRBDebugging) {
450
- fprintf(stderr, "ZOOKEEPER_C_STRINGS_STAT WATCHER "
467
+ zkrb_debug("ZOOKEEPER_C_STRINGS_STAT WATCHER "
451
468
  "rc = %d (%s), calling_ctx = %p\n", rc, zerror(rc), calling_ctx);
452
- }
453
469
 
454
470
  struct zkrb_strings_stat_completion *sc = malloc(sizeof(struct zkrb_strings_stat_completion));
455
471
  sc->stat = NULL;
@@ -465,12 +481,9 @@ void zkrb_strings_stat_callback(
465
481
  zkrb_enqueue(queue, event);
466
482
  }
467
483
 
468
- void zkrb_void_callback(
469
- int rc, const void *calling_ctx) {
470
- if (ZKRBDebugging) {
471
- fprintf(stderr, "ZOOKEEPER_C_VOID WATCHER "
484
+ void zkrb_void_callback(int rc, const void *calling_ctx) {
485
+ zkrb_debug("ZOOKEEPER_C_VOID WATCHER "
472
486
  "rc = %d (%s)\n", rc, zerror(rc));
473
- }
474
487
 
475
488
  ZKH_SETUP_EVENT(queue, event);
476
489
  event->rc = rc;
@@ -482,10 +495,7 @@ void zkrb_void_callback(
482
495
 
483
496
  void zkrb_acl_callback(
484
497
  int rc, struct ACL_vector *acls, struct Stat *stat, const void *calling_ctx) {
485
- if (ZKRBDebugging) {
486
- fprintf(stderr, "ZOOKEEPER_C_ACL WATCHER "
487
- "rc = %d (%s)\n", rc, zerror(rc));
488
- }
498
+ zkrb_debug("ZOOKEEPER_C_ACL WATCHER rc = %d (%s)\n", rc, zerror(rc));
489
499
 
490
500
  struct zkrb_acl_completion *ac = malloc(sizeof(struct zkrb_acl_completion));
491
501
  ac->acl = NULL;
@@ -644,3 +654,5 @@ struct String_vector * zkrb_clone_string_vector(const struct String_vector * src
644
654
  }
645
655
  return dst;
646
656
  }
657
+
658
+ // vim:sts=2:sw=2:et
data/ext/zookeeper_lib.h CHANGED
@@ -105,7 +105,6 @@ void zkrb_queue_free(zkrb_queue_t *queue);
105
105
  zkrb_event_t * zkrb_event_alloc(void);
106
106
  void zkrb_event_free(zkrb_event_t *ptr);
107
107
 
108
- /* push/pop is a misnomer, this is a queue */
109
108
  void zkrb_enqueue(zkrb_queue_t *queue, zkrb_event_t *elt);
110
109
  zkrb_event_t * zkrb_peek(zkrb_queue_t *queue);
111
110
  zkrb_event_t * zkrb_dequeue(zkrb_queue_t *queue, int need_lock);