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 *---------------------------------------------------------------------------*/
98 #ifndef _MARTE_MISC_TIMESPEC_OPERATIONS_H_
99 #define _MARTE_MISC_TIMESPEC_OPERATIONS_H_
103 #define smaller_timespec(t1, t2) \
105 (t1)->tv_sec < (t2)->tv_sec || ((t1)->tv_sec == (t2)->tv_sec && \
106 (t1)->tv_nsec < (t2)->tv_nsec) \
109 #define smaller_or_equal_timespec(t1, t2) \
111 (t1)->tv_sec < (t2)->tv_sec || ((t1)->tv_sec == (t2)->tv_sec && \
112 (t1)->tv_nsec <= (t2)->tv_nsec) \
115 #define incr_timespec(t1, t2) \
117 (t1)->tv_sec += (t2)->tv_sec; \
118 (t1)->tv_nsec += (t2)->tv_nsec; \
119 if ((t1)->tv_nsec >= 1000000000) { \
121 (t1)->tv_nsec -= 1000000000; \
125 #define decr_timespec(t1, t2) \
127 if ((t1)->tv_nsec < (t2)->tv_nsec) { \
128 (t1)->tv_sec -= (t2)->tv_sec + 1; \
129 (t1)->tv_nsec = (t1)->tv_nsec + 1000000000 - (t2)->tv_nsec; \
131 (t1)->tv_sec -= (t2)->tv_sec; \
132 (t1)->tv_nsec -= (t2)->tv_nsec; \
137 #define add_timespec( sum , t1 , t2 ) \
139 (sum)->tv_sec = (t1)->tv_sec + (t2)->tv_sec; \
140 (sum)->tv_nsec = (t1)->tv_nsec + (t2)->tv_nsec; \
141 if ((sum)->tv_nsec >= 1000000000) { \
143 (sum)->tv_nsec -= 1000000000; \
147 #define float_to_timespec( f1 , t1 ) \
149 (t1)->tv_sec = (int)(f1), \
150 (t1)->tv_nsec = (int)(((f1)-(float)((t1)->tv_sec))*1000000000.0), \
154 #define float_to_timespec_value(f1, t1) \
156 (t1).tv_sec = (int)(f1), \
157 (t1).tv_nsec = (int)(((f1)-(float)((t1).tv_sec))*1000000000.0), \
161 #endif /* _MARTE_MISC_TIMESPEC_OPERATIONS_H_ */