xref: /relibc/pthreads-emb/pte_relmillisecs.c (revision 714af18cbe52336f4ff71fe91bfb035d5efaef7d)
1 /*
2  * pte_relmillisecs.c
3  *
4  * Description:
5  * This translation unit implements miscellaneous thread functions.
6  *
7  * --------------------------------------------------------------------------
8  *
9  *      Pthreads-embedded (PTE) - POSIX Threads Library for embedded systems
10  *      Copyright(C) 2008 Jason Schmidlapp
11  *
12  *      Contact Email: jschmidlapp@users.sourceforge.net
13  *
14  *
15  *      Based upon Pthreads-win32 - POSIX Threads Library for Win32
16  *      Copyright(C) 1998 John E. Bossom
17  *      Copyright(C) 1999,2005 Pthreads-win32 contributors
18  *
19  *      Contact Email: rpj@callisto.canberra.edu.au
20  *
21  *      The original list of contributors to the Pthreads-win32 project
22  *      is contained in the file CONTRIBUTORS.ptw32 included with the
23  *      source code distribution. The list can also be seen at the
24  *      following World Wide Web location:
25  *      http://sources.redhat.com/pthreads-win32/contributors.html
26  *
27  *      This library is free software; you can redistribute it and/or
28  *      modify it under the terms of the GNU Lesser General Public
29  *      License as published by the Free Software Foundation; either
30  *      version 2 of the License, or (at your option) any later version.
31  *
32  *      This library is distributed in the hope that it will be useful,
33  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
34  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
35  *      Lesser General Public License for more details.
36  *
37  *      You should have received a copy of the GNU Lesser General Public
38  *      License along with this library in the file COPYING.LIB;
39  *      if not, write to the Free Software Foundation, Inc.,
40  *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
41  */
42 
43 #include <pte_osal.h>
44 
45 #include "pthread.h"
46 #include "implement.h"
47 
48 typedef long long int64_t;
49 
50 unsigned int
51 pte_relmillisecs (const struct timespec * abstime)
52 {
53   const long long NANOSEC_PER_MILLISEC = 1000000;
54   const long long MILLISEC_PER_SEC = 1000;
55   unsigned int milliseconds;
56   long long tmpAbsMilliseconds;
57   long  tmpCurrMilliseconds;
58   struct timeb currSysTime;
59 
60   /*
61    * Calculate timeout as milliseconds from current system time.
62    */
63 
64   /*
65    * subtract current system time from abstime in a way that checks
66    * that abstime is never in the past, or is never equivalent to the
67    * defined INFINITE value (0xFFFFFFFF).
68    *
69    * Assume all integers are unsigned, i.e. cannot test if less than 0.
70    */
71   tmpAbsMilliseconds =  (int64_t)abstime->tv_sec * MILLISEC_PER_SEC;
72   tmpAbsMilliseconds += ((int64_t)abstime->tv_nsec + (NANOSEC_PER_MILLISEC/2)) / NANOSEC_PER_MILLISEC;
73 
74   /* get current system time */
75 
76   _ftime(&currSysTime);
77 
78   tmpCurrMilliseconds = (int64_t) currSysTime.time * MILLISEC_PER_SEC;
79   tmpCurrMilliseconds += (int64_t) currSysTime.millitm;
80 
81   if (tmpAbsMilliseconds > tmpCurrMilliseconds)
82     {
83       milliseconds = (unsigned int) (tmpAbsMilliseconds - tmpCurrMilliseconds);
84       if (milliseconds == 0xFFFFFFFF)
85         {
86           /* Timeouts must be finite */
87           milliseconds--;
88         }
89     }
90   else
91     {
92       /* The abstime given is in the past */
93       milliseconds = 0;
94     }
95 
96   return milliseconds;
97 }
98