RE: PATCH: Microsecond sleep time
Werner Coetzee <[email protected]>
| Newsgroups | gmane.comp.mobile.kannel.devel |
|---|---|
| Message-ID | <86E9DA9FF04EBD468B3574F22A0B0DB648811780B1@comms01-cpt.internal.clickatell.com> |
Hi Stipe Patch attached. Werner -----Original Message----- From: Stipe Tolj [mailto:[email protected]] Sent: 02 July 2008 16:18 To: Werner Coetzee Cc: [email protected] Subject: Re: PATCH: Microsecond sleep time Werner Coetzee schrieb: > Hi > > Can anyone explain why gwthread is using the poll function to sleep (using milliseconds as timeout), and not maybe the select function (using microseconds as timeout)? > > We have the requirement to be able to sleep for less than a millisecond, which the current gwthread_sleep can't provide. > > Below is a patch to do just that, using the select function. > I have tested it, so if anyone has any comments, please let me hear them. > > The diff is from our own SVN repository, but as far as I know, it is up-to-date with the cvs. Hi Werner, I'm +0 for applying the patch to CVS, since it's an additive feature and doesn't hurt any existing core bricks of the gwlib. The calls should be POSIX.1 compliant and portable hence I guess. Werner, could you do me a favor and resend the patch in a single file as mail attachment please. This ensures we don't get truncated end of line chars etc, which is a mess to correct by hand while patching ;) And thanks a lot for contributing. Stipe ------------------------------------------------------------------- Kölner Landstrasse 419 40589 Düsseldorf, NRW, Germany tolj.org system architecture Kannel Software Foundation (KSF) http://www.tolj.org/ http://www.kannel.org/ mailto:st_{at}_tolj.org mailto:stolj_{at}_kannel.org -------------------------------------------------------------------
micro.c
(text/plain, 1 KB)
/* gwthread.h */
/* Sleep until "seconds" seconds have elapsed, or until another thread
* calls gwthread_wakeup on us. Fractional seconds are allowed. */
void gwthread_sleep_micro(double dseconds);
/* gwthread-pthread.c */
void gwthread_sleep_micro(double dseconds)
{
fd_set fd_set_recv;
struct threadinfo *threadinfo;
int fd;
int ret;
threadinfo = getthreadinfo();
fd = threadinfo->wakefd_recv;
FD_ZERO(&fd_set_recv);
FD_SET(fd, &fd_set_recv);
if (dseconds < 0) {
ret = select(fd + 1, &fd_set_recv, NULL, NULL, NULL);
}
else {
struct timeval timeout;
timeout.tv_sec = dseconds;
timeout.tv_usec = (dseconds - timeout.tv_sec) * 1000000;
ret = select(fd + 1, &fd_set_recv, NULL, NULL, &timeout);
}
if (ret < 0) {
if (errno != EINTR && errno != EAGAIN) {
warning(errno, "gwthread_sleep_micro: error in select()");
}
}
if (FD_ISSET(fd, &fd_set_recv)) {
flushpipe(fd);
}
}