tclUnixEvent.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:2k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * tclUnixEvent.c --
  3.  *
  4.  * This file implements Unix specific event related routines.
  5.  *
  6.  * Copyright (c) 1997 by Sun Microsystems, Inc.
  7.  *
  8.  * See the file "license.terms" for information on usage and redistribution
  9.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  10.  *
  11.  * RCS: @(#) $Id: tclUnixEvent.c,v 1.4 2001/11/21 02:36:21 hobbs Exp $
  12.  */
  13. #include "tclInt.h"
  14. #include "tclPort.h"
  15. /*
  16.  *----------------------------------------------------------------------
  17.  *
  18.  * Tcl_Sleep --
  19.  *
  20.  * Delay execution for the specified number of milliseconds.
  21.  *
  22.  * Results:
  23.  * None.
  24.  *
  25.  * Side effects:
  26.  * Time passes.
  27.  *
  28.  *----------------------------------------------------------------------
  29.  */
  30. void
  31. Tcl_Sleep(ms)
  32.     int ms; /* Number of milliseconds to sleep. */
  33. {
  34.     struct timeval delay;
  35.     Tcl_Time before, after;
  36.     /*
  37.      * The only trick here is that select appears to return early
  38.      * under some conditions, so we have to check to make sure that
  39.      * the right amount of time really has elapsed.  If it's too
  40.      * early, go back to sleep again.
  41.      */
  42.     Tcl_GetTime(&before);
  43.     after = before;
  44.     after.sec += ms/1000;
  45.     after.usec += (ms%1000)*1000;
  46.     if (after.usec > 1000000) {
  47. after.usec -= 1000000;
  48. after.sec += 1;
  49.     }
  50.     while (1) {
  51. delay.tv_sec = after.sec - before.sec;
  52. delay.tv_usec = after.usec - before.usec;
  53. if (delay.tv_usec < 0) {
  54.     delay.tv_usec += 1000000;
  55.     delay.tv_sec -= 1;
  56. }
  57. /*
  58.  * Special note:  must convert delay.tv_sec to int before comparing
  59.  * to zero, since delay.tv_usec is unsigned on some platforms.
  60.  */
  61. if ((((int) delay.tv_sec) < 0)
  62. || ((delay.tv_usec == 0) && (delay.tv_sec == 0))) {
  63.     break;
  64. }
  65. (void) select(0, (SELECT_MASK *) 0, (SELECT_MASK *) 0,
  66. (SELECT_MASK *) 0, &delay);
  67. Tcl_GetTime(&before);
  68.     }
  69. }