| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- #include "_thread.h"
- #include "PikaVM.h"
- #include "TinyObj.h"
- typedef struct pika_thread_info {
- Arg* function;
- Arg* args;
- pika_platform_thread_t* thread;
- } pika_thread_info;
- static void _thread_func(void* arg) {
- pika_debug("waiting for first lock");
- while (1) {
- if (_VM_is_first_lock()) {
- break;
- }
- //! This May break the thread
- // if (_VMEvent_getVMCnt() <= 0) {
- // break;
- // }
- pika_debug("VM num %d", _VMEvent_getVMCnt());
- pika_platform_thread_delay();
- }
- pika_debug("thread start");
- pika_GIL_ENTER();
- PikaObj* ctx = New_TinyObj(NULL);
- pika_thread_info* info = (pika_thread_info*)arg;
- obj_setArg(ctx, "args", info->args);
- obj_setArg(ctx, "thread", info->function);
- /* clang-format off */
- PIKA_PYTHON(
- thread(*args)
- )
- /* clang-format on */
- const uint8_t bytes[] = {
- 0x0c, 0x00, 0x00, 0x00, /* instruct array size */
- 0x20, 0x81, 0x01, 0x00, 0x10, 0x08, 0x06, 0x00, 0x00, 0x02, 0x08, 0x00,
- /* instruct array */
- 0x0f, 0x00, 0x00, 0x00, /* const pool size */
- 0x00, 0x61, 0x72, 0x67, 0x73, 0x00, 0x2a, 0x00, 0x74, 0x68, 0x72, 0x65,
- 0x61, 0x64, 0x00, /* const pool */
- };
- pikaVM_runByteCode(ctx, (uint8_t*)bytes);
- obj_deinit(ctx);
- arg_deinit(info->function);
- arg_deinit(info->args);
- pika_debug("thread exiting");
- pika_platform_thread_t* thread = info->thread;
- pikaFree(info, sizeof(pika_thread_info));
- pika_GIL_EXIT();
- #if PIKA_FREERTOS_ENABLE
- pikaFree(thread, sizeof(pika_platform_thread_t));
- pika_platform_thread_exit(NULL);
- #else
- pika_platform_thread_exit(thread);
- #endif
- }
- void _thread_start_new_thread(PikaObj* self, Arg* function, Arg* args_) {
- pika_thread_info* info =
- (pika_thread_info*)pikaMalloc(sizeof(pika_thread_info));
- info->function = arg_copy(function);
- info->args = arg_copy(args_);
- _VM_lock_init();
- info->thread = pika_platform_thread_init(
- "pika_thread", _thread_func, info, PIKA_THREAD_STACK_SIZE,
- PIKA_THREAD_PRIO, PIKA_THREAD_TICK);
- }
|