static void eventer_kqueue_impl_add(eventer_t e) { mtevAssert(e->mask); mtevAssert(eventer_is_loop(e->thr_owner) >= 0); ev_lock_state_t lockstate; const char *cbname; cbname = eventer_name_for_callback_e(e->callback, e); if(e->mask & EVENTER_ASYNCH) { mtevL(eventer_deb, "debug: eventer_add asynch (%s)\n", cbname ? cbname : "???"); eventer_add_asynch(NULL, e); return; } /* Recurrent delegation */ if(e->mask & EVENTER_RECURRENT) { mtevL(eventer_deb, "debug: eventer_add recurrent (%s)\n", cbname ? cbname : "???"); eventer_add_recurrent(e); return; } /* Timed events are simple */ if(e->mask & EVENTER_TIMER) { eventer_add_timed(e); return; } /* file descriptor event */ mtevL(eventer_deb, "debug: eventer_add fd (%s,%d,0x%04x)\n", cbname ? cbname : "???", e->fd, e->mask); mtevAssert(e->whence.tv_sec == 0 && e->whence.tv_usec == 0); lockstate = acquire_master_fd(e->fd); master_fds[e->fd].e = e; if(e->mask & (EVENTER_READ | EVENTER_EXCEPTION)) ke_change(e->fd, EVFILT_READ, EV_ADD | EV_ENABLE, e); if(e->mask & (EVENTER_WRITE)) ke_change(e->fd, EVFILT_WRITE, EV_ADD | EV_ENABLE, e); release_master_fd(e->fd, lockstate); }
static int mtev_lua_general_init(mtev_dso_generic_t *self) { const char * const *module; int (*f)(lua_State *); lua_general_conf_t *conf = get_config(self); lua_module_closure_t *lmc = pthread_getspecific(conf->key); if(lmc) return 0; if(!lmc) { lmc = calloc(1, sizeof(*lmc)); lmc->self = self; mtev_hash_init(&lmc->state_coros); pthread_setspecific(conf->key, lmc); } if(!conf->module || !conf->function) { mtevL(nlerr, "lua_general cannot be used without module and function config\n"); return -1; } lmc->resume = lua_general_resume; lmc->owner = pthread_self(); lmc->eventer_id = eventer_is_loop(lmc->owner); lmc->lua_state = mtev_lua_open(self->hdr.name, lmc, conf->script_dir, conf->cpath); mtevL(nldeb, "lua_general opening state -> %p\n", lmc->lua_state); if(lmc->lua_state == NULL) { mtevL(mtev_error, "lua_general could not add general functions\n"); return -1; } luaL_openlib(lmc->lua_state, "mtev", general_lua_funcs, 0); /* Load some preloads */ for(module = conf->Cpreloads; module && *module; module++) { int len; char *symbol = NULL; len = strlen(*module) + strlen("luaopen_"); symbol = malloc(len+1); if(!symbol) mtevL(nlerr, "Failed to preload %s: malloc error\n", *module); else { snprintf(symbol, len+1, "luaopen_%s", *module); #ifdef RTLD_DEFAULT f = dlsym(RTLD_DEFAULT, symbol); #else f = dlsym((void *)0, symbol); #endif if(!f) mtevL(nlerr, "Failed to preload %s: %s not found\n", *module, symbol); else f(lmc->lua_state); } free(symbol); } lmc->pending = calloc(1, sizeof(*lmc->pending)); mtev_hash_init(lmc->pending); if(conf->booted) return true; conf->booted = mtev_true; eventer_add_in_s_us(dispatch_general, self, 0, 0); if(conf->concurrent) { int i = 1; pthread_t tgt, thr; thr = eventer_choose_owner(i++); do { eventer_t e = eventer_in_s_us(dispatch_general, self, 0, 0); tgt = eventer_choose_owner(i++); eventer_set_owner(e, tgt); eventer_add(e); } while(!pthread_equal(thr,tgt)); } return 0; }