zookeeper 0.4.4 → 0.9.3

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 (48) hide show
  1. data/.gitignore +10 -0
  2. data/CHANGELOG +95 -0
  3. data/Gemfile +17 -0
  4. data/Manifest +8 -2
  5. data/README.markdown +59 -0
  6. data/Rakefile +137 -7
  7. data/ext/.gitignore +6 -0
  8. data/ext/Rakefile +51 -0
  9. data/ext/c_zookeeper.rb +212 -0
  10. data/ext/dbg.h +53 -0
  11. data/ext/depend +5 -0
  12. data/ext/extconf.rb +44 -15
  13. data/ext/generate_gvl_code.rb +316 -0
  14. data/ext/zkc-3.3.5.tar.gz +0 -0
  15. data/ext/zkrb_wrapper.c +731 -0
  16. data/ext/zkrb_wrapper.h +330 -0
  17. data/ext/zkrb_wrapper_compat.c +15 -0
  18. data/ext/zkrb_wrapper_compat.h +11 -0
  19. data/ext/zookeeper_base.rb +211 -0
  20. data/ext/zookeeper_c.c +268 -97
  21. data/ext/zookeeper_lib.c +157 -92
  22. data/ext/zookeeper_lib.h +12 -6
  23. data/java/zookeeper_base.rb +477 -0
  24. data/lib/zookeeper/acls.rb +10 -1
  25. data/lib/zookeeper/callbacks.rb +5 -3
  26. data/lib/zookeeper/common/queue_with_pipe.rb +78 -0
  27. data/lib/zookeeper/common.rb +174 -0
  28. data/lib/zookeeper/constants.rb +31 -28
  29. data/lib/zookeeper/em_client.rb +55 -0
  30. data/lib/zookeeper/exceptions.rb +10 -2
  31. data/lib/zookeeper/stat.rb +11 -2
  32. data/lib/zookeeper/version.rb +6 -0
  33. data/lib/zookeeper.rb +155 -122
  34. data/notes.txt +14 -0
  35. data/spec/c_zookeeper_spec.rb +50 -0
  36. data/spec/chrooted_connection_spec.rb +81 -0
  37. data/spec/default_watcher_spec.rb +41 -0
  38. data/spec/em_spec.rb +51 -0
  39. data/spec/log4j.properties +17 -0
  40. data/spec/shared/all_success_return_values.rb +10 -0
  41. data/spec/shared/connection_examples.rb +1018 -0
  42. data/spec/spec_helper.rb +119 -0
  43. data/spec/support/progress_formatter.rb +15 -0
  44. data/spec/zookeeper_spec.rb +24 -0
  45. data/zookeeper.gemspec +37 -25
  46. metadata +78 -34
  47. data/README +0 -42
  48. data/ext/zkc-3.3.2.tar.gz +0 -0
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"
@@ -16,90 +27,136 @@ wickman@twitter.com
16
27
  #include <stdlib.h>
17
28
  #include <pthread.h>
18
29
  #include <unistd.h>
30
+ #include <inttypes.h>
31
+ #include "dbg.h"
19
32
 
20
33
  #define GET_SYM(str) ID2SYM(rb_intern(str))
21
34
 
22
35
  int ZKRBDebugging;
23
36
 
37
+ // XXX(slyphon): need to check these for error, but what to do if they fail?
24
38
  pthread_mutex_t zkrb_q_mutex = PTHREAD_MUTEX_INITIALIZER;
25
39
 
26
- /* push/pop is a misnomer, this is a queue */
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)
44
+
45
+
27
46
  void zkrb_enqueue(zkrb_queue_t *q, zkrb_event_t *elt) {
28
- pthread_mutex_lock(&zkrb_q_mutex);
29
- if (q == NULL || q->tail == NULL) {
30
- pthread_mutex_unlock(&zkrb_q_mutex);
31
- return;
32
- }
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
+
33
51
  q->tail->event = elt;
34
- q->tail->next = (struct zkrb_event_ll_t *) malloc(sizeof(struct zkrb_event_ll_t));
52
+ q->tail->next = (zkrb_event_ll_t *) malloc(sizeof(zkrb_event_ll_t));
35
53
  q->tail = q->tail->next;
36
54
  q->tail->event = NULL;
37
55
  q->tail->next = NULL;
38
56
  ssize_t ret = write(q->pipe_write, "0", 1); /* Wake up Ruby listener */
39
- pthread_mutex_unlock(&zkrb_q_mutex);
40
- if (ret == -1)
41
- rb_raise(rb_eRuntimeError, "write to pipe failed: %d", errno);
57
+
58
+ // XXX(slyphon): can't raise a ruby exception here as we may not be calling
59
+ // this from a ruby thread. Calling into the interpreter from a non-ruby
60
+ // thread is bad, mm'kay?
61
+
62
+ check(ret != -1, "write to queue (%p) pipe failed!\n", q);
63
+
64
+ error:
65
+ GLOBAL_MUTEX_UNLOCK("zkrb_enqueue");
42
66
  }
