Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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();
}