2
0

thread.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #include "__env.h"
  2. #include "__run.h"
  3. #include "core_init.h"
  4. #include "thread.h"
  5. struct EnvCode {
  6. af_Environment *env;
  7. af_Code *code;
  8. bool free_code;
  9. };
  10. static void *runThread(void *ec);
  11. /**
  12. * 启动一个次线程运行代码
  13. * 注意: vs需要 gc_addReference
  14. * @param env 父线程env
  15. * @param vs 压入的变量空间
  16. * @param code 执行的代码
  17. */
  18. af_Environment *startRunThread(af_Environment *env, af_VarSpace *vs, af_Code *code, bool free_code, bool derive_tmp,
  19. bool derive_guardian, bool derive_lr, bool enable){
  20. af_Environment *base = env->base;
  21. af_Environment *new = deriveEnvironment(derive_tmp, derive_guardian, derive_lr, enable, base);
  22. if (vs == NULL) {
  23. af_Object *obj = getGlobal(env);
  24. vs = makeVarSpace(obj, 3, 3, 3, env);
  25. // gc_delReference(obj, env);
  26. }
  27. af_VarSpaceListNode *vsl = makeVarSpaceList(vs);
  28. vsl->next = new->activity->run_varlist;
  29. new->activity->run_varlist = vsl;
  30. new->activity->count_run_varlist++;
  31. // gc_delReference(vs, base);
  32. if (enable) // 如果未Enable, 则暂时不启动线程
  33. startRunThread_(new, code, free_code);
  34. return new;
  35. }
  36. void startRunThread_(af_Environment *env, af_Code *code, bool free_code){
  37. struct EnvCode *ec = calloc(1, sizeof(struct EnvCode));
  38. ec->env = env;
  39. ec->code = code;
  40. ec->free_code = free_code;
  41. pthread_t id;
  42. pthread_create(&id, NULL, runThread, ec);
  43. pthread_detach(id);
  44. }
  45. static void *runThread(void *ec) {
  46. af_Environment *env = ((struct EnvCode *)ec)->env;
  47. af_Code *code = ((struct EnvCode *)ec)->code;
  48. bool free_code = ((struct EnvCode *)ec)->free_code;
  49. free(ec);
  50. writeInfoLog(aFunCoreLogger, "Thread start");
  51. iterCode(code, 0, env);
  52. writeInfoLog(aFunCoreLogger, "Thread free");
  53. freeEnvironment(env);
  54. if (free_code)
  55. freeAllCode(code);
  56. writeInfoLog(aFunCoreLogger, "Thread end");
  57. return NULL;
  58. }