_thread.c 2.1 KB

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