support yiled from time.sleep()

This commit is contained in:
lyon 2023-02-01 00:37:05 +08:00
parent 33cc4aacce
commit d9925cab7c
7 changed files with 40 additions and 38 deletions

View File

@ -4,10 +4,6 @@ from PikaObj import *
def __init__(self): ...
def sleep(self, s: float):
"""Sleep for s seconds."""
@PIKA_C_MACRO_IF("PIKA_STD_DEVICE_UNIX_TIME_ENABLE")
def time(self) -> float:
"""Get the current time."""

View File

@ -7,23 +7,23 @@
#include <windows.h>
#endif
void _time_sleep_ms(PikaObj* self, int ms) {
#if defined(__linux)
usleep(ms * 1000);
#elif defined(_WIN32)
Sleep(ms);
#else
__platform_sleep_ms(ms);
#endif
void (*global_do_sleep_ms)(uint32_t);
static void _do_sleep_ms_tick(uint32_t ms) {
uint32_t tick = pika_platform_getTick();
while (pika_platform_getTick() - tick < ms) {
_pikaVM_yiled();
}
}
void _time_sleep_ms(PikaObj* self, int ms) {
global_do_sleep_ms(ms);
}
void _time_sleep_s(PikaObj* self, int s) {
#if defined(__linux)
sleep(s);
#elif defined(_WIN32)
Sleep(s * 1000);
#else
__platform_sleep_s(s);
#endif
for (int i = 0; i < s; i++) {
_time_sleep_ms(self, 1000);
}
}
void _time_platformGetTick(PikaObj* self) {
@ -701,12 +701,10 @@ void _time___init__(PikaObj* self) {
obj_setInt(self, "locale", 8);
time_localtime(0.0, &this_tm, 8);
time_set_tm_value(self, &this_tm);
if (-1 == pika_platform_getTick()) {
global_do_sleep_ms = pika_platform_sleep_ms;
} else {
global_do_sleep_ms = _do_sleep_ms_tick;
}
#endif
}
void _time_sleep(PikaObj* self, pika_float s) {
Args* args = New_args(NULL);
args_setInt(args, "ms", s * 1000);
obj_runNativeMethod(self, "sleep_ms", args);
args_deinit(args);
}

View File

@ -2,7 +2,9 @@ import _time
def sleep(s: float):
return _time.sleep(s)
for i in range(int(s)):
_time.sleep_s(1)
_time.sleep_ms(int((s - int(s)) * 1000))
def sleep_s(s: int):

View File

@ -91,7 +91,9 @@ PIKA_WEAK int64_t pika_platform_getTick(void) {
#if PIKA_FREERTOS_ENABLE
return platform_uptime_ms();
#elif defined(__linux)
return time(NULL);
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
return (ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
#else
return -1;
#endif
@ -293,17 +295,16 @@ PIKA_WEAK void pika_platform_thread_delay(void) {
}
PIKA_WEAK void pika_platform_sleep_ms(uint32_t ms) {
#if defined(__linux)
usleep(ms * 1000);
#elif defined(_WIN32)
Sleep(ms);
#else
pika_platform_printf(
"Error: pika_platform_sleep_ms need implementation!\r\n");
while (1) {
}
}
PIKA_WEAK void pika_platform_sleep_s(uint32_t s) {
/* sleep_ms */
pika_platform_sleep_ms(s * 1000);
while (1) {
}
#endif
}
/* Thread Support */
@ -468,7 +469,7 @@ PIKA_WEAK void pika_platform_thread_timer_init(pika_platform_timer_t* timer) {
}
PIKA_WEAK void pika_platform_thread_timer_cutdown(pika_platform_timer_t* timer,
unsigned int timeout) {
unsigned int timeout) {
#ifdef __linux
struct timeval now;
gettimeofday(&now, NULL);
@ -482,7 +483,8 @@ PIKA_WEAK void pika_platform_thread_timer_cutdown(pika_platform_timer_t* timer,
#endif
}
PIKA_WEAK char pika_platform_thread_timer_is_expired(pika_platform_timer_t* timer) {
PIKA_WEAK char pika_platform_thread_timer_is_expired(
pika_platform_timer_t* timer) {
#ifdef __linux
struct timeval now, res;
gettimeofday(&now, NULL);

View File

@ -179,7 +179,6 @@ void pika_platform_thread_delay(void);
int64_t pika_platform_getTick(void);
void pika_platform_sleep_ms(uint32_t ms);
void pika_platform_sleep_s(uint32_t s);
void pika_hook_instruct(void);
PIKA_BOOL pika_hook_arg_cache_filter(void* self);

View File

@ -3575,3 +3575,7 @@ PikaObj* pikaVM_runFile(PikaObj* self, char* file_name) {
strsDeinit(&buffs);
return self;
}
void _pikaVM_yiled(void){
// pika_platform_printf("yiled\r\n");
}

View File

@ -313,4 +313,5 @@ PIKA_RES __eventListener_pushEvent(PikaEventListener* lisener,
Arg* eventData);
int _VMEvent_getVMCnt(void);
void _VMEvent_pickupEvent(void);
void _pikaVM_yiled(void);
#endif