[Asterisk-Dev] Some select(2) usage Linux-specific
Mark Spencer
markster at digium.com
Fri Apr 25 07:29:53 MST 2003
How about doing a macro called ast_select which resolves to select() on
linux and an inline function to do this sort of select on non-linux
systems?
Mark
On Thu, 24 Apr 2003, Thorsten Lockert wrote:
> A couple of calls to select(2) are assuming a Linux-specific side-
> effect of the passed timeval being updated with how much time was
> left in before a timeout would occur.
>
> This patch makes this work (at the expense of two more system calls)
> on many other systems.
>
> Index: channel.c
> ===================================================================
> RCS file: /usr/cvsroot/asterisk/channel.c,v
> retrieving revision 1.11
> diff -u -r1.11 channel.c
> --- channel.c 17 Apr 2003 02:52:53 -0000 1.11
> +++ channel.c 24 Apr 2003 21:46:10 -0000
> @@ -739,6 +739,9 @@
> {
> /* Wait for x amount of time on a file descriptor to have input. */
> struct timeval tv;
> +#ifndef __linux__
> + struct timeval tvstart, tvend, tvlen;
> +#endif
> fd_set rfds, efds;
> int res;
> int x, max=-1;
> @@ -756,8 +759,23 @@
> max = fds[x];
> }
> }
> - if (*ms >= 0)
> + if (*ms >= 0) {
> +#ifndef __linux__
> + gettimeofday(&tvstart, NULL);
> +#endif
> res = select(max + 1, &rfds, NULL, &efds, &tv);
> +#ifndef __linux__
> + gettimeofday(&tvend, NULL);
> + timersub(&tvend, &tvstart, &tvlen);
> + tvend.tv_sec = *ms / 1000;
> + tvend.tv_usec = (*ms % 1000) * 1000;
> + timersub(&tvend, &tvlen, &tv);
> + if (tv.tv_sec < 0 || tv.tv_usec < 0) {
> + tv.tv_sec = 0;
> + tv.tv_usec = 0;
> + }
> +#endif
> + }
> else
> res = select(max + 1, &rfds, NULL, &efds, NULL);
>
> @@ -786,6 +804,9 @@
> {
> /* Wait for x amount of time on a file descriptor to have input. */
> struct timeval tv;
> +#ifndef __linux__
> + struct timeval tvstart, tvend, tvlen;
> +#endif
> fd_set rfds, efds;
> int res;
> int x, y, max=-1;
> @@ -828,8 +849,23 @@
> if (fds[x] > max)
> max = fds[x];
> }
> - if (*ms >= 0)
> + if (*ms >= 0) {
> +#ifndef __linux__
> + gettimeofday(&tvstart, NULL);
> +#endif
> res = select(max + 1, &rfds, NULL, &efds, &tv);
> +#ifndef __linux__
> + gettimeofday(&tvend, NULL);
> + timersub(&tvend, &tvstart, &tvlen);
> + tvend.tv_sec = *ms / 1000;
> + tvend.tv_usec = (*ms % 1000) * 1000;
> + timersub(&tvend, &tvlen, &tv);
> + if (tv.tv_sec < 0 || tv.tv_usec < 0) {
> + tv.tv_sec = 0;
> + tv.tv_usec = 0;
> + }
> +#endif
> + }
> else
> res = select(max + 1, &rfds, NULL, &efds, NULL);
>
> --
> Thorsten Lockert | tholo at sigmasoft.com | Universe, n.:
> 2121 N. Lakeshore Dr. | tholo at openbsd.org | The problem.
> Chapel Hill, NC 27514 | |
> _______________________________________________
> Asterisk-Dev mailing list
> Asterisk-Dev at lists.digium.com
> http://lists.digium.com/mailman/listinfo/asterisk-dev
>
More information about the asterisk-dev
mailing list