43
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
+ //
44
73
  zkrb_event_t * zkrb_peek(zkrb_queue_t *q) {
45
- pthread_mutex_lock(&zkrb_q_mutex);
46
74
  zkrb_event_t *event = NULL;
75
+
76
+ GLOBAL_MUTEX_LOCK("zkrb_peek");
77
+
47
78
  if (q != NULL && q->head != NULL && q->head->event != NULL) {
48
79
  event = q->head->event;
49
80
  }
50
- pthread_mutex_unlock(&zkrb_q_mutex);
81
+
82
+ GLOBAL_MUTEX_UNLOCK("zkrb_peek");
51
83
  return event;
52
84
  }
53
85
 
86
+ #define ZKRB_QUEUE_EMPTY(q) (q == NULL || q->head == NULL || q->head->event == NULL)
87
+
54
88
  zkrb_event_t* zkrb_dequeue(zkrb_queue_t *q, int need_lock) {
89
+ zkrb_event_t *rv = NULL;
90
+ zkrb_event_ll_t *old_root = NULL;
91
+
55
92
  if (need_lock)
56
- pthread_mutex_lock(&zkrb_q_mutex);
57
- if (q == NULL || q->head == NULL || q->head->event == NULL) {
58
- if (need_lock)
59
- pthread_mutex_unlock(&zkrb_q_mutex);
60
- return NULL;
61
- } else {
62
- struct zkrb_event_ll_t *old_root = q->head;
93
+ GLOBAL_MUTEX_LOCK("zkrb_dequeue");
94
+
95
+ if (!ZKRB_QUEUE_EMPTY(q)) {
96
+ old_root = q->head;
63
97
  q->head = q->head->next;
64
- zkrb_event_t *rv = old_root->event;
65
- free(old_root);
66
- if (need_lock)
67
- pthread_mutex_unlock(&zkrb_q_mutex);
68
- return rv;
98
+ rv = old_root->event;
69
99
  }
100
+
101
+ if (need_lock)
102
+ GLOBAL_MUTEX_UNLOCK("zkrb_dequeue");
103
+
104
+ free(old_root);
105
+ return rv;
70
106
  }
71
107
 
72
108
  void zkrb_signal(zkrb_queue_t *q) {
73
- pthread_mutex_lock(&zkrb_q_mutex);
74
- ssize_t ret = write(q->pipe_write, "0", 1); /* Wake up Ruby listener */
75
- pthread_mutex_unlock(&zkrb_q_mutex);
76
- if (ret == -1)
77
- rb_raise(rb_eRuntimeError, "write to pipe failed: %d", errno);
109
+ GLOBAL_MUTEX_LOCK("zkrb_signal");
110
+
111
+ if (!write(q->pipe_write, "0", 1)) /* Wake up Ruby listener */
112
+ log_err("zkrb_signal: write to pipe failed, could not wake");
113
+
114
+ GLOBAL_MUTEX_UNLOCK("zkrb_signal");
115
+ }
116
+
117
+ zkrb_event_ll_t *zkrb_event_ll_t_alloc(void) {
118
+ zkrb_event_ll_t *rv = malloc(sizeof(zkrb_event_ll_t));
119
+
120
+ if (!rv) return NULL;
121
+
122
+ rv->event = NULL;
123
+ rv->next = NULL;
124
+
125
+ return rv;
78
126
  }
79
127
 
80
128
  zkrb_queue_t *zkrb_queue_alloc(void) {
129
+ // some of the locking is a little coarse, but it
130
+ // eases the logic of releasing in case of error.
131
+ GLOBAL_MUTEX_LOCK("zkrb_queue_alloc");
132
+
81
133
  int pfd[2];
82
- if (pipe(pfd) == -1)
83
- rb_raise(rb_eRuntimeError, "create of pipe failed: %d", errno);
134
+ zkrb_queue_t *rq = NULL;
135
+
136
+ check(pipe(pfd) == 0, "creating the signal pipe failed");
137
+
138
+ rq = malloc(sizeof(zkrb_queue_t));
139
+ check_mem(rq);
140
+
141
+ rq->head = zkrb_event_ll_t_alloc();
142
+ check_mem(rq->head);
84
143
 
85
- pthread_mutex_lock(&zkrb_q_mutex);
86
- zkrb_queue_t *rq = malloc(sizeof(zkrb_queue_t));
87
- rq->head = malloc(sizeof(struct zkrb_event_ll_t));
88
- rq->head->event = NULL; rq->head->next = NULL;
89
144
  rq->tail = rq->head;
90
145
  rq->pipe_read = pfd[0];
91
146
  rq->pipe_write = pfd[1];
92
- pthread_mutex_unlock(&zkrb_q_mutex);
93
147
 
148
+ GLOBAL_MUTEX_UNLOCK("zkrb_queue_alloc");
94
149
  return rq;
150
+
151
+ error:
152
+ GLOBAL_MUTEX_UNLOCK("zkrb_queue_alloc");
153
+ free(rq);
154
+ return NULL;
95
155
  }
96
156
 
97
157
  void zkrb_queue_free(zkrb_queue_t *queue) {
98
- pthread_mutex_lock(&zkrb_q_mutex);
99
- if (queue == NULL) {
100
- pthread_mutex_unlock(&zkrb_q_mutex);
101
- return;
102
- }
158
+ GLOBAL_MUTEX_LOCK("zkrb_queue_free");
159
+ check_debug(queue != NULL, "zkrb_queue_free: queue was NULL");
103
160
 
104
161
  zkrb_event_t *elt;
105
162
  while ((elt = zkrb_dequeue(queue, 0)) != NULL) {
@@ -109,11 +166,13 @@ void zkrb_queue_free(zkrb_queue_t *queue) {
109
166
  close(queue->pipe_read);
110
167
  close(queue->pipe_write);
111
168
  free(queue);
112
- pthread_mutex_unlock(&zkrb_q_mutex);
169
+
170
+ error:
171
+ GLOBAL_MUTEX_UNLOCK("zkrb_queue_free");
113
172
  }
114
173
 
115
174
  zkrb_event_t *zkrb_event_alloc(void) {
116
- zkrb_event_t *rv = (zkrb_event_t *) malloc(sizeof(zkrb_event_t));
175
+ zkrb_event_t *rv = malloc(sizeof(zkrb_event_t));
117
176
  return rv;
118
177
  }
119
178
 
@@ -141,7 +200,8 @@ void zkrb_event_free(zkrb_event_t *event) {
141
200
  case ZKRB_STRINGS: {
142
201
  struct zkrb_strings_completion *strings_ctx = event->completion.strings_completion;
143
202
  int k;
144
- for (k = 0; k < strings_ctx->values->count; ++k) free(strings_ctx->values->data[k]);
203
+ if (strings_ctx->values)
204
+ for (k = 0; k < strings_ctx->values->count; ++k) free(strings_ctx->values->data[k]);
145
205
  free(strings_ctx->values);
146
206
  free(strings_ctx);
147
207
  break;
@@ -149,9 +209,12 @@ void zkrb_event_free(zkrb_event_t *event) {
149
209
  case ZKRB_STRINGS_STAT: {
150
210
  struct zkrb_strings_stat_completion *strings_stat_ctx = event->completion.strings_stat_completion;
151
211
  int k;
152
- for (k = 0; k < strings_stat_ctx->values->count; ++k) free(strings_stat_ctx->values->data[k]);
212
+ if (strings_stat_ctx->values)
213
+ for (k = 0; k < strings_stat_ctx->values->count; ++k) free(strings_stat_ctx->values->data[k]);
153
214
  free(strings_stat_ctx->values);
154
- free(strings_stat_ctx->stat);
215
+
216
+ if (strings_stat_ctx->stat)
217
+ free(strings_stat_ctx->stat);
155
218
  free(strings_stat_ctx);
156
219
  break;
157
220
  }
@@ -174,11 +237,10 @@ void zkrb_event_free(zkrb_event_t *event) {
174
237
  case ZKRB_VOID: {
175
238
  break;
176
239
  }
177
-
178
240
  default:
179
- #warning [wickman] TODO raise an exception?
180
- fprintf(stderr, "ERROR?\n");
241
+ log_err("unrecognized event in event_free!");
181
242
  }
243
+
182
244
  free(event);
183
245
  }
184
246
 
@@ -187,6 +249,11 @@ void zkrb_event_free(zkrb_event_t *event) {
187
249
  VALUE zkrb_event_to_ruby(zkrb_event_t *event) {
188
250
  VALUE hash = rb_hash_new();
189
251
 
252
+ if (!event) {
253
+ log_err("event was NULL in zkrb_event_to_ruby");
254
+ return hash;
255
+ }
256
+
190
257
  rb_hash_aset(hash, GET_SYM("req_id"), LL2NUM(event->req_id));
191
258
  if (event->type != ZKRB_WATCHER)
192
259
  rb_hash_aset(hash, GET_SYM("rc"), INT2FIX(event->rc));
@@ -200,33 +267,40 @@ VALUE zkrb_event_to_ruby(zkrb_event_t *event) {
200
267
  break;
201
268
  }
202
269
  case ZKRB_STAT: {
270
+ zkrb_debug("zkrb_event_to_ruby ZKRB_STAT\n");
203
271
  struct zkrb_stat_completion *stat_ctx = event->completion.stat_completion;
204
272
  rb_hash_aset(hash, GET_SYM("stat"), stat_ctx->stat ? zkrb_stat_to_rarray(stat_ctx->stat) : Qnil);
205
273
  break;
206
274
  }
207
275
  case ZKRB_STRING: {
276
+ zkrb_debug("zkrb_event_to_ruby ZKRB_STRING\n");
208
277
  struct zkrb_string_completion *string_ctx = event->completion.string_completion;
209
278
  rb_hash_aset(hash, GET_SYM("string"), string_ctx->value ? rb_str_new2(string_ctx->value) : Qnil);
210
279
  break;
211
280
  }
212
281
  case ZKRB_STRINGS: {
282
+ zkrb_debug("zkrb_event_to_ruby ZKRB_STRINGS\n");
213
283
  struct zkrb_strings_completion *strings_ctx = event->completion.strings_completion;
214
284
  rb_hash_aset(hash, GET_SYM("strings"), strings_ctx->values ? zkrb_string_vector_to_ruby(strings_ctx->values) : Qnil);
215
285
  break;
216
286
  }
217
287
  case ZKRB_STRINGS_STAT: {
288
+ zkrb_debug("zkrb_event_to_ruby ZKRB_STRINGS_STAT\n");
218
289
  struct zkrb_strings_stat_completion *strings_stat_ctx = event->completion.strings_stat_completion;
219
290
  rb_hash_aset(hash, GET_SYM("strings"), strings_stat_ctx->values ? zkrb_string_vector_to_ruby(strings_stat_ctx->values) : Qnil);
220
291
  rb_hash_aset(hash, GET_SYM("stat"), strings_stat_ctx->stat ? zkrb_stat_to_rarray(strings_stat_ctx->stat) : Qnil);
221
292
  break;
222
293
  }
223
294
  case ZKRB_ACL: {
295
+ zkrb_debug("zkrb_event_to_ruby ZKRB_ACL\n");
224
296
  struct zkrb_acl_completion *acl_ctx = event->completion.acl_completion;
225
297
  rb_hash_aset(hash, GET_SYM("acl"), acl_ctx->acl ? zkrb_acl_vector_to_ruby(acl_ctx->acl) : Qnil);
226
298
  rb_hash_aset(hash, GET_SYM("stat"), acl_ctx->stat ? zkrb_stat_to_rarray(acl_ctx->stat) : Qnil);
227
299
  break;
228
300
  }
229
301
  case ZKRB_WATCHER: {
302
+ zkrb_debug("zkrb_event_to_ruby ZKRB_WATCHER\n");
303
+ struct zkrb_acl_completion *acl_ctx = event->completion.acl_completion;
230
304
  struct zkrb_watcher_completion *watcher_ctx = event->completion.watcher_completion;
231
305
  rb_hash_aset(hash, GET_SYM("type"), INT2FIX(watcher_ctx->type));
232
306
  rb_hash_aset(hash, GET_SYM("state"), INT2FIX(watcher_ctx->state));
@@ -244,17 +318,17 @@ VALUE zkrb_event_to_ruby(zkrb_event_t *event) {
244
318
  void zkrb_print_stat(const struct Stat *s) {
245
319
  fprintf(stderr, "stat {\n");
246
320
  if (s != NULL) {
247
- fprintf(stderr, "\t czxid: %lld\n", s->czxid);
248
- fprintf(stderr, "\t mzxid: %lld\n", s->mzxid);
249
- fprintf(stderr, "\t ctime: %lld\n", s->ctime);
250
- fprintf(stderr, "\t mtime: %lld\n", s->mtime);
251
- fprintf(stderr, "\t version: %d\n" , s->version);
252
- fprintf(stderr, "\t cversion: %d\n" , s->cversion);
253
- fprintf(stderr, "\t aversion: %d\n" , s->aversion);
254
- fprintf(stderr, "\t ephemeralOwner: %lld\n", s->ephemeralOwner);
255
- fprintf(stderr, "\t dataLength: %d\n" , s->dataLength);
256
- fprintf(stderr, "\t numChildren: %d\n" , s->numChildren);
257
- fprintf(stderr, "\t pzxid: %lld\n", s->pzxid);
321
+ fprintf(stderr, "\t czxid: %"PRId64"\n", s->czxid); // PRId64 defined in inttypes.h
322
+ fprintf(stderr, "\t mzxid: %"PRId64"\n", s->mzxid);
323
+ fprintf(stderr, "\t ctime: %"PRId64"\n", s->ctime);
324
+ fprintf(stderr, "\t mtime: %"PRId64"\n", s->mtime);
325
+ fprintf(stderr, "\t version: %d\n", s->version);
326
+ fprintf(stderr, "\t cversion: %d\n", s->cversion);
327
+ fprintf(stderr, "\t aversion: %d\n", s->aversion);
328
+ fprintf(stderr, "\t ephemeralOwner: %"PRId64"\n", s->ephemeralOwner);
329
+ fprintf(stderr, "\t dataLength: %d\n", s->dataLength);
330
+ fprintf(stderr, "\t numChildren: %d\n", s->numChildren);
331
+ fprintf(stderr, "\t pzxid: %"PRId64"\n", s->pzxid);
258
332
  } else {
259
333
  fprintf(stderr, "\tNULL\n");
260
334
  }
@@ -263,14 +337,17 @@ void zkrb_print_stat(const struct Stat *s) {
263
337
 
264
338
  zkrb_calling_context *zkrb_calling_context_alloc(int64_t req_id, zkrb_queue_t *queue) {
265
339
  zkrb_calling_context *ctx = malloc(sizeof(zkrb_calling_context));
340
+ if (!ctx) return NULL;
341
+
266
342
  ctx->req_id = req_id;
267
343
  ctx->queue = queue;
344
+
268
345
  return ctx;
269
346
  }
270
347
 
271
348
  void zkrb_print_calling_context(zkrb_calling_context *ctx) {
272
349
  fprintf(stderr, "calling context (%p){\n", ctx);
273
- fprintf(stderr, "\treq_id = %lld\n", ctx->req_id);
350
+ fprintf(stderr, "\treq_id = %"PRId64"\n", ctx->req_id);
274
351
  fprintf(stderr, "\tqueue = %p\n", ctx->queue);
275
352
  fprintf(stderr, "}\n");
276
353
  }
@@ -292,12 +369,10 @@ void zkrb_print_calling_context(zkrb_calling_context *ctx) {
292
369
 
293
370
  void zkrb_state_callback(
294
371
  zhandle_t *zh, int type, int state, const char *path, void *calling_ctx) {
295
- /* logging */
296
- if (ZKRBDebugging) {
297
- fprintf(stderr, "ZOOKEEPER_C_STATE WATCHER "
372
+
373
+ zkrb_debug("ZOOKEEPER_C_STATE WATCHER "
298
374
  "type = %d, state = %d, path = %p, value = %s\n",
299
375
  type, state, (void *) path, path ? path : "NULL");
300
- }
301
376
 
302
377
  /* save callback context */
303
378
  struct zkrb_watcher_completion *wc = malloc(sizeof(struct zkrb_watcher_completion));
@@ -326,11 +401,10 @@ void zkrb_state_callback(
326
401
 
327
402
  void zkrb_data_callback(
328
403
  int rc, const char *value, int value_len, const struct Stat *stat, const void *calling_ctx) {
329
- if (ZKRBDebugging) {
330
- fprintf(stderr, "ZOOKEEPER_C_DATA WATCHER "
331
- "rc = %d (%s), value = %s, len = %d\n",
332
- rc, zerror(rc), value ? value : "NULL", value_len);
333
- }
404
+
405
+ zkrb_debug("ZOOKEEPER_C_DATA WATCHER "
406
+ "rc = %d (%s), value = %s, len = %d\n",
407
+ rc, zerror(rc), value ? value : "NULL", value_len);
334
408
 
335
409
  /* copy data completion */
336
410
  struct zkrb_data_completion *dc = malloc(sizeof(struct zkrb_data_completion));
@@ -356,10 +430,8 @@ void zkrb_data_callback(
356
430
 
357
431
  void zkrb_stat_callback(
358
432
  int rc, const struct Stat *stat, const void *calling_ctx) {
359
- if (ZKRBDebugging) {
360
- fprintf(stderr, "ZOOKEEPER_C_STAT WATCHER "
433
+ zkrb_debug("ZOOKEEPER_C_STAT WATCHER "
361
434
  "rc = %d (%s)\n", rc, zerror(rc));
362
- }
363
435
 
364
436
  struct zkrb_stat_completion *sc = malloc(sizeof(struct zkrb_stat_completion));
365
437
  sc->stat = NULL;
@@ -375,10 +447,9 @@ void zkrb_stat_callback(
375
447
 
376
448
  void zkrb_string_callback(
377
449
  int rc, const char *string, const void *calling_ctx) {
378
- if (ZKRBDebugging) {
379
- fprintf(stderr, "ZOOKEEPER_C_STRING WATCHER "
450
+
451
+ zkrb_debug("ZOOKEEPER_C_STRING WATCHER "
380
452
  "rc = %d (%s)\n", rc, zerror(rc));
381
- }
382
453
 
383
454
  struct zkrb_string_completion *sc = malloc(sizeof(struct zkrb_string_completion));
384
455
  sc->value = NULL;
@@ -395,10 +466,8 @@ void zkrb_string_callback(
395
466
 
396
467
  void zkrb_strings_callback(
397
468
  int rc, const struct String_vector *strings, const void *calling_ctx) {
398
- if (ZKRBDebugging) {
399
- fprintf(stderr, "ZOOKEEPER_C_STRINGS WATCHER "
469
+ zkrb_debug("ZOOKEEPER_C_STRINGS WATCHER "
400
470
  "rc = %d (%s), calling_ctx = %p\n", rc, zerror(rc), calling_ctx);
401
- }
402
471
 
403
472
  /* copy string vector */
404
473
  struct zkrb_strings_completion *sc = malloc(sizeof(struct zkrb_strings_completion));
@@ -414,14 +483,13 @@ void zkrb_strings_callback(
414
483
 
415
484
  void zkrb_strings_stat_callback(
416
485
  int rc, const struct String_vector *strings, const struct Stat *stat, const void *calling_ctx) {
417
- if (ZKRBDebugging) {
418
- fprintf(stderr, "ZOOKEEPER_C_STRINGS_STAT WATCHER "
486
+ zkrb_debug("ZOOKEEPER_C_STRINGS_STAT WATCHER "
419
487
  "rc = %d (%s), calling_ctx = %p\n", rc, zerror(rc), calling_ctx);
420
- }
421
488
 
422
489
  struct zkrb_strings_stat_completion *sc = malloc(sizeof(struct zkrb_strings_stat_completion));
423
490
  sc->stat = NULL;
424
491
  if (stat != NULL) { sc->stat = malloc(sizeof(struct Stat)); memcpy(sc->stat, stat, sizeof(struct Stat)); }
492
+
425
493
  sc->values = (strings != NULL) ? zkrb_clone_string_vector(strings) : NULL;
426
494
 
427
495
  ZKH_SETUP_EVENT(queue, event);
@@ -432,12 +500,9 @@ void zkrb_strings_stat_callback(
432
500
  zkrb_enqueue(queue, event);
433
501
  }
434
502
 
435
- void zkrb_void_callback(
436
- int rc, const void *calling_ctx) {
437
- if (ZKRBDebugging) {
438
- fprintf(stderr, "ZOOKEEPER_C_VOID WATCHER "
503
+ void zkrb_void_callback(int rc, const void *calling_ctx) {
504
+ zkrb_debug("ZOOKEEPER_C_VOID WATCHER "
439
505
  "rc = %d (%s)\n", rc, zerror(rc));
440
- }
441
506
 
442
507
  ZKH_SETUP_EVENT(queue, event);
443
508
  event->rc = rc;
@@ -449,10 +514,7 @@ void zkrb_void_callback(
449
514
 
450
515
  void zkrb_acl_callback(
451
516
  int rc, struct ACL_vector *acls, struct Stat *stat, const void *calling_ctx) {
452
- if (ZKRBDebugging) {
453
- fprintf(stderr, "ZOOKEEPER_C_ACL WATCHER "
454
- "rc = %d (%s)\n", rc, zerror(rc));
455
- }
517
+ zkrb_debug("ZOOKEEPER_C_ACL WATCHER rc = %d (%s)\n", rc, zerror(rc));
456
518
 
457
519
  struct zkrb_acl_completion *ac = malloc(sizeof(struct zkrb_acl_completion));
458
520
  ac->acl = NULL;
@@ -484,11 +546,12 @@ VALUE zkrb_acl_to_ruby(struct ACL *acl) {
484
546
  }
485
547
 
486
548
  #warning [wickman] TODO test zkrb_ruby_to_aclvector
549
+ #warning [slyphon] TODO size checking on acl_ary (cast to int)
487
550
  struct ACL_vector * zkrb_ruby_to_aclvector(VALUE acl_ary) {
488
551
  Check_Type(acl_ary, T_ARRAY);
489
552
 
490
553
  struct ACL_vector *v = malloc(sizeof(struct ACL_vector));
491
- allocate_ACL_vector(v, RARRAY_LEN(acl_ary));
554
+ allocate_ACL_vector(v, (int)RARRAY_LEN(acl_ary));
492
555
 
493
556
  int k;
494
557
  for (k = 0; k < v->count; ++k) {
@@ -610,3 +673,5 @@ struct String_vector * zkrb_clone_string_vector(const struct String_vector * src
610
673
  }
611
674
  return dst;
612
675
  }
676
+
677
+ // vim:sts=2:sw=2:et
data/ext/zookeeper_lib.h CHANGED
@@ -11,6 +11,11 @@
11
11
  #define ZK_FALSE 0
12
12
  #define ZKRB_GLOBAL_REQ -1
13
13
 
14
+ // (slyphon): this RC value does not conflict with any of the ZOO_ERRORS
15
+ // but need to find a better way of formalizing and defining this stuff
16
+ #define ZKRB_ERR_REQ -2
17
+ #define ZKRB_ERR_RC -15
18
+
14
19
  #ifndef RSTRING_LEN
15
20
  # define RSTRING_LEN(x) RSTRING(x)->len
16
21
  #endif
@@ -88,14 +93,16 @@ typedef struct {
88
93
  } completion;
89
94
  } zkrb_event_t;
90
95
 
91
- struct zkrb_event_ll_t {
92
- zkrb_event_t *event;
93
- struct zkrb_event_ll_t *next;
96
+ struct zkrb_event_ll {
97
+ zkrb_event_t *event;
98
+ struct zkrb_event_ll *next;
94
99
  };
95
100
 
101
+ typedef struct zkrb_event_ll zkrb_event_ll_t;
102
+
96
103
  typedef struct {
97
- struct zkrb_event_ll_t *head;
98
- struct zkrb_event_ll_t *tail;
104
+ zkrb_event_ll_t *head;
105
+ zkrb_event_ll_t *tail;
99
106
  int pipe_read;
100
107
  int pipe_write;
101
108
  } zkrb_queue_t;
@@ -105,7 +112,6 @@ void zkrb_queue_free(zkrb_queue_t *queue);
105
112
  zkrb_event_t * zkrb_event_alloc(void);
106
113
  void zkrb_event_free(zkrb_event_t *ptr);
107
114
 
108
- /* push/pop is a misnomer, this is a queue */
109
115
  void zkrb_enqueue(zkrb_queue_t *queue, zkrb_event_t *elt);
110
116
  zkrb_event_t * zkrb_peek(zkrb_queue_t *queue);
111
117
  zkrb_event_t * zkrb_dequeue(zkrb_queue_t *queue, int need_lock);