Loading src/c/threads.d +4 −4 Original line number Diff line number Diff line Loading @@ -2394,7 +2394,7 @@ interrupt_thread_internal(MKCL, mkcl_object thread, mkcl_object function, mkcl_i } MKCL_UNWIND_PROTECT_END; if ( !(success || failure) ) sched_yield(); MKCL_LIBC_NO_INTR(env, sched_yield()); } while ( !(retry_count >= MAX_INTERRUPT_RETRIES || success || failure) ); if ( retry_count >= MAX_INTERRUPT_RETRIES) Loading Loading @@ -2723,10 +2723,10 @@ mk_mt_thread_join(MKCL, mkcl_object thread) mkcl_object mk_mt_thread_yield(MKCL) { #ifdef HAVE_SCHED_YIELD MKCL_LIBC_NO_INTR(env, sched_yield()); #elif MKCL_WINDOWS #if MKCL_WINDOWS MKCL_LIBC_NO_INTR(env, SwitchToThread()); #elif defined(HAVE_SCHED_YIELD) MKCL_LIBC_NO_INTR(env, sched_yield()); #else MKCL_LIBC_NO_INTR(env, sleep(0)); /* Use sleep(0) to yield to a >= priority thread */ #endif Loading src/c/time.d +44 −68 Original line number Diff line number Diff line Loading @@ -167,50 +167,9 @@ mk_cl_sleep(MKCL, mkcl_object z) if (fe_inexact_on) fedisableexcept(FE_INEXACT); #ifdef HAVE_NANOSLEEP { struct timespec tm; double r = mkcl_to_double(env, z); tm.tv_sec = (time_t)floor(r); tm.tv_nsec = (long)((r - floor(r)) * 1e9); if (fe_inexact_on) { feclearexcept(FE_INEXACT); feenableexcept(FE_INEXACT); } { int rc; struct timespec rem = tm; do { struct timespec req = rem; MKCL_LIBC_Zzz(env, @':io', rc = nanosleep(&req, &rem)); /* We should use clock_nanosleep() instead. JCB */ } while (rc && errno == EINTR); mk_mt_test_for_thread_shutdown(env); if (rc) mkcl_FElibc_error(env, "mk_cl_sleep() failed on nanosleep().", 0); } } #elif MKCL_WINDOWS #if MKCL_WINDOWS { double r = mkcl_to_double(env, z) * 1000; #if 0 DWORD duration = (DWORD) r; /* This limits sleep duration to about 49,7 days */ if (fe_inexact_on) { feclearexcept(FE_INEXACT); feenableexcept(FE_INEXACT); } #endif #if 0 Sleep(duration); /* This one sleeps hard and cannot be interrupted. JCB */ #else { long long now_ms; long long target_ms; FILETIME system_time; Loading @@ -222,11 +181,7 @@ mk_cl_sleep(MKCL, mkcl_object z) uli_system_time.HighPart = system_time.dwHighDateTime; now_ms = uli_system_time.QuadPart / 10000; #if 0 target_ms = now_ms + llround(r); #else target_ms = now_ms + ((long long) round(r)); /* used to be llround() but mingw with gcc 4.8.1 foobared on it. */ #endif if (fe_inexact_on) { Loading @@ -244,10 +199,6 @@ mk_cl_sleep(MKCL, mkcl_object z) else duration = target_ms - now_ms; #if 0 fprintf(stderr, "\nMKCL: sleep duration = %lu ms.\n", duration); fflush(stderr); #endif MKCL_LIBC_Zzz(env, @':io', val = SleepEx(duration, TRUE)); /* The "alertable" version. */ MKCL_LIBC_NO_INTR(env, GetSystemTimeAsFileTime(&system_time)); Loading @@ -259,7 +210,32 @@ mk_cl_sleep(MKCL, mkcl_object z) } while ((val == WAIT_IO_COMPLETION) && (now_ms < target_ms)); mk_mt_test_for_thread_shutdown(env); } #endif #elif defined(HAVE_NANOSLEEP) { struct timespec tm; double r = mkcl_to_double(env, z); tm.tv_sec = (time_t)floor(r); tm.tv_nsec = (long)((r - floor(r)) * 1e9); if (fe_inexact_on) { feclearexcept(FE_INEXACT); feenableexcept(FE_INEXACT); } { int rc; struct timespec rem = tm; do { struct timespec req = rem; MKCL_LIBC_Zzz(env, @':io', rc = nanosleep(&req, &rem)); /* We should use clock_nanosleep() instead. JCB */ } while (rc && errno == EINTR); mk_mt_test_for_thread_shutdown(env); if (rc) mkcl_FElibc_error(env, "mk_cl_sleep() failed on nanosleep().", 0); } } #else z = mkcl_round1(z); Loading Loading
src/c/threads.d +4 −4 Original line number Diff line number Diff line Loading @@ -2394,7 +2394,7 @@ interrupt_thread_internal(MKCL, mkcl_object thread, mkcl_object function, mkcl_i } MKCL_UNWIND_PROTECT_END; if ( !(success || failure) ) sched_yield(); MKCL_LIBC_NO_INTR(env, sched_yield()); } while ( !(retry_count >= MAX_INTERRUPT_RETRIES || success || failure) ); if ( retry_count >= MAX_INTERRUPT_RETRIES) Loading Loading @@ -2723,10 +2723,10 @@ mk_mt_thread_join(MKCL, mkcl_object thread) mkcl_object mk_mt_thread_yield(MKCL) { #ifdef HAVE_SCHED_YIELD MKCL_LIBC_NO_INTR(env, sched_yield()); #elif MKCL_WINDOWS #if MKCL_WINDOWS MKCL_LIBC_NO_INTR(env, SwitchToThread()); #elif defined(HAVE_SCHED_YIELD) MKCL_LIBC_NO_INTR(env, sched_yield()); #else MKCL_LIBC_NO_INTR(env, sleep(0)); /* Use sleep(0) to yield to a >= priority thread */ #endif Loading
src/c/time.d +44 −68 Original line number Diff line number Diff line Loading @@ -167,50 +167,9 @@ mk_cl_sleep(MKCL, mkcl_object z) if (fe_inexact_on) fedisableexcept(FE_INEXACT); #ifdef HAVE_NANOSLEEP { struct timespec tm; double r = mkcl_to_double(env, z); tm.tv_sec = (time_t)floor(r); tm.tv_nsec = (long)((r - floor(r)) * 1e9); if (fe_inexact_on) { feclearexcept(FE_INEXACT); feenableexcept(FE_INEXACT); } { int rc; struct timespec rem = tm; do { struct timespec req = rem; MKCL_LIBC_Zzz(env, @':io', rc = nanosleep(&req, &rem)); /* We should use clock_nanosleep() instead. JCB */ } while (rc && errno == EINTR); mk_mt_test_for_thread_shutdown(env); if (rc) mkcl_FElibc_error(env, "mk_cl_sleep() failed on nanosleep().", 0); } } #elif MKCL_WINDOWS #if MKCL_WINDOWS { double r = mkcl_to_double(env, z) * 1000; #if 0 DWORD duration = (DWORD) r; /* This limits sleep duration to about 49,7 days */ if (fe_inexact_on) { feclearexcept(FE_INEXACT); feenableexcept(FE_INEXACT); } #endif #if 0 Sleep(duration); /* This one sleeps hard and cannot be interrupted. JCB */ #else { long long now_ms; long long target_ms; FILETIME system_time; Loading @@ -222,11 +181,7 @@ mk_cl_sleep(MKCL, mkcl_object z) uli_system_time.HighPart = system_time.dwHighDateTime; now_ms = uli_system_time.QuadPart / 10000; #if 0 target_ms = now_ms + llround(r); #else target_ms = now_ms + ((long long) round(r)); /* used to be llround() but mingw with gcc 4.8.1 foobared on it. */ #endif if (fe_inexact_on) { Loading @@ -244,10 +199,6 @@ mk_cl_sleep(MKCL, mkcl_object z) else duration = target_ms - now_ms; #if 0 fprintf(stderr, "\nMKCL: sleep duration = %lu ms.\n", duration); fflush(stderr); #endif MKCL_LIBC_Zzz(env, @':io', val = SleepEx(duration, TRUE)); /* The "alertable" version. */ MKCL_LIBC_NO_INTR(env, GetSystemTimeAsFileTime(&system_time)); Loading @@ -259,7 +210,32 @@ mk_cl_sleep(MKCL, mkcl_object z) } while ((val == WAIT_IO_COMPLETION) && (now_ms < target_ms)); mk_mt_test_for_thread_shutdown(env); } #endif #elif defined(HAVE_NANOSLEEP) { struct timespec tm; double r = mkcl_to_double(env, z); tm.tv_sec = (time_t)floor(r); tm.tv_nsec = (long)((r - floor(r)) * 1e9); if (fe_inexact_on) { feclearexcept(FE_INEXACT); feenableexcept(FE_INEXACT); } { int rc; struct timespec rem = tm; do { struct timespec req = rem; MKCL_LIBC_Zzz(env, @':io', rc = nanosleep(&req, &rem)); /* We should use clock_nanosleep() instead. JCB */ } while (rc && errno == EINTR); mk_mt_test_for_thread_shutdown(env); if (rc) mkcl_FElibc_error(env, "mk_cl_sleep() failed on nanosleep().", 0); } } #else z = mkcl_round1(z); Loading