static void instance_free (struct instance *o) { ASSERT(LinkedList1_IsEmpty(&o->users)) // break any rdownups LinkedList0Node *ln; while (ln = LinkedList0_GetFirst(&o->rdownups_list)) { struct rdownup_instance *rdu = UPPER_OBJECT(ln, struct rdownup_instance, rdownups_list_node); ASSERT(rdu->blocker == o) LinkedList0_Remove(&o->rdownups_list, &rdu->rdownups_list_node); rdu->blocker = NULL; } NCDModuleInst_Backend_Dead(o->i); }
static void value_delete (struct value *v) { if (v->parent) { switch (v->parent->type) { case NCDVALUE_LIST: { value_list_remove(v->parent, v); } break; case NCDVALUE_MAP: { value_map_remove(v->parent, v); } break; default: ASSERT(0); } } LinkedList0Node *ln; while (ln = LinkedList0_GetFirst(&v->refs_list)) { struct instance *inst = UPPER_OBJECT(ln, struct instance, refs_list_node); ASSERT(inst->v == v) LinkedList0_Remove(&v->refs_list, &inst->refs_list_node); inst->v = NULL; } switch (v->type) { case NCDVALUE_STRING: { free(v->string.string); } break; case NCDVALUE_LIST: { while (value_list_len(v) > 0) { struct value *ev = value_list_at(v, 0); value_delete(ev); } } break; case NCDVALUE_MAP: { while (value_map_len(v) > 0) { struct value *ev = value_map_at(v, 0); value_delete(ev); } } break; default: ASSERT(0); } free(v); }
static void connection_free_link (struct connection *c) { PacketPassFifoQueue_PrepareFree(&c->send_queue); LinkedList0Node *ln; while (ln = LinkedList0_GetFirst(&c->replies_list)) { struct reply *r = UPPER_OBJECT(ln, struct reply, replies_list_node); ASSERT(r->con == c) reply_free(r); } PacketPassFifoQueue_Free(&c->send_queue); PacketStreamSender_Free(&c->send_pss); PacketProtoDecoder_Free(&c->recv_decoder); PacketPassInterface_Free(&c->recv_if); BConnection_RecvAsync_Free(&c->con); BConnection_SendAsync_Free(&c->con); BConnection_Free(&c->con); }
} PacketPassFifoQueue_Free(&c->send_queue); PacketStreamSender_Free(&c->send_pss); PacketProtoDecoder_Free(&c->recv_decoder); PacketPassInterface_Free(&c->recv_if); BConnection_RecvAsync_Free(&c->con); BConnection_SendAsync_Free(&c->con); BConnection_Free(&c->con); } static void connection_terminate (struct connection *c) { ASSERT(c->state == CONNECTION_STATE_RUNNING) for (LinkedList0Node *ln = LinkedList0_GetFirst(&c->requests_list); ln; ln = LinkedList0Node_Next(ln)) { struct request *r = UPPER_OBJECT(ln, struct request, requests_list_node); if (!r->terminating) { request_terminate(r); } } connection_free_link(c); c->state = CONNECTION_STATE_TERMINATING; if (LinkedList0_IsEmpty(&c->requests_list)) { connection_free(c); return; }