zookeeper 0.4.4 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
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);