Fixed bug 2411 - Even if built with --enable-clock_gettime, SDL2 still calls gettimeofday()
Ben Swick Makes SDL_syscond.c and SDL_syssem.c use clock_gettime(CLOCK_REALTIME) when HAVE_CLOCK_GETTIME is defined.main
parent
ef559ddb4c
commit
7ed41da0b0
|
@ -21,6 +21,7 @@
|
||||||
#include "../../SDL_internal.h"
|
#include "../../SDL_internal.h"
|
||||||
|
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#include <time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
@ -98,17 +99,26 @@ int
|
||||||
SDL_CondWaitTimeout(SDL_cond * cond, SDL_mutex * mutex, Uint32 ms)
|
SDL_CondWaitTimeout(SDL_cond * cond, SDL_mutex * mutex, Uint32 ms)
|
||||||
{
|
{
|
||||||
int retval;
|
int retval;
|
||||||
|
#ifndef HAVE_CLOCK_GETTIME
|
||||||
struct timeval delta;
|
struct timeval delta;
|
||||||
|
#endif
|
||||||
struct timespec abstime;
|
struct timespec abstime;
|
||||||
|
|
||||||
if (!cond) {
|
if (!cond) {
|
||||||
return SDL_SetError("Passed a NULL condition variable");
|
return SDL_SetError("Passed a NULL condition variable");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_CLOCK_GETTIME
|
||||||
|
clock_gettime(CLOCK_REALTIME, &abstime);
|
||||||
|
|
||||||
|
abstime.tv_nsec += (ms % 1000) * 1000000;
|
||||||
|
abstime.tv_sec += ms / 1000;
|
||||||
|
#else
|
||||||
gettimeofday(&delta, NULL);
|
gettimeofday(&delta, NULL);
|
||||||
|
|
||||||
abstime.tv_sec = delta.tv_sec + (ms / 1000);
|
abstime.tv_sec = delta.tv_sec + (ms / 1000);
|
||||||
abstime.tv_nsec = (delta.tv_usec + (ms % 1000) * 1000) * 1000;
|
abstime.tv_nsec = (delta.tv_usec + (ms % 1000) * 1000) * 1000;
|
||||||
|
#endif
|
||||||
if (abstime.tv_nsec > 1000000000) {
|
if (abstime.tv_nsec > 1000000000) {
|
||||||
abstime.tv_sec += 1;
|
abstime.tv_sec += 1;
|
||||||
abstime.tv_nsec -= 1000000000;
|
abstime.tv_nsec -= 1000000000;
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <semaphore.h>
|
#include <semaphore.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
#include "SDL_thread.h"
|
#include "SDL_thread.h"
|
||||||
#include "SDL_timer.h"
|
#include "SDL_timer.h"
|
||||||
|
@ -102,7 +103,9 @@ SDL_SemWaitTimeout(SDL_sem * sem, Uint32 timeout)
|
||||||
{
|
{
|
||||||
int retval;
|
int retval;
|
||||||
#ifdef HAVE_SEM_TIMEDWAIT
|
#ifdef HAVE_SEM_TIMEDWAIT
|
||||||
|
#ifndef HAVE_CLOCK_GETTIME
|
||||||
struct timeval now;
|
struct timeval now;
|
||||||
|
#endif
|
||||||
struct timespec ts_timeout;
|
struct timespec ts_timeout;
|
||||||
#else
|
#else
|
||||||
Uint32 end;
|
Uint32 end;
|
||||||
|
@ -125,22 +128,26 @@ SDL_SemWaitTimeout(SDL_sem * sem, Uint32 timeout)
|
||||||
* a lapse of time, but until we reach a certain time.
|
* a lapse of time, but until we reach a certain time.
|
||||||
* This time is now plus the timeout.
|
* This time is now plus the timeout.
|
||||||
*/
|
*/
|
||||||
|
#ifdef HAVE_CLOCK_GETTIME
|
||||||
|
clock_gettime(CLOCK_REALTIME, &ts_timeout);
|
||||||
|
|
||||||
|
/* Add our timeout to current time */
|
||||||
|
ts_timeout.tv_nsec += (timeout % 1000) * 1000000;
|
||||||
|
ts_timeout.tv_sec += timeout / 1000;
|
||||||
|
#else
|
||||||
gettimeofday(&now, NULL);
|
gettimeofday(&now, NULL);
|
||||||
|
|
||||||
/* Add our timeout to current time */
|
/* Add our timeout to current time */
|
||||||
now.tv_usec += (timeout % 1000) * 1000;
|
ts_timeout.tv_sec = now.tv_sec + (timeout / 1000);
|
||||||
now.tv_sec += timeout / 1000;
|
ts_timeout.tv_nsec = (now.tv_usec + (timeout % 1000) * 1000) * 1000;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Wrap the second if needed */
|
/* Wrap the second if needed */
|
||||||
if ( now.tv_usec >= 1000000 ) {
|
if (ts_timeout.tv_nsec > 1000000000) {
|
||||||
now.tv_usec -= 1000000;
|
ts_timeout.tv_sec += 1;
|
||||||
now.tv_sec ++;
|
ts_timeout.tv_nsec -= 1000000000;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Convert to timespec */
|
|
||||||
ts_timeout.tv_sec = now.tv_sec;
|
|
||||||
ts_timeout.tv_nsec = now.tv_usec * 1000;
|
|
||||||
|
|
||||||
/* Wait. */
|
/* Wait. */
|
||||||
do {
|
do {
|
||||||
retval = sem_timedwait(&sem->sem, &ts_timeout);
|
retval = sem_timedwait(&sem->sem, &ts_timeout);
|
||||||
|
|
Loading…
Reference in New Issue