static void on_chain(LwqqAsyncEvent* caller,LwqqAsyncEvent* called) { called->result = caller->result; called->failcode = caller->failcode; called->lc = caller->lc; lwqq_async_event_finish(called); }
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); }
void lwqq_async_add_event_chain(LwqqAsyncEvent* caller,LwqqAsyncEvent* called) { /**indeed caller->lc may be NULL when recursor */ called->lc = caller->lc; LwqqAsyncEvent_* called_ = (LwqqAsyncEvent_*)called; //cancel previous chained event if(called_->chained){ LwqqAsyncEvent_* chained_ = (LwqqAsyncEvent_*)called_->chained; vp_cancel0(chained_->cmd); } called_->chained = caller; if(caller->failcode == LWQQ_CALLBACK_SYNCED){ //when sync enabled, caller and called must finished already. //so free caller ,and do not trigger anything called->result = caller->result; called->failcode = caller->failcode; lwqq_async_event_finish(caller); }else{ lwqq_async_add_event_listener(caller,_C_(2p,on_chain,caller,called)); } }
static void async_call_on_chain(LwqqAsyncEvent* ev,void* data) { lwqq_async_event_finish((LwqqAsyncEvent*)data); }