Exemple #1
0
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;
}
Exemple #2
0
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--;
}
Exemple #3
0
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;
}