void lwqq_async_event_finish(LwqqAsyncEvent* event) { LwqqAsyncEvent_* internal = (LwqqAsyncEvent_*)event; vp_do(internal->cmd,NULL); LwqqAsyncEvset_* evset_ = (LwqqAsyncEvset_*)internal->host_lock; if(evset_ !=NULL){ pthread_mutex_lock(&evset_->lock); evset_->ref_count--; //this store evset err count. if(event->result != LWQQ_EC_OK) evset_->parent.err_count ++; if(evset_->ref_count==0){ vp_do(evset_->cmd,NULL); if(evset_->cond_waiting) pthread_cond_signal(&evset_->cond); else{ pthread_mutex_unlock(&evset_->lock); lwqq_async_evset_free(internal->host_lock); s_free(event); return; } } pthread_mutex_unlock(&evset_->lock); } s_free(event); }
void lwqq_async_event_finish(LwqqAsyncEvent* event) { _LwqqAsyncEventInternal* internal = (_LwqqAsyncEventInternal*)event; vp_do(internal->cmd,NULL); _LwqqAsyncEvsetInternal* evset = (_LwqqAsyncEvsetInternal*)internal->host_lock; if(evset !=NULL){ pthread_mutex_lock(&evset->lock); evset->ref_count--; //this store evset result. //it can only store one error number. if(event->result != 0) evset->parent.result ++; if(((_LwqqAsyncEvsetInternal*) internal->host_lock)->ref_count==0){ vp_do(evset->cmd,NULL); if(evset->cond_waiting) pthread_cond_signal(&evset->cond); else{ pthread_mutex_unlock(&evset->lock); s_free(evset); s_free(event); return; } } pthread_mutex_unlock(&evset->lock); } s_free(event); }
void lwqq_async_event_finish(LwqqAsyncEvent* event) { vp_do(event->cmd,NULL); LwqqAsyncEvset* evset = event->host_lock; if(evset !=NULL){ pthread_mutex_lock(&evset->lock); evset->ref_count--; //this store evset result. //it can only store one error number. if(event->result != 0) evset->result = event->result; if(event->host_lock->ref_count==0){ vp_do(evset->cmd,NULL); if(evset->cond_waiting) pthread_cond_signal(&evset->cond); else{ pthread_mutex_unlock(&evset->lock); s_free(evset); s_free(event); return; } } pthread_mutex_unlock(&evset->lock); } s_free(event); }
void lwqq_async_evset_wait(LwqqAsyncEvset* set) { if(!set) return; LwqqAsyncEvset_* evset_ = (LwqqAsyncEvset_*) set; if(evset_->ref_count == 0) vp_do(evset_->cmd,NULL); else{ evset_->cond_waiting = 1; pthread_cond_wait(&evset_->cond, &evset_->lock); vp_do(evset_->cmd,NULL); } lwqq_async_evset_free(set); }
static int did_dispatch(void* param) { LwqqCommand *d = param; vp_do(*d,NULL); s_free(d); return 0; }
static void dispatch_wrap(LwqqAsyncTimerHandle timer,void* p) { async_dispatch_data* data = (async_dispatch_data*)p; vp_do(data->cmd,NULL); lwqq_async_timer_stop(timer); lwqq_async_timer_free(timer); //!!! should we stop first delete later? s_free(data); }
void lwqq_async_add_event_listener(LwqqAsyncEvent* event,LwqqCommand cmd) { if(event == NULL){ vp_do(cmd,NULL); return ; }else if(event->cmd.func== NULL) event->cmd = cmd; else vp_link(&event->cmd,&cmd); }
void lwqq_async_dispatch_delay(LwqqCommand cmd,unsigned long timeout) { #ifndef WITHOUT_ASYNC if(timeout==0) timeout=10; async_dispatch_data* data = s_malloc0(sizeof(*data)); data->cmd = cmd; data->timer = lwqq_async_timer_new(); lwqq_async_timer_watch(data->timer, timeout, dispatch_wrap, data); #else vp_do(cmd,NULL); #endif }
void lwqq_async_add_event_listener(LwqqAsyncEvent* event,LwqqCommand cmd) { _LwqqAsyncEventInternal* _event = (_LwqqAsyncEventInternal*) event; if(event == NULL){ //event->failcode = LWQQ_CALLBACK_FAILED; vp_do(cmd,NULL); return ; }else if(_event->cmd.func== NULL) _event->cmd = cmd; else vp_link(&_event->cmd,&cmd); }
void lwqq_async_add_event_listener(LwqqAsyncEvent* event,LwqqCommand cmd) { LwqqAsyncEvent_* event_ = (LwqqAsyncEvent_*) event; if(event == NULL){ vp_do(cmd,NULL); return ; }else if(event_->cmd.func== NULL) event_->cmd = cmd; else vp_link(&event_->cmd,&cmd); if(event->failcode == LWQQ_CALLBACK_SYNCED) lwqq_async_event_finish(event); }