_thread.c 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #include "_thread.h"
  2. #include "PikaVM.h"
  3. typedef struct pika_thread_info {
  4. Arg* function;
  5. Arg* args;
  6. pika_platform_thread_t* thread;
  7. } pika_thread_info;
  8. static void _thread_func(void* arg) {
  9. pika_debug("waiting for first lock");
  10. while (1) {
  11. if (_VM_is_first_lock()) {
  12. break;
  13. }
  14. //! This May break the thread
  15. // if (_VMEvent_getVMCnt() <= 0) {
  16. // break;
  17. // }
  18. pika_debug("VM num %d", _VMEvent_getVMCnt());
  19. pika_platform_thread_delay();
  20. }
  21. pika_debug("thread start");
  22. pika_GIL_ENTER();
  23. PikaObj* ctx = New_PikaObj();
  24. pika_thread_info* info = (pika_thread_info*)arg;
  25. obj_setArg(ctx, "args", info->args);
  26. obj_setArg(ctx, "thread", info->function);
  27. /* clang-format off */
  28. PIKA_PYTHON(
  29. thread(*args)
  30. )
  31. /* clang-format on */
  32. const uint8_t bytes[] = {
  33. 0x0c, 0x00, 0x00, 0x00, /* instruct array size */
  34. 0x20, 0x81, 0x01, 0x00, 0x10, 0x08, 0x06, 0x00, 0x00, 0x02, 0x08, 0x00,
  35. /* instruct array */
  36. 0x0f, 0x00, 0x00, 0x00, /* const pool size */
  37. 0x00, 0x61, 0x72, 0x67, 0x73, 0x00, 0x2a, 0x00, 0x74, 0x68, 0x72, 0x65,
  38. 0x61, 0x64, 0x00, /* const pool */
  39. };
  40. pikaVM_runByteCode(ctx, (uint8_t*)bytes);
  41. obj_deinit(ctx);
  42. arg_deinit(info->function);
  43. arg_deinit(info->args);
  44. pika_debug("thread exiting");
  45. pika_platform_thread_t* thread = info->thread;
  46. pikaFree(info, sizeof(pika_thread_info));
  47. pika_GIL_EXIT();
  48. #if PIKA_FREERTOS_ENABLE
  49. pikaFree(thread, sizeof(pika_platform_thread_t));
  50. pika_platform_thread_exit(NULL);
  51. #else
  52. pika_platform_thread_exit(thread);
  53. #endif
  54. }
  55. void _thread_start_new_thread(PikaObj* self, Arg* function, Arg* args_) {
  56. pika_thread_info* info =
  57. (pika_thread_info*)pikaMalloc(sizeof(pika_thread_info));
  58. info->function = arg_copy(function);
  59. info->args = arg_copy(args_);
  60. _VM_lock_init();
  61. info->thread = pika_platform_thread_init(
  62. "pika_thread", _thread_func, info, PIKA_THREAD_STACK_SIZE,
  63. PIKA_THREAD_PRIO, PIKA_THREAD_TICK);
  64. }