int emit_create(void *data, emit_t *em){ struct edp_emit *ee; int i; ASSERT(em != NULL); ee = (struct edp_emit *)mheap_alloc(sizeof(*ee)); if(ee == NULL){ log_warn("not enough memory!\n"); return -ENOMEM; } memset(ee, 0, sizeof(*ee)); ee->ee_magic = EMIT_INSTANCE_MAGIC; spi_spin_init(&ee->ee_lock); atomic_reset(&ee->ee_pendings); // INIT_LIST_HEAD(&ee->ee_events); INIT_LIST_HEAD(&ee->ee_node); for(i = 0; i < kEMIT_EVENT_TYPE_MAX; i++){ ee->ee_handler[i] = emit_default_handler; } ee->ee_data = data; ee->ee_init = 1; spi_spin_lock(&__emit_data.ed_lock); list_add(&ee->ee_node, &__emit_data.ed_emits); spi_spin_unlock(&__emit_data.ed_lock); *em = ee; return 0; }
threadpool_item_t * threadpool_get_back(threadpool_t *threadpool) { threadpool_item_t *item; if(!atomic_test(&threadpool->have_scheduled_back)) return NULL; pthread_mutex_lock(&threadpool->lock); item = threadpool->scheduled_back.first; /* Order is important. */ threadpool->scheduled_back.first = NULL; threadpool->scheduled_back.last = NULL; atomic_reset(&threadpool->have_scheduled_back); pthread_mutex_unlock(&threadpool->lock); return item; }