static int rain_dispatch_routine(void) { routine_t rid; int ret = rain_lifequeue_pop(&rid); if(ret == RAIN_OK){ rain_ctx_t * ctx = rain_ctx_handle_query(rid,false); if(ctx){ ret = rain_ctx_run(ctx); rain_ctx_unref(ctx); if(ret == RAIN_OK){ rain_lifequeue_push(rid); } }else{ RAIN_LOG(0,"UNKNOW CTX %x\n",rid); } return RAIN_OK; } return RAIN_ERROR; }
static void* _tryopen(const char *name) { int sz1,sz2,sz3,sz4; sz1 = strlen(MGR->path); char * lib = "lib"; sz4 = strlen(lib); sz2 = strlen(name); char * so = ".so"; sz3 = strlen(so); int len = sz1+sz4+sz2+sz3+1; char path[len]; memcpy(path,MGR->path,sz1); memcpy(path+sz1,lib,sz4); memcpy(path+sz1+sz4,name,sz2); memcpy(path+sz1+sz2+sz4,so,sz3); path[len-1] = 0x00; void * dl = dlopen(path, RTLD_NOW | RTLD_GLOBAL); if(!dl){ RAIN_LOG(0,"dlopen-error:%s %s\n",path,dlerror()); } return dl; }
static void _ctx_destroy(struct rain_ctx *ctx) { rain_module_init_destroy(ctx->mod,ctx->arg,ctx->exit_code); int size = wod_array_size(&ctx->arr); if(size == 0){ wod_array_destroy(&ctx->arr); }else{ struct rain_ctx_message rmsg; rain_routine_t rids[size]; rmsg.src = ctx->rid; rmsg.type = RAIN_MSG_EXIT; rmsg.u_sz.exitcode = ctx->exit_code; wod_array_earse(&ctx->arr,0,size,rids); wod_array_destroy(&ctx->arr); int i=0; for(i=0; i<size; i++){ rain_handle_push_message(rids[i],rmsg); } } rain_message_queue_delete(ctx->msgQue,_del_msg); RAIN_LOG(0,"EXIT.ctx(%x.%s)",ctx->rid,rain_module_get_name(ctx->mod)); _time_exit(); }