Skip to content

Commit 0571919

Browse files
committed
support corutine mode for event
1 parent faf93fc commit 0571919

File tree

3 files changed

+57
-40
lines changed

3 files changed

+57
-40
lines changed

src/PikaObj.c

Lines changed: 49 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -3183,16 +3183,17 @@ Arg* obj_runMethodArg2(PikaObj* self, Arg* methodArg, Arg* arg1, Arg* arg2) {
31833183
Arg* __eventListener_runEvent(PikaEventListener* listener,
31843184
uintptr_t eventId,
31853185
Arg* eventData) {
3186+
pika_debug("event listener: 0x%p", listener);
31863187
PikaObj* handler = pika_eventListener_getEventHandleObj(listener, eventId);
3187-
pika_debug("event handler: %p", handler);
3188+
pika_debug("event handler: 0x%p", handler);
31883189
if (NULL == handler) {
31893190
pika_platform_printf(
31903191
"Error: can not find event handler by id: [0x%02" PRIxPTR "]\r\n",
31913192
eventId);
31923193
return NULL;
31933194
}
31943195
Arg* eventCallBack = obj_getArg(handler, "eventCallBack");
3195-
pika_debug("run event handler: %p", handler);
3196+
pika_debug("event data: %p", eventData);
31963197
Arg* res = pika_runFunction1(arg_copy(eventCallBack), arg_copy(eventData));
31973198
return res;
31983199
}
@@ -3230,6 +3231,7 @@ PIKA_RES _do_pika_eventListener_send(PikaEventListener* self,
32303231
Arg* eventData,
32313232
int eventSignal,
32323233
PIKA_BOOL pickupWhenNoVM) {
3234+
pika_assert(NULL != self);
32333235
#if !PIKA_EVENT_ENABLE
32343236
pika_platform_printf("PIKA_EVENT_ENABLE is not enable");
32353237
while (1) {
@@ -3238,6 +3240,8 @@ PIKA_RES _do_pika_eventListener_send(PikaEventListener* self,
32383240
if (NULL != eventData && !_VM_is_first_lock()) {
32393241
#if PIKA_EVENT_THREAD_ENABLE
32403242
_VM_lock_init();
3243+
#elif PIKA_COROUTINE_ENABLE
3244+
pika_debug("sending arg event with corutine mode");
32413245
#else
32423246
pika_platform_printf(
32433247
"Error: can not send arg event data without thread support\r\n");
@@ -3252,52 +3256,58 @@ PIKA_RES _do_pika_eventListener_send(PikaEventListener* self,
32523256
return PIKA_RES_ERR_RUNTIME_ERROR;
32533257
}
32543258
}
3259+
3260+
#if !PIKA_COROUTINE_ENABLE // skip wait for corutine
32553261
/* using multi thread */
3256-
if (pika_GIL_isInit()) {
3257-
/* python thread is running */
3258-
/* wait python thread get first lock */
3259-
while (1) {
3260-
if (_VM_is_first_lock()) {
3261-
break;
3262-
}
3263-
if (g_PikaVMState.vm_cnt == 0) {
3264-
break;
3265-
}
3266-
if (pika_GIL_getBareLock() == 0) {
3267-
break;
3268-
}
3269-
pika_platform_thread_yield();
3262+
if (!pika_GIL_isInit()) {
3263+
return (PIKA_RES)0;
3264+
};
3265+
3266+
/* python thread is running */
3267+
/* wait python thread get first lock */
3268+
while (1) {
3269+
if (_VM_is_first_lock()) {
3270+
break;
32703271
}
3271-
pika_GIL_ENTER();
3272-
#if PIKA_EVENT_THREAD_ENABLE
3273-
if (!g_PikaVMState.event_thread) {
3274-
// avoid _VMEvent_pickupEvent() in _time.c as soon as
3275-
// possible
3276-
g_PikaVMState.event_thread = pika_platform_thread_init(
3277-
"pika_event", _thread_event, NULL, PIKA_EVENT_THREAD_STACK_SIZE,
3278-
PIKA_THREAD_PRIO, PIKA_THREAD_TICK);
3279-
pika_debug("event thread init");
3272+
if (g_PikaVMState.vm_cnt == 0) {
3273+
break;
32803274
}
3275+
if (pika_GIL_getBareLock() == 0) {
3276+
break;
3277+
}
3278+
pika_platform_thread_yield();
3279+
}
32813280
#endif
32823281

3283-
if (NULL != eventData) {
3284-
if (PIKA_RES_OK !=
3285-
__eventListener_pushEvent(self, eventId, eventData)) {
3286-
goto __gil_exit;
3287-
}
3282+
pika_GIL_ENTER();
3283+
#if PIKA_EVENT_THREAD_ENABLE
3284+
if (!g_PikaVMState.event_thread) {
3285+
// avoid _VMEvent_pickupEvent() in _time.c as soon as
3286+
// possible
3287+
g_PikaVMState.event_thread = pika_platform_thread_init(
3288+
"pika_event", _thread_event, NULL, PIKA_EVENT_THREAD_STACK_SIZE,
3289+
PIKA_THREAD_PRIO, PIKA_THREAD_TICK);
3290+
pika_debug("event thread init");
3291+
}
3292+
#endif
3293+
3294+
if (NULL != eventData) {
3295+
if (PIKA_RES_OK !=
3296+
__eventListener_pushEvent(self, eventId, eventData)) {
3297+
goto __gil_exit;
32883298
}
3299+
}
32893300

3290-
if (pickupWhenNoVM) {
3291-
int vmCnt = _VMEvent_getVMCnt();
3292-
if (0 == vmCnt) {
3293-
/* no vm running, pick up event imediately */
3294-
pika_debug("vmCnt: %d, pick up imediately", vmCnt);
3295-
_VMEvent_pickupEvent();
3296-
}
3301+
if (pickupWhenNoVM) {
3302+
int vmCnt = _VMEvent_getVMCnt();
3303+
if (0 == vmCnt) {
3304+
/* no vm running, pick up event imediately */
3305+
pika_debug("vmCnt: %d, pick up imediately", vmCnt);
3306+
_VMEvent_pickupEvent();
32973307
}
3298-
__gil_exit:
3299-
pika_GIL_EXIT();
33003308
}
3309+
__gil_exit:
3310+
pika_GIL_EXIT();
33013311
return (PIKA_RES)0;
33023312
#endif
33033313
}

src/PikaVersion.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
#define PIKA_VERSION_MINOR 13
33
#define PIKA_VERSION_MICRO 4
44

5-
#define PIKA_EDIT_TIME "2025/06/02 13:54:26"
5+
#define PIKA_EDIT_TIME "2025/06/02 15:06:43"

src/pika_config_valid.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,10 @@ extern "C" {
483483
#define PIKA_EVENT_THREAD_ENABLE 1
484484
#endif
485485

486+
#ifndef PIKA_COROUTINE_ENABLE
487+
#define PIKA_COROUTINE_ENABLE 0
488+
#endif
489+
486490
#ifndef PIKA_GC_MARK_SWEEP_ENABLE
487491
#define PIKA_GC_MARK_SWEEP_ENABLE 0
488492
#endif
@@ -524,6 +528,9 @@ extern "C" {
524528
#endif
525529

526530
/* configuration validation */
531+
#if PIKA_COROUTINE_ENABLE && PIKA_EVENT_THREAD_ENABLE
532+
#error "PIKA_COROUTINE_ENABLE can not used with PIKA_EVENT_THREAD_ENABLE"
533+
#endif
527534

528535
#endif
529536
#ifdef __cplusplus

0 commit comments

Comments
 (0)