]> rtime.felk.cvut.cz Git - frescor/fosa.git/blob - src_partikle/fosa_clocks_and_timers.c
e1b4db7aaacd836dfc421e09332ce0912b418913
[frescor/fosa.git] / src_partikle / fosa_clocks_and_timers.c
1 // -----------------------------------------------------------------------
2 //  Copyright (C) 2006 - 2008 FRESCOR consortium partners:
3 //
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
10 //    ENEA                                   SWEDEN
11 //    Thales Communication S.A.              FRANCE
12 //    Visual Tools S.A.                      SPAIN
13 //    Rapita Systems Ltd                     UK
14 //    Evidence                               ITALY
15 //
16 //    See http://www.frescor.org for a link to partners' websites
17 //
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
21 //        made of this code.
22 //
23 //
24 //  based on previous work (FSF) done in the FIRST project
25 //
26 //   Copyright (C) 2005  Mälardalen University, SWEDEN
27 //                       Scuola Superiore S.Anna, ITALY
28 //                       Universidad de Cantabria, SPAIN
29 //                       University of York, UK
30 //
31 //   FSF API web pages: http://marte.unican.es/fsf/docs
32 //                      http://shark.sssup.it/contrib/first/docs/
33 //
34 //   This file is part of FOSA (Frsh Operating System Adaption)
35 //
36 //  FOSA is free software; you can redistribute it and/or modify it
37 //  under terms of the GNU General Public License as published by the
38 //  Free Software Foundation; either version 2, or (at your option) any
39 //  later version.  FOSA is distributed in the hope that it will be
40 //  useful, but WITHOUT ANY WARRANTY; without even the implied warranty
41 //  of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
42 //  General Public License for more details. You should have received a
43 //  copy of the GNU General Public License along with FOSA; see file
44 //  COPYING. If not, write to the Free Software Foundation, 675 Mass Ave,
45 //  Cambridge, MA 02139, USA.
46 //
47 //  As a special exception, including FOSA header files in a file,
48 //  instantiating FOSA generics or templates, or linking other files
49 //  with FOSA objects to produce an executable application, does not
50 //  by itself cause the resulting executable application to be covered
51 //  by the GNU General Public License. This exception does not
52 //  however invalidate any other reasons why the executable file might be
53 //  covered by the GNU Public License.
54 // -----------------------------------------------------------------------
55 //==============================================
56 //  ********  ******    ********  **********
57 //  **///// /**    **  **//////  /**     /**
58 //  **      /**    ** /**        /**     /**
59 //  ******* /**    ** /********* /**********
60 //  **////  /**    ** ////////** /**//////**
61 //  **      /**    **        /** /**     /**
62 //  **      /**    **  ********  /**     /**
63 //  //       /******/  ////////   //      // 
64 //
65 // FOSA(Frescor Operating System Adaptation layer)
66 //================================================
67
68 #include <fosa_clocks_and_timers.h>
69 #include <fosa_time.h>
70 #include <stdlib.h>
71
72 /*************************
73  * Timing: Clocks
74  *************************/
75 int fosa_clock_get_time(fosa_clock_id_t clockid, fosa_abs_time_t *current_time)
76 {       
77         int err;
78         struct timespec now;
79         
80         err = clock_gettime (clockid, &now);
81         *current_time = fosa_timespec_to_abs_time(now);
82         
83         return 0;
84 }
85
86
87 int fosa_thread_get_cputime_clock(fosa_thread_id_t tid, fosa_clock_id_t *clockid)
88 {
89   return pthread_getcpuclockid (tid, clockid);
90 }
91
92
93
94
95 /*************************
96  * Timing: Timers
97  *************************/
98 int fosa_timer_create
99     (fosa_clock_id_t clockid, fosa_signal_t signal, fosa_signal_info_t info,
100      fosa_timer_id_t *timerid)
101  {
102         struct sigevent se;
103         struct sigaction act, oact;
104
105         sigaction (signal, NULL, &oact);
106         act = oact;
107         act.sa_flags = SA_SIGINFO;      // accept signal queuing
108         sigaction (signal, &act, NULL);
109         
110         se.sigev_notify = SIGEV_SIGNAL;
111         se.sigev_signo = signal;
112         
113         se.sigev_value.sival_int = info.sival_int;
114         se.sigev_value.sival_ptr = info.sival_ptr;
115
116         return timer_create (clockid, &se, timerid);
117 }
118
119
120 int fosa_timer_create_with_receiver
121     (fosa_clock_id_t clockid, fosa_signal_t signal, fosa_signal_info_t info,
122      fosa_timer_id_t *timerid, fosa_thread_id_t receiver)
123 {
124   return fosa_timer_create (clockid, signal, info, timerid);
125 }
126
127 int fosa_timer_delete(fosa_timer_id_t timerid)
128 {
129         return timer_delete (timerid);
130 }
131
132
133 int fosa_rel_timer_arm (fosa_timer_id_t timerid, const fosa_rel_time_t *value)
134 {
135         struct itimerspec tvalue; 
136         
137         tvalue.it_value = fosa_rel_time_to_timespec(*value);
138         tvalue.it_interval = (struct timespec) {0,0};
139         
140         if (timer_settime (timerid, 0, &tvalue, NULL))
141                 return FOSA_EINVAL;
142         
143         return 0;
144 }
145
146 int fosa_abs_timer_arm (fosa_timer_id_t timerid, const fosa_abs_time_t *value)
147 {
148         struct itimerspec tvalue; 
149         
150         tvalue.it_value = fosa_abs_time_to_timespec(*value);
151         tvalue.it_interval = (struct timespec) {0,0};
152         
153         if (timer_settime (timerid, TIMER_ABSTIME, &tvalue, NULL))
154                 return FOSA_EINVAL;
155         
156         return 0;
157 }
158
159
160 int fosa_timer_get_remaining_time
161                 (fosa_timer_id_t timerid, fosa_rel_time_t *remaining_time)
162 {
163         struct itimerspec value;
164         
165         if (timer_gettime (timerid, &value))
166                 return FOSA_EINVAL;
167         
168         *remaining_time = fosa_timespec_to_rel_time (value.it_value);
169         return 0;
170 }
171
172
173 int fosa_timer_disarm (fosa_timer_id_t timerid, fosa_rel_time_t *remaining_time)
174 {
175         struct itimerspec null_timer, old;
176         
177         // NULL timer -> disarm
178         null_timer = (struct itimerspec) {
179                 .it_value = {0, 0},
180                 .it_interval = {0, 0},
181         };
182         
183         if (timer_settime (timerid, 0, &null_timer, &old))
184                 return FOSA_EINVAL;
185         
186         if (remaining_time)
187                 *remaining_time = fosa_timespec_to_rel_time (old.it_value);
188                 
189         return 0;
190 }
191