CDClient* CD_CreateClient (CDServer* server) { CDClient* self = CD_malloc(sizeof(CDClient)); if (pthread_rwlock_init(&self->lock.status, NULL) != 0) { CD_abort("pthread rwlock failed to initialize"); } self->server = server; self->status = CDClientConnect; self->jobs = 0; self->buffers = NULL; DYNAMIC(self) = CD_CreateDynamic(); ERROR(self) = CDNull; return self; }
void CD_DestroyClient (CDClient* self) { assert(self); CD_EventDispatch(self->server, "Client.destroy", self); if (self->buffers) { bufferevent_flush(self->buffers->raw, EV_READ | EV_WRITE, BEV_FINISHED); bufferevent_disable(self->buffers->raw, EV_READ | EV_WRITE); bufferevent_free(self->buffers->raw); CD_DestroyBuffers(self->buffers); } CD_DestroyDynamic(DYNAMIC(self)); pthread_rwlock_destroy(&self->lock.status); CD_free(self); }
static int checkSlot(Ejs *ejs, EjsArray *ap, int slotNum) { if (slotNum < 0) { if (!DYNAMIC(ap)) { ejsThrowTypeError(ejs, "Object is not dynamic"); return EJS_ERR; } slotNum = ap->length; if (growArray(ejs, ap, ap->length + 1) < 0) { ejsThrowMemoryError(ejs); return EJS_ERR; } } else if (slotNum >= ap->length) { if (growArray(ejs, ap, slotNum + 1) < 0) { ejsThrowMemoryError(ejs); return EJS_ERR; } } return slotNum; }