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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy