Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
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;
}