static thread_data *check_thread_data_create(rmtContext *ctx) { thread_data *cdata; int setsize = 100; cdata = rmt_alloc(sizeof(*cdata)); if (cdata == NULL) { log_error("ERROR: out of memory"); return NULL; } thread_data_init(cdata); cdata->ctx = ctx; cdata->srgroup = source_group_create(ctx); if(cdata->srgroup == NULL){ log_error("Error: source redis group create failed."); goto error; } cdata->trgroup = target_group_create(ctx); if(cdata->trgroup == NULL){ log_error("Error: target redis group create failed."); goto error; } /* use the ctx->mbuf_size */ if (cdata->trgroup->mb != NULL) { mbuf_base_destroy(cdata->trgroup->mb); cdata->trgroup->mb = mbuf_base_create( ctx->mbuf_size, NULL); if (cdata->trgroup->mb == NULL) { log_error("ERROR: Create mbuf_base failed"); goto error; } } setsize += ((int)dictSize(cdata->srgroup->nodes)*(1 + 1) + (int)dictSize(cdata->trgroup->nodes)*1)*ctx->thread_count; cdata->loop = aeCreateEventLoop(setsize); if (cdata->loop == NULL) { log_error("ERROR: create event loop failed"); goto error; } cdata->data = rmt_zalloc(sizeof(check_data)); if (cdata->data == NULL) { log_error("Error: out of memory."); goto error; } return cdata; error: check_thread_data_destroy(cdata); return NULL; }
static inline ThreadData* thread_data_get() { VALUE obj = rb_thread_local_aref(rb_thread_current(), id_thread_data); if (obj != Qnil && TYPE(obj) == T_DATA) { return (ThreadData *) DATA_PTR(obj); } return thread_data_init(); }
static int try_init(machine_t *machine){ // {{{ try_userdata *userdata; if((userdata = machine->userdata = calloc(1, sizeof(try_userdata))) == NULL) return error("calloc failed"); userdata->request = 0; userdata->request_out = 0; userdata->return_to = HK(return_to); if((userdata->try_end = malloc(sizeof(machine_t))) == NULL){ free(userdata); return error("malloc failed"); } memcpy(userdata->try_end, &try_end_proto, sizeof(machine_t)); userdata->try_end->userdata = userdata; return thread_data_init( &userdata->thread_data, (f_thread_create)&try_threaddata_create, (f_thread_destroy)&try_threaddata_destroy, userdata); } // }}}
static inline ThreadData* thread_data_get(void) { ThreadData* td = pthread_getspecific(threadDataKey); return td != NULL ? td : thread_data_init(); }