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);
    }
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.