static void es_fa_close(void *aux) { es_fa_handle_t *fah = aux; es_fap_t *ef = fah->fah_ef; es_context_t *ec = ef->super.er_ctx; duk_context *ctx = ec->ec_duk; es_context_begin(ec); es_push_root(ctx, ef); duk_get_prop_string(ctx, -1, "close"); es_push_native_obj(ctx, &es_native_fah, fah_retain(fah)); es_push_root(ctx, fah); int rc = duk_pcall(ctx, 2); if(rc) { fah_exception(fah, ctx); es_dump_err(ctx); } es_root_unregister(ctx, fah); es_context_end(ec, 1); fah_release(fah); }
static void es_fap_destroy(es_resource_t *eres) { es_fap_t *ef = (es_fap_t *)eres; fileaccess_unregister_dynamic(&ef->fap); free(ef->name); es_root_unregister(eres->er_ctx->ec_duk, eres); es_resource_unlink(&ef->super); }
static void es_timer_destroy(es_resource_t *eres) { es_timer_t *et = (es_timer_t *)eres; es_root_unregister(eres->er_ctx->ec_duk, eres); if(et->et_expire) { hts_mutex_lock(&timer_mutex); LIST_REMOVE(et, et_link); hts_mutex_unlock(&timer_mutex); } es_resource_unlink(&et->super); }
static void es_route_destroy(es_resource_t *eres) { es_route_t *er = (es_route_t *)eres; es_root_unregister(eres->er_ctx->ec_duk, eres); hts_mutex_lock(&route_mutex); LIST_REMOVE(er, er_link); hts_mutex_unlock(&route_mutex); free(er->er_pattern); hts_regfree(&er->er_regex); es_resource_unlink(&er->super); }
static int es_fap_read(fa_handle_t *fh, void *buf, size_t size) { es_fa_handle_t *fah = (es_fa_handle_t *)fh; fah->fah_readbuf = buf; fah->fah_readlen = size; hts_mutex_lock(&es_fa_mutex); fah->fah_status = ES_FA_WORKING; task_run(es_fa_read, fah_retain(fah)); while(fah->fah_status == ES_FA_WORKING) hts_cond_wait(&es_fa_cond, &es_fa_mutex); hts_mutex_unlock(&es_fa_mutex); es_fap_t *ef = fah->fah_ef; es_context_t *ec = ef->super.er_ctx; duk_context *ctx = ec->ec_duk; es_context_begin(ec); es_push_root(ctx, fah->fah_readbuf); duk_config_buffer(ctx, -1, NULL, 0); es_root_unregister(ctx, fah->fah_readbuf); es_context_end(ec, 0); switch(fah->fah_status) { case ES_FA_OK: fah->fah_fpos += fah->fah_return_value; return fah->fah_return_value; case ES_FA_CANCELLED: case ES_FA_ERROR: return -1; } return 0; }