예제 #1
0
static void
rwsched_instance_free_int(rwsched_instance_t *instance)
{
  // Validate input paraemters
  RW_CF_TYPE_VALIDATE(instance, rwsched_instance_ptr_t);
  //FIXME
  if (!g_atomic_int_dec_and_test(&instance->ref_cnt)) {
    return;
  }
#if 1
  RW_FREE_TYPE(instance->default_rwqueue, rwsched_dispatch_queue_t);
  RW_FREE_TYPE(instance->main_rwqueue, rwsched_dispatch_queue_t);
  long i;
  for (i=0; i<RWSCHED_DISPATCH_QUEUE_GLOBAL_CT; i++) {
    instance->global_rwqueue[i].rwq->header.libdispatch_object._dq = NULL;
    RW_FREE_TYPE(instance->global_rwqueue[i].rwq, rwsched_dispatch_queue_t);
    instance->global_rwqueue[i].rwq = NULL;
  }

  ck_pr_dec_32(&g_rwsched_instance_count);
  if (instance->rwlog_instance) {
    rwlog_close(instance->rwlog_instance, FALSE);
  }
  //NO-FREE
  RW_CF_TYPE_FREE(instance, rwsched_instance_ptr_t);
#endif
}
예제 #2
0
void rwmsg_destination_destroy(rwmsg_destination_t *dt) {
    RW_ASSERT_TYPE(dt, rwmsg_destination_t);
    if (!dt->refct) {
        rwmsg_endpoint_t *ep = dt->ep;
        RW_ASSERT(ep);

        //?? TBD rwmsg_endpoint_del_srvchan_method_binding(ep, sc, ...);

        RWMSG_EP_LOCK(ep);
        RW_DL_REMOVE(&ep->track.destinations, dt, trackelem);
        RWMSG_EP_UNLOCK(ep);
        ck_pr_dec_32(&ep->stat.objects.destinations);

        if (dt->localep) {
            rwmsg_endpoint_release(dt->localep);
            dt->localep = NULL;
        }

        if (dt->defstream.localsc) {
            _RWMSG_CH_DEBUG_(&dt->defstream.localsc->ch, "--");
            rwmsg_srvchan_release(dt->defstream.localsc);
            dt->defstream.localsc = NULL;
        }

        RW_FREE_TYPE(dt, rwmsg_destination_t);
        dt = NULL;
    }
    return;
}
예제 #3
0
void rwdts_appconf_register_deinit(rwdts_member_registration_t *reg) {
  if (reg->appconf) {
    if (reg->appconf->cb.prepare_dtor) {
      reg->appconf->cb.prepare_dtor(reg->appconf->cb.prepare_ud);
    }
    RW_ASSERT_TYPE(reg->appconf, rwdts_appconf_reg_t);
    RW_ASSERT_TYPE(reg->appconf->ac, rwdts_appconf_t);
    RW_FREE_TYPE(reg->appconf, rwdts_appconf_reg_t);
    reg->appconf = NULL;
  }
}
예제 #4
0
static void rwdtsperf_dts_mgmt_xact_deinit(rwdts_appconf_t *ac,
                                           rwdts_xact_t *xact, 
                                           void *ud,
                                           void *scratch_in)
{
  rwdtsperf_config_scratch_t *scratch = (rwdtsperf_config_scratch_t *)scratch_in;
  int i = 0;
  
  for (; i < scratch->count; i++) {
    protobuf_c_message_free_unpacked(NULL, scratch->config[i]);
    scratch->config[i] = NULL;
  }
  RW_ASSERT(scratch);
  RW_FREE_TYPE(scratch, rwdtsperf_config_scratch_t);
}
예제 #5
0
void rwmsg_method_destroy(rwmsg_endpoint_t *ep,
			  rwmsg_method_t *meth) {
  if (!meth->refct) {
    if (meth->pathidx) {
      rwmsg_bool_t prval = rwmsg_endpoint_path_del(ep, meth->pathidx);
      RW_ASSERT(prval);
    }

    RW_ASSERT(meth->sig);
    RW_ASSERT(meth->sig->refct > 0);
    rwmsg_signature_release(ep, meth->sig);

    RW_FREE_TYPE(meth, rwmsg_method_t);
    ck_pr_dec_32(&ep->stat.objects.methods);
  }
}
예제 #6
0
static void rwdts_appconf_xact_deinit(rwdts_group_t *grp,
                                      rwdts_xact_t *xact,
                                      void *ctx,
                                      void *scratch) {
  rwdts_appconf_xact_t *appx = (rwdts_appconf_xact_t *)scratch;
  RW_ASSERT_TYPE(appx, rwdts_appconf_xact_t);
  rwdts_appconf_t *ac = appx->ac;
  int k;

  if (ac->cb.xact_deinit) {
    if (ac->cb.xact_deinit_dtor) {
      ac->cb.xact_deinit_gi(ac,
                            xact,
                            ac->cb.ctx,
                            appx->scratch_gi);
      if (appx->scratch_gi) {
        g_value_unset(appx->scratch_gi);
        appx->scratch_gi = NULL;
      }
    } else {
      ac->cb.xact_deinit(ac,
                         xact,
                         ac->cb.ctx,
                         appx->scratch);
      appx->scratch = NULL;
    }
  } else {
    if (ac->cb.xact_init_dtor) {
      if (appx->scratch_gi) {
        g_value_unset(appx->scratch_gi);
        appx->scratch_gi = NULL;
      }
    } else {
      RW_ASSERT(!appx->scratch);
    }
  }
  for(k=0;k<appx->errs_ct;free(appx->errs[k].str),k++);
  free(appx->errs);
  appx->errs = NULL;
  appx->errs_ct = 0;
  RW_FREE_TYPE(appx, rwdts_appconf_xact_t);
  appx = NULL;
}
예제 #7
0
void rwdts_appconf_group_destroy(rwdts_appconf_t *ac) {
  RW_ASSERT_TYPE(ac, rwdts_appconf_t);
  if (ac->cb.xact_init_dtor) {
    ac->cb.xact_init_dtor(ac->cb.ctx);
  }
  if (ac->cb.xact_deinit_dtor) {
    ac->cb.xact_deinit_dtor(NULL);
  }

  if (ac->regn_timer) {
    rwsched_dispatch_source_cancel(ac->apih->tasklet,
                                   ac->regn_timer);
    rwsched_dispatch_release(ac->apih->tasklet,
                             ac->regn_timer);
    ac->regn_timer = NULL;
  }

  memset(&ac->cb, 0, sizeof(ac->cb));
  rwdts_group_destroy(ac->group);
  RW_FREE_TYPE(ac, rwdts_appconf_t);
}
예제 #8
0
static void
rwsched_dispatch_intercept(void *ud)
{
  rwsched_dispatch_what_ptr_t what = ud;

  // Validate input paraemters
  RW_ASSERT_TYPE(what, rwsched_dispatch_what_ptr_t);
  RW_ASSERT(what->closure.handler);
  rwsched_tasklet_ptr_t sched_tasklet = what->tasklet_info;
  RW_CF_TYPE_VALIDATE(sched_tasklet, rwsched_tasklet_ptr_t);

  g_rwresource_track_handle = sched_tasklet->rwresource_track_handle;
  g_tasklet_info = sched_tasklet;

  (what->closure.handler)(what->closure.context);

  RW_FREE_TYPE(what, rwsched_dispatch_what_ptr_t);
  rwsched_tasklet_unref(sched_tasklet);

  g_tasklet_info = 0;
  g_rwresource_track_handle = 0;
}
예제 #9
0
static void
rwsched_tasklet_free_int(rwsched_tasklet_t *sched_tasklet)
{
  RW_CF_TYPE_VALIDATE(sched_tasklet, rwsched_tasklet_ptr_t);
  rwsched_instance_ptr_t instance = sched_tasklet->instance;
  RW_CF_TYPE_VALIDATE(instance, rwsched_instance_ptr_t);

  if (!g_atomic_int_dec_and_test(&sched_tasklet->ref_cnt)) {
    return;
  }

  int i;
  for (i = 0 ; i < RWSCHED_MAX_SIGNALS; i++) {
    if (sched_tasklet->signal_dtor[i]) {
      sched_tasklet->signal_dtor[i](sched_tasklet->signal_dtor_ud[i]);
    }
    sched_tasklet->signal_dtor[i]= NULL;
    sched_tasklet->signal_dtor_ud[i]= NULL;
  }

  for (i = 1 ; i < instance->tasklet_array->len ; i++) {
    if (g_array_index(instance->tasklet_array, rwsched_tasklet_ptr_t, i) == sched_tasklet) {
      g_array_remove_index (instance->tasklet_array, i);
      break;
    }
  }

  rwsched_CFRunLoopTimerRef rw_timer;
  while ((rw_timer = g_array_index(sched_tasklet->cftimer_array, rwsched_CFRunLoopTimerRef, 1)) != NULL) {
    RW_CF_TYPE_VALIDATE(rw_timer, rwsched_CFRunLoopTimerRef);
    rwsched_tasklet_CFRunLoopTimerInvalidate(sched_tasklet, rw_timer);
    g_array_remove_index (sched_tasklet->cftimer_array, 1);
  }
  g_array_free(sched_tasklet->cftimer_array, TRUE);

  rwsched_CFSocketRef rw_socket;
  while ((rw_socket = g_array_index(sched_tasklet->cfsocket_array, rwsched_CFSocketRef, 1)) != NULL) {
    RW_CF_TYPE_VALIDATE(rw_socket, rwsched_CFSocketRef);
    rwsched_tasklet_CFSocketRelease(sched_tasklet, rw_socket);
    //g_array_remove_index (sched_tasklet->cfsocket_array, 1);
  }
  g_array_free(sched_tasklet->cfsocket_array, TRUE);

  rwsched_CFRunLoopSourceRef rw_source;
  while ((rw_source = g_array_index(sched_tasklet->cfsource_array, rwsched_CFRunLoopSourceRef, 1)) != NULL) {
    RW_CF_TYPE_VALIDATE(rw_source, rwsched_CFRunLoopSourceRef);
    rwsched_tasklet_CFSocketReleaseRunLoopSource(sched_tasklet, rw_source);
    g_array_remove_index (sched_tasklet->cfsource_array, 1);
  }
  g_array_free(sched_tasklet->cfsource_array, TRUE);

  rwsched_dispatch_what_ptr_t what;
  while ((what = g_array_index(sched_tasklet->dispatch_what_array, rwsched_dispatch_what_ptr_t, 1)) != NULL) {
    RW_FREE_TYPE(what, rwsched_dispatch_what_ptr_t);
    g_array_remove_index (sched_tasklet->dispatch_what_array, 1);
  }
  g_array_free(sched_tasklet->dispatch_what_array, TRUE);

  ck_pr_dec_32(&g_rwsched_tasklet_count);
  //NO-FREE
  RW_CF_TYPE_FREE(sched_tasklet, rwsched_tasklet_ptr_t);
  rwsched_instance_unref(instance);
}
예제 #10
0
// This will be supported after sharding support
//
//LCOV_EXCL_START
rw_status_t
rwdts_kv_update_db_xact_precommit(rwdts_member_data_object_t *mobj, RWDtsQueryAction action)
{
  rwdts_api_t *apih;
  rwdts_member_registration_t *reg;
  ProtobufCMessage *msg;
  uint8_t *payload;
  size_t  payload_len;
  rw_status_t status;
  rwdts_kv_table_handle_t *kv_tab_handle = NULL;
  rwdts_shard_info_detail_t *shard_key1;
  uint8_t *local_ks_binpath = NULL;
  size_t local_ks_binpath_len;
  rw_keyspec_path_t *local_keyspec = NULL;
  /* Build the shard-key to get the shard-id and DB number */
  char str[15] = "banana";

  reg = mobj->reg;
  RW_ASSERT_TYPE(reg, rwdts_member_registration_t);
  apih = reg->apih;
  RW_ASSERT(apih);
  RW_ASSERT(action != RWDTS_QUERY_INVALID);
  msg = mobj->msg;

  shard_key1 = RW_MALLOC0_TYPE(sizeof(rwdts_shard_info_detail_t), rwdts_shard_info_detail_t);
  shard_key1->shard_key_detail.u.byte_key.k.key = (void *)RW_MALLOC(sizeof(str));
  memcpy((char *)shard_key1->shard_key_detail.u.byte_key.k.key, &str[0], strlen(str));
  shard_key1->shard_key_detail.u.byte_key.k.key_len = strlen(str);

  /* Get the shard-id and DB number */
  rwdts_shard_db_num_info_t *shard_db_num_info = RW_MALLOC0(sizeof(rwdts_shard_db_num_info_t));

  status = rw_keyspec_path_create_dup(reg->keyspec, &apih->ksi , &local_keyspec);
  RW_ASSERT(status == RW_STATUS_SUCCESS);

  status = rw_keyspec_path_get_binpath(local_keyspec, &apih->ksi , (const uint8_t **)&local_ks_binpath, &local_ks_binpath_len);
  RW_ASSERT(status == RW_STATUS_SUCCESS);
  rwdts_member_get_shard_db_info_keyspec(apih, local_keyspec,
                                         shard_key1,
                                         shard_db_num_info);
  if (shard_db_num_info->shard_db_num_cnt > 0) {
    mobj->db_number = shard_db_num_info->shard_db_num[0].db_number;
    mobj->shard_id = shard_db_num_info->shard_db_num[0].shard_chunk_id;
    /* Search for KV table handle */
    status = RW_SKLIST_LOOKUP_BY_KEY(&(apih->kv_table_handle_list), &mobj->db_number,
                                     (void *)&kv_tab_handle);
    if (!kv_tab_handle) {
      kv_tab_handle = rwdts_kv_light_register_table(apih->handle, mobj->db_number);
      RW_ASSERT(kv_tab_handle);
      status = RW_SKLIST_INSERT(&(apih->kv_table_handle_list), kv_tab_handle);
      RW_ASSERT(status == RW_STATUS_SUCCESS);
    }
    mobj->kv_tab_handle = kv_tab_handle;
    RWDTS_CREATE_SHARD(reg->reg_id, apih->client_path, apih->router_path);
    /* Perform KV xact operation */
    if (apih->db_up && ((action == RWDTS_QUERY_CREATE) ||
        (RWDTS_QUERY_UPDATE == action))) {
      RW_ASSERT(msg);
      payload = protobuf_c_message_serialize(NULL, msg, &payload_len);
      rwdts_kv_light_table_xact_insert(kv_tab_handle, 0, shard,
                                       (void *)mobj->key,
                                       mobj->key_len,
                                       payload,
                                       payload_len,
                                       (void *)rwdts_kv_light_insert_xact_obj_cb,
                                       (void *)mobj);
    } else if (apih->db_up && (action == RWDTS_QUERY_DELETE)) {
       rwdts_kv_light_table_xact_delete(kv_tab_handle, 0,
                                        (void *)mobj->key,
                                        mobj->key_len,
                                        (void *)rwdts_kv_light_delete_xact_obj_cb,
                                        (void *)mobj);
    }
  }
  if (shard_db_num_info->shard_db_num_cnt) {
    free(shard_db_num_info->shard_db_num);
  }
  RW_FREE(shard_db_num_info);
  rw_keyspec_path_free(local_keyspec, NULL);
  RW_FREE(shard_key1->shard_key_detail.u.byte_key.k.key);
  RW_FREE_TYPE(shard_key1, rwdts_shard_info_detail_t);
  return RW_STATUS_SUCCESS;
}