12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- #include "__env.h"
- #include "__run.h"
- #include "core_init.h"
- #include "thread.h"
- struct EnvCode {
- af_Environment *env;
- af_Code *code;
- bool free_code;
- };
- static void *runThread(void *ec);
- /**
- * 启动一个次线程运行代码
- * 注意: vs需要 gc_addReference
- * @param env 父线程env
- * @param vs 压入的变量空间
- * @param code 执行的代码
- */
- af_Environment *startRunThread(af_Environment *env, af_VarSpace *vs, af_Code *code, bool free_code, bool derive_tmp,
- bool derive_guardian, bool derive_lr, bool enable){
- af_Environment *base = env->base;
- af_Environment *new = deriveEnvironment(derive_tmp, derive_guardian, derive_lr, enable, base);
- if (vs == NULL) {
- af_Object *obj = getGlobal(env);
- vs = makeVarSpace(obj, 3, 3, 3, env);
- // gc_delReference(obj, env);
- }
- af_VarSpaceListNode *vsl = makeVarSpaceList(vs);
- vsl->next = new->activity->run_varlist;
- new->activity->run_varlist = vsl;
- new->activity->count_run_varlist++;
- // gc_delReference(vs, base);
- if (enable) // 如果未Enable, 则暂时不启动线程
- startRunThread_(new, code, free_code);
- return new;
- }
- void startRunThread_(af_Environment *env, af_Code *code, bool free_code){
- struct EnvCode *ec = calloc(1, sizeof(struct EnvCode));
- ec->env = env;
- ec->code = code;
- ec->free_code = free_code;
- pthread_t id;
- pthread_create(&id, NULL, runThread, ec);
- pthread_detach(id);
- }
- static void *runThread(void *ec) {
- af_Environment *env = ((struct EnvCode *)ec)->env;
- af_Code *code = ((struct EnvCode *)ec)->code;
- bool free_code = ((struct EnvCode *)ec)->free_code;
- free(ec);
- writeInfoLog(aFunCoreLogger, "Thread start");
- iterCode(code, 0, env);
- writeInfoLog(aFunCoreLogger, "Thread free");
- freeEnvironment(env);
- if (free_code)
- freeAllCode(code);
- writeInfoLog(aFunCoreLogger, "Thread end");
- return NULL;
- }
|