#include <config.h>
#include "posix.h"
#include <errno.h>
#include <jvm.h>
#include <java/lang/Thread.h>
#include <java/io/InterruptedIOException.h>
#if defined (ECOS)
extern "C" unsigned long long _clock (void);
#endif
void
_Jv_gettimeofday (struct timeval *tv)
{
#if defined (HAVE_GETTIMEOFDAY)
gettimeofday (tv, NULL);
#elif defined (HAVE_TIME)
tv->tv_sec = time (NULL);
tv->tv_usec = 0;
#elif defined (HAVE_FTIME)
struct timeb t;
ftime (&t);
tv->tv_sec = t.time;
tv->tv_usec = t.millitm * 1000;
#elif defined (ECOS)
tv->tv_sec = _clock () / 1000;
tv->tv_usec = 0;
#else
tv->tv_sec = 23;
tv->tv_usec = 0;
#endif
}
int
_Jv_select (int n, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout)
{
#ifdef HAVE_SELECT
struct timeval end, delay;
if (timeout)
{
_Jv_gettimeofday (&end);
end.tv_usec += timeout->tv_usec;
if (end.tv_usec >= 1000000)
{
++end.tv_sec;
end.tv_usec -= 1000000;
}
end.tv_sec += timeout->tv_sec;
delay = *timeout;
}
else
{
delay.tv_sec = delay.tv_usec = 0;
}
while (1)
{
int r = select (n, readfds, writefds, exceptfds,
timeout ? &delay : NULL);
if (r != -1 || errno != EINTR)
return r;
if (java::lang::Thread::interrupted ())
throw new java::io::InterruptedIOException (JvNewStringLatin1 ("select interrupted"));
struct timeval after;
if (timeout)
{
_Jv_gettimeofday (&after);
delay.tv_usec = end.tv_usec - after.tv_usec;
delay.tv_sec = end.tv_sec - after.tv_sec;
if (delay.tv_usec < 0)
{
--delay.tv_sec;
delay.tv_usec += 1000000;
}
if (delay.tv_sec < 0)
{
delay.tv_sec = 0;
}
}
}
#else
return 0;
#endif
}