fix thread mem error when args is void

This commit is contained in:
pikastech 2023-04-15 11:20:11 +08:00
parent e1e8cb5480
commit ea4d42bbea
5 changed files with 74 additions and 17 deletions

View File

@ -16,6 +16,7 @@
// "--gtest_filter=packtool.*"
// "--gtest_filter=os.path"
// "--gtest_filter=packtool.packread"
"--gtest_filter=thread.test2"
],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",

View File

@ -25,25 +25,46 @@ static void _thread_func(void* arg) {
pika_GIL_ENTER();
PikaObj* ctx = New_TinyObj(NULL);
pika_thread_info* info = (pika_thread_info*)arg;
obj_setArg(ctx, "args", info->args);
if (NULL != info->args) {
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);
if (NULL == info->args) {
/* clang-format off */
PIKA_PYTHON(
thread()
)
/* clang-format on */
const uint8_t bytes[] = {
0x04, 0x00, 0x00, 0x00, /* instruct array size */
0x00, 0x82, 0x01, 0x00, /* instruct array */
0x08, 0x00, 0x00, 0x00, /* const pool size */
0x00, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x00, /* const pool */
};
pikaVM_runByteCode(ctx, (uint8_t*)bytes);
} else {
/* 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);
if (NULL != info->args) {
arg_deinit(info->args);
}
pika_debug("thread exiting");
pika_platform_thread_t* thread = info->thread;
pikaFree(info, sizeof(pika_thread_info));
@ -56,11 +77,19 @@ static void _thread_func(void* arg) {
#endif
}
int PikaStdData_Tuple_len(PikaObj* self);
void _thread_start_new_thread(PikaObj* self, Arg* function, Arg* args_) {
pika_thread_info* info =
(pika_thread_info*)pikaMalloc(sizeof(pika_thread_info));
pika_platform_memset(info, 0, sizeof(pika_thread_info));
info->function = arg_copy(function);
info->args = arg_copy(args_);
PikaObj* tuple = arg_getPtr(args_);
size_t tuple_size = PikaStdData_Tuple_len(tuple);
if (tuple_size > 0) {
info->args = arg_copy(args_);
}
_VM_lock_init();
info->thread = pika_platform_thread_init(
"pika_thread", _thread_func, info, PIKA_THREAD_STACK_SIZE,

View File

@ -754,4 +754,12 @@ TEST(compiler, str_join) {
EXPECT_EQ(pikaMemNow(), 0);
}
TEST(thread, void_arg) {
char* lines =
"thread()";
pika_lines2Array(lines);
EXPECT_EQ(pikaMemNow(), 0);
}
TEST_END

View File

@ -0,0 +1,17 @@
import time
import _thread
finished = False
def test_thread():
global finished
for i in range(3):
print(i)
time.sleep(0.1)
finished = True
# 开启线程 获取数据
_thread.start_new_thread(test_thread, ())
while not finished:
time.sleep(0.1)
time.sleep(0.1)

View File

@ -33,5 +33,7 @@ TEST(thread, self) {
EXPECT_EQ(pikaMemNow(), 0);
}
TEST_SINGLE_FILE(thread, test2, "test/python/_thread/test2.py")
#endif
TEST_END