uint32_t service_create(struct module *module, const char *param) { struct service *s = service_alloc(0, sizeof *s); s->module = *module; s->session = 0; s->logfile = 0; s->handle = service_regist(s); s->queue = queue_create(s->handle); service_total_inc(); s = service_grab(s->handle); s->ud = module->create(s->handle, param); if (!s->ud) { service_log(s->handle, "FAILED %s\n", param); uint32_t handle = s->handle; while (!(s = (struct service *)index_release(g.index, handle))) {} queue_try_release(s->queue); queue_release(s->queue, queue_message_dtor, (void *)(uintptr_t)handle); service_alloc(s, 0); service_total_dec(); return 0; } service_log(s->handle, "CREATE %s\n", param); worker_queue_push(s->queue); if (service_release(s->handle)) return 0; return s->handle; }
static void attribute_free(relation_t *rel, attribute_t *attr) { if(attr->index != NULL) { index_release(attr->index); } memb_free(&attributes_memb, attr); rel->attribute_count--; }
int service_release(uint32_t handle) { struct service *s = (struct service *)index_release(g.index, handle); if (!s) return 0; s->module.release(s->handle, s->ud); queue_try_release(s->queue); if (s->logfile) fclose(s->logfile); service_alloc(s, 0); service_total_dec(); service_log(handle, "RELEASE\n"); return 1; }