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.
- data/.gitignore +10 -0
- data/CHANGELOG +95 -0
- data/Gemfile +17 -0
- data/Manifest +8 -2
- data/README.markdown +59 -0
- data/Rakefile +137 -7
- data/ext/.gitignore +6 -0
- data/ext/Rakefile +51 -0
- data/ext/c_zookeeper.rb +212 -0
- data/ext/dbg.h +53 -0
- data/ext/depend +5 -0
- data/ext/extconf.rb +44 -15
- data/ext/generate_gvl_code.rb +316 -0
- data/ext/zkc-3.3.5.tar.gz +0 -0
- data/ext/zkrb_wrapper.c +731 -0
- data/ext/zkrb_wrapper.h +330 -0
- data/ext/zkrb_wrapper_compat.c +15 -0
- data/ext/zkrb_wrapper_compat.h +11 -0
- data/ext/zookeeper_base.rb +211 -0
- data/ext/zookeeper_c.c +268 -97
- data/ext/zookeeper_lib.c +157 -92
- data/ext/zookeeper_lib.h +12 -6
- data/java/zookeeper_base.rb +477 -0
- data/lib/zookeeper/acls.rb +10 -1
- data/lib/zookeeper/callbacks.rb +5 -3
- data/lib/zookeeper/common/queue_with_pipe.rb +78 -0
- data/lib/zookeeper/common.rb +174 -0
- data/lib/zookeeper/constants.rb +31 -28
- data/lib/zookeeper/em_client.rb +55 -0
- data/lib/zookeeper/exceptions.rb +10 -2
- data/lib/zookeeper/stat.rb +11 -2
- data/lib/zookeeper/version.rb +6 -0
- data/lib/zookeeper.rb +155 -122
- data/notes.txt +14 -0
- data/spec/c_zookeeper_spec.rb +50 -0
- data/spec/chrooted_connection_spec.rb +81 -0
- data/spec/default_watcher_spec.rb +41 -0
- data/spec/em_spec.rb +51 -0
- data/spec/log4j.properties +17 -0
- data/spec/shared/all_success_return_values.rb +10 -0
- data/spec/shared/connection_examples.rb +1018 -0
- data/spec/spec_helper.rb +119 -0
- data/spec/support/progress_formatter.rb +15 -0
- data/spec/zookeeper_spec.rb +24 -0
- data/zookeeper.gemspec +37 -25
- metadata +78 -34
- data/README +0 -42
- 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 | 
            -
             | 
| 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 | 
            -
               | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 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 = ( | 
| 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 | 
            -
             | 
| 40 | 
            -
               | 
| 41 | 
            -
             | 
| 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 | 
            -
             | 
| 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 | 
            -
                 | 
| 57 | 
            -
             | 
| 58 | 
            -
             | 
| 59 | 
            -
             | 
| 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 | 
            -
                 | 
| 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 | 
            -
               | 
| 74 | 
            -
             | 
| 75 | 
            -
               | 
| 76 | 
            -
             | 
| 77 | 
            -
             | 
| 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 | 
            -
               | 
| 83 | 
            -
             | 
| 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 | 
            -
               | 
| 99 | 
            -
               | 
| 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 | 
            -
             | 
| 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 =  | 
| 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 | 
            -
                   | 
| 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 | 
            -
                   | 
| 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 | 
            -
             | 
| 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 | 
            -
             | 
| 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: % | 
| 248 | 
            -
                fprintf(stderr,  "\t          mzxid: % | 
| 249 | 
            -
                fprintf(stderr,  "\t          ctime: % | 
| 250 | 
            -
                fprintf(stderr,  "\t          mtime: % | 
| 251 | 
            -
                fprintf(stderr,  "\t        version: %d\n" | 
| 252 | 
            -
                fprintf(stderr,  "\t       cversion: %d\n" | 
| 253 | 
            -
                fprintf(stderr,  "\t       aversion: %d\n" | 
| 254 | 
            -
                fprintf(stderr,  "\t ephemeralOwner: % | 
| 255 | 
            -
                fprintf(stderr,  "\t     dataLength: %d\n" | 
| 256 | 
            -
                fprintf(stderr,  "\t    numChildren: %d\n" | 
| 257 | 
            -
                fprintf(stderr,  "\t          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 = % | 
| 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 | 
            -
             | 
| 296 | 
            -
               | 
| 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 | 
            -
             | 
| 330 | 
            -
             | 
| 331 | 
            -
             | 
| 332 | 
            -
             | 
| 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 | 
            -
               | 
| 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 | 
            -
             | 
| 379 | 
            -
             | 
| 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 | 
            -
               | 
| 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 | 
            -
               | 
| 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 | 
            -
             | 
| 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 | 
            -
               | 
| 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  | 
| 92 | 
            -
              zkrb_event_t | 
| 93 | 
            -
              struct  | 
| 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 | 
            -
               | 
| 98 | 
            -
               | 
| 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);
         |