1 // -----------------------------------------------------------------------
2 // Copyright (C) 2006 - 2007 FRESCOR consortium partners:
4 // Universidad de Cantabria, SPAIN
5 // University of York, UK
6 // Scuola Superiore Sant'Anna, ITALY
7 // Kaiserslautern University, GERMANY
8 // Univ. Politécnica Valencia, SPAIN
9 // Czech Technical University in Prague, CZECH REPUBLIC
11 // Thales Communication S.A. FRANCE
12 // Visual Tools S.A. SPAIN
13 // Rapita Systems Ltd UK
16 // See http://www.frescor.org for a link to partners' websites
18 // FRESCOR project (FP6/2005/IST/5-034026) is funded
19 // in part by the European Union Sixth Framework Programme
20 // The European Union is not liable of any use that may be
24 // based on previous work (FSF) done in the FIRST project
26 // Copyright (C) 2005 Mälardalen University, SWEDEN
27 // Scuola Superiore S.Anna, ITALY
28 // Universidad de Cantabria, SPAIN
29 // University of York, UK
31 // FSF API web pages: http://marte.unican.es/fsf/docs
32 // http://shark.sssup.it/contrib/first/docs/
34 // This file is part of FRSH API
36 // FRSH API is free software; you can redistribute it and/or modify
37 // it under the terms of the GNU General Public License as published by
38 // the Free Software Foundation; either version 2, or (at your option)
41 // FRSH API is distributed in the hope that it will be useful, but
42 // WITHOUT ANY WARRANTY; without even the implied warranty of
43 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
44 // General Public License for more details.
46 // You should have received a copy of the GNU General Public License
47 // distributed with FRSH API; see file COPYING. If not, write to the
48 // Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
51 // As a special exception, if you include this header file into source
52 // files to be compiled, this header file does not by itself cause
53 // the resulting executable to be covered by the GNU General Public
54 // License. This exception does not however invalidate any other
55 // reasons why the executable file might be covered by the GNU General
57 // -----------------------------------------------------------------------
58 /*-----------------------------------------------------------------------
61 * 't i m e s p e c _ o p e r a t i o n s'
65 * File 'timespec_operations.h' by MAR.
66 * (july 2002) transformed into macros by Jul.
67 * Some basic operations with the type 'timespec'.
69 * ----------------------------------------------------------------------
70 * Copyright (C) 2001 Universidad de Cantabria, SPAIN
72 * Authors: Mario Aldea Rivas aldeam@ctr.unican.es
73 * Michael Gonzalez Harbour mgh@ctr.unican.es
75 * MaRTE OS is free software; you can redistribute it and/or modify it
76 * under the terms of the GNU General Public License as published by the
77 * Free Software Foundation; either version 2, or (at your option) any
80 * MaRTE OS is distributed in the hope that it will be useful, but
81 * WITHOUT ANY WARRANTY; without even the implied warranty of
82 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
83 * General Public License for more details.
85 * You should have received a copy of the GNU General Public License
86 * distributed with MaRTE OS; see file COPYING. If not, write to the
87 * Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
90 * As a special exception, if you link this unit with other files to
91 * produce an executable, this unit does not by itself cause the
92 * resulting executable to be covered by the GNU General Public License.
93 * This exception does not however invalidate any other reasons why the
94 * executable file might be covered by the GNU Public License.
96 *---------------------------------------------------------------------------*/
97 // 16-Jul-2007 SANGORRIN corrections to msec_addto_timespec and msec2timespec
98 // (TODO: test the rest of functions)
99 // -----------------------------------------------------------------------
101 #ifndef _MARTE_MISC_TIMESPEC_OPERATIONS_H_
102 #define _MARTE_MISC_TIMESPEC_OPERATIONS_H_
105 * @file timespec_operations.h
110 #define smaller_timespec(t1, t2) \
112 (t1)->tv_sec < (t2)->tv_sec || ((t1)->tv_sec == (t2)->tv_sec && \
113 (t1)->tv_nsec < (t2)->tv_nsec) \
116 #define smaller_or_equal_timespec(t1, t2) \
118 (t1)->tv_sec < (t2)->tv_sec || ((t1)->tv_sec == (t2)->tv_sec && \
119 (t1)->tv_nsec <= (t2)->tv_nsec) \
122 #define incr_timespec(t1, t2) \
124 (t1)->tv_sec += (t2)->tv_sec; \
125 (t1)->tv_nsec += (t2)->tv_nsec; \
126 if ((t1)->tv_nsec >= 1000000000) { \
128 (t1)->tv_nsec -= 1000000000; \
132 #define decr_timespec(t1, t2) \
134 if ((t1)->tv_nsec < (t2)->tv_nsec) { \
135 (t1)->tv_sec -= (t2)->tv_sec + 1; \
136 (t1)->tv_nsec = (t1)->tv_nsec + 1000000000 - (t2)->tv_nsec; \
138 (t1)->tv_sec -= (t2)->tv_sec; \
139 (t1)->tv_nsec -= (t2)->tv_nsec; \
144 #define add_timespec( sum , t1 , t2 ) \
146 (sum)->tv_sec = (t1)->tv_sec + (t2)->tv_sec; \
147 (sum)->tv_nsec = (t1)->tv_nsec + (t2)->tv_nsec; \
148 if ((sum)->tv_nsec >= 1000000000) { \
150 (sum)->tv_nsec -= 1000000000; \
154 #define float_to_timespec( f1 , t1 ) \
156 (t1)->tv_sec = (int)(f1), \
157 (t1)->tv_nsec = (int)(((f1)-(float)((t1)->tv_sec))*1000000000.0), \
161 #define float_to_timespec_value(f1, t1) \
163 (t1).tv_sec = (int)(f1), \
164 (t1).tv_nsec = (int)(((f1)-(float)((t1).tv_sec))*1000000000.0), \
168 #include <string.h> /* for memset */
170 static void inline msec2timespec(long msec, struct timespec *timespec)
172 memset(timespec, 0, sizeof(struct timespec));
175 timespec->tv_sec = msec/1000;
176 timespec->tv_nsec = (msec % 1000) * 1000000;
178 timespec->tv_sec = 0;
179 timespec->tv_nsec = msec * 1000000;
183 /* ------------------------------------------------------------ */
185 static int inline timespec_lessthan_msec(struct timespec *timespec, long msec)
187 struct timespec msec_timespec = {0, 0};
189 msec2timespec(msec, &msec_timespec);
190 return smaller_timespec(timespec, &msec_timespec);
193 /* ------------------------------------------------------------ */
195 static void inline msec_addto_timespec(long msec, struct timespec *timespec)
197 struct timespec msec_timespec = {0, 0};
199 msec2timespec(msec, &msec_timespec);
200 incr_timespec(timespec, &msec_timespec);
203 #endif /* _MARTE_MISC_TIMESPEC_OPERATIONS_H_ */