Commit a95488a9 authored by Jean-Claude Beaudoin's avatar Jean-Claude Beaudoin
Browse files

Merge branch 'master' of github.com:jcbeaudoin/MKCL

parents 64089c75 aa665813
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -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)
@@ -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
+44 −68
Original line number Diff line number Diff line
@@ -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;
@@ -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)
      {
@@ -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));
@@ -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);