OSDN Git Service

* Chill runtime moved into toplevel libchill.
[pf3gnuchains/gcc-fork.git] / libchill / waituntil.c
1 /* Implement timing-related runtime actions for CHILL.
2    Copyright (C) 1992,1993 Free Software Foundation, Inc.
3    Author: Wilfried Moser
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
20
21 #include "rtltypes.h"
22 #include "rts.h"
23
24 EXCEPTION (timerfail);
25
26 /*
27  * function __wait_until
28  *
29  * parameters:
30  *     abstime   absolute time value
31  *     filename
32  *     linenumber
33  *
34  * returns:
35  *     int   0 on success, 1 on failure
36  *
37  * exceptions:
38  *     timerfail
39  *
40  * abstract:
41  *     check for given argument is valid, calculate how long to wait in
42  *     seconds and call os to do it.
43  *
44  */
45
46 int
47 __wait_until (abstime, filename, linenumber)
48      unsigned long  abstime;
49      char          *filename;
50      int            linenumber;
51 {
52   RtsTime       now, delta, abs_rtstime;
53     
54   /* get current time */
55   __rtstime (&now);
56     
57   abs_rtstime.secs = abstime;
58   abs_rtstime.nanosecs = 0;
59   
60   if (abs_rtstime.nanosecs < now.nanosecs)
61     {
62       abs_rtstime.secs--;
63       abs_rtstime.nanosecs += 1000000000;
64     }
65   
66   delta.secs = abs_rtstime.secs - now.secs;
67   delta.nanosecs = abs_rtstime.nanosecs - now.nanosecs;
68   
69   if (delta.secs > abs_rtstime.secs)
70     /* cannot wait into past */
71     return 1;
72   
73   return __delay_this (wait_wait, &delta, filename, linenumber) == 1 ? 0 : 1;
74 }