another mingw infconfig simplification to hopefully work with new mingw

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@38336 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
rfm 2015-02-07 11:01:53 +00:00
parent 8b3b0d0db9
commit 40bfec157a
2 changed files with 57 additions and 46 deletions

View file

@ -1,6 +1,7 @@
2015-02-07 Richard Frith-Macdonald <rfm@gnu.org> 2015-02-07 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSData.m: Simplify mingw/unixy ifdefs for writing a file. * Source/NSData.m: Simplify mingw/unixy ifdefs for writing a file.
* Source/NSThread.m: Simplify mingw/unixy ifdefs for sleeping.
2015-02-05 Niels Grewe <niels.grewe@halbordnung.de> 2015-02-05 Niels Grewe <niels.grewe@halbordnung.de>

View file

@ -220,21 +220,62 @@ GSSleepUntilIntervalSinceReferenceDate(NSTimeInterval when)
delay = when - GSPrivateTimeNow(); delay = when - GSPrivateTimeNow();
if (delay <= 0.0) if (delay <= 0.0)
{ {
/* We don't need to wait, but since we are willing to wait at this
* point, we should let other threads have preference over this one.
*/
sched_yield(); sched_yield();
return; return;
} }
#ifdef HAVE_NANOSLEEP #if defined(__MINGW__)
// Avoid any possibility of overflow by sleeping in chunks. /*
while (delay > 32768) * Avoid integer overflow by breaking up long sleeps.
*/
while (delay > 30.0*60.0)
{ {
struct timespec request; // sleep 30 minutes
Sleep (30*60*1000);
request.tv_sec = (time_t)32768;
request.tv_nsec = (long)0;
nanosleep(&request, 0);
delay = when - GSPrivateTimeNow(); delay = when - GSPrivateTimeNow();
} }
/* Don't use nanosleep (even if available) on mingw ... it's reported no
* to work with pthreads.
* Sleeping may return early because of signals, so we need to re-calculate
* the required delay and check to see if we need to sleep again.
*/
while (delay > 0)
{
#if defined(HAVE_USLEEP)
/* On windows usleep() seems to perform a busy wait ... so we only
* use it for short delays ... otherwise use the less accurate Sleep()
*/
if (delay > 0.1)
{
Sleep ((NSInteger)(delay*1000));
}
else
{
usleep ((NSInteger)(delay*1000000));
}
#else
Sleep ((NSInteger)(delay*1000));
#endif /* HAVE_USLEEP */
delay = when - GSPrivateTimeNow();
}
#else /* __MINGW__ */
/*
* Avoid integer overflow by breaking up long sleeps.
*/
while (delay > 30.0*60.0)
{
// sleep 30 minutes
sleep(30*60);
delay = when - GSPrivateTimeNow();
}
#ifdef HAVE_NANOSLEEP
if (delay > 0) if (delay > 0)
{ {
struct timespec request; struct timespec request;
@ -259,21 +300,7 @@ GSSleepUntilIntervalSinceReferenceDate(NSTimeInterval when)
remainder.tv_nsec = 0; remainder.tv_nsec = 0;
} }
} }
#else #else /* HAVE_NANOSLEEP */
/*
* Avoid integer overflow by breaking up long sleeps.
*/
while (delay > 30.0*60.0)
{
// sleep 30 minutes
#if defined(__MINGW__)
Sleep (30*60*1000);
#else
sleep (30*60);
#endif
delay = when - GSPrivateTimeNow();
}
/* /*
* sleeping may return early because of signals, so we need to re-calculate * sleeping may return early because of signals, so we need to re-calculate
@ -281,32 +308,15 @@ GSSleepUntilIntervalSinceReferenceDate(NSTimeInterval when)
*/ */
while (delay > 0) while (delay > 0)
{ {
#if defined(__MINGW__)
#if defined(HAVE_USLEEP) #if defined(HAVE_USLEEP)
/* On windows usleep() seems to perform a busy wait ... so we only usleep((NSInteger)(delay*1000000));
* use it for short delays ... otherwise use the less accurate Sleep() #else /* HAVE_USLEEP */
*/ sleep((NSInteger)delay);
if (delay > 0.1) #endif /* !HAVE_USLEEP */
{
Sleep ((NSInteger)(delay*1000));
}
else
{
usleep ((NSInteger)(delay*1000000));
}
#else
Sleep ((NSInteger)(delay*1000));
#endif /* HAVE_USLEEP */
#else
#if defined(HAVE_USLEEP)
usleep ((NSInteger)(delay*1000000));
#else
sleep ((NSInteger)delay);
#endif /* HAVE_USLEEP */
#endif /* __MINGW__ */
delay = when - GSPrivateTimeNow(); delay = when - GSPrivateTimeNow();
} }
#endif /* HAVE_NANOSLEEP */ #endif /* !HAVE_NANOSLEEP */
#endif /* !__MINGW__ */
} }
static NSArray * static NSArray *