]> rtime.felk.cvut.cz Git - frescor/fosa.git/blob - src_partikle/fosa_clocks_and_timers.c
f0284621f6875a06f7ef0f6029f6d6fbdec410fe
[frescor/fosa.git] / src_partikle / fosa_clocks_and_timers.c
1 // -----------------------------------------------------------------------
2 //  Copyright (C) 2006 - 2007 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. Politecnica  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 //  This file is part of the FRSH implementation
24 //
25 //  FRSH is free software; you can  redistribute it and/or  modify
26 //  it under the terms of  the GNU General Public License as published by
27 //  the Free Software Foundation;  either  version 2, or (at  your option)
28 //  any later version.
29 //
30 //  FRSH  is distributed  in  the hope  that  it  will  be useful,  but
31 //  WITHOUT  ANY  WARRANTY;     without  even the   implied   warranty  of
32 //  MERCHANTABILITY  or  FITNESS FOR  A  PARTICULAR PURPOSE. See  the  GNU
33 //  General Public License for more details.
34 //
35 //  You should have  received a  copy of  the  GNU  General Public License
36 //  distributed  with  FRSH;  see file COPYING.   If not,  write to the
37 //  Free Software  Foundation,  59 Temple Place  -  Suite 330,  Boston, MA
38 //  02111-1307, USA.
39 //
40 //  As a special exception, if you include this header file into source
41 //  files to be compiled, this header file does not by itself cause
42 //  the resulting executable to be covered by the GNU General Public
43 //  License.  This exception does not however invalidate any other
44 //  reasons why the executable file might be covered by the GNU General
45 //  Public License.
46 // -----------------------------------------------------------------------
47 //==============================================
48 //  ********  ******    ********  **********
49 //  **///// /**    **  **//////  /**     /**
50 //  **      /**    ** /**        /**     /**
51 //  ******* /**    ** /********* /**********
52 //  **////  /**    ** ////////** /**//////**
53 //  **      /**    **        /** /**     /**
54 //  **      /**    **  ********  /**     /**
55 //  //       /******/  ////////   //      // 
56 //
57 // FOSA(Frescor Operating System Adaptation layer)
58 //================================================
59
60 #include <fosa_clocks_and_timers.h>
61
62 /*************************
63  * Timing: Clocks
64  *************************/
65 int fosa_clock_get_time(fosa_clock_id_t clockid, struct timespec *current_time)
66 {
67         if (clock_gettime (clockid, current_time))
68                 return FOSA_EINVAL;
69         
70         return 0;
71 }
72
73
74 int fosa_thread_get_cputime_clock(fosa_thread_id_t tid, fosa_clock_id_t *clockid)
75 {
76   return pthread_getcpuclockid (tid, clockid);
77 }
78
79
80
81
82 /*************************
83  * Timing: Timers
84  *************************/
85 void void_handler (int signo) {};
86 int fosa_timer_create
87     (fosa_clock_id_t clockid, fosa_signal_t signal, fosa_signal_info_t info,
88      fosa_timer_id_t *timerid)
89  {
90         struct sigevent se;
91         struct sigaction act;
92
93         // Assumption: the signal should accept queued values
94         act.sa_handler = void_handler;
95         sigfillset (&act.sa_mask);      
96         act.sa_flags = SA_SIGINFO;      // accept signal queuing
97         sigaction (signal, &act, NULL);
98         
99         se.sigev_notify = SIGEV_SIGNAL;
100         se.sigev_signo = signal;
101         
102         se.sigev_value.sival_int = info.sival_int;
103         se.sigev_value.sival_ptr = info.sival_ptr;
104
105         return timer_create (clockid, &se, timerid);
106 }
107
108
109 int fosa_timer_create_with_receiver
110     (fosa_clock_id_t clockid, fosa_signal_t signal, fosa_signal_info_t info,
111      fosa_timer_id_t *timerid, fosa_thread_id_t receiver)
112 {
113   return fosa_timer_create (clockid, signal, info, timerid);
114 }
115
116 int fosa_timer_delete(fosa_timer_id_t timerid)
117 {
118         return timer_delete (timerid);
119 }
120
121
122 int fosa_timer_arm
123                 (fosa_timer_id_t timerid, bool abstime,
124                  const struct timespec *value)
125 {
126         struct timespec now;
127         
128         clock_gettime (CLOCK_REALTIME, &now);
129         
130         struct itimerspec tvalue =
131         {
132                 .it_value = (struct timespec) *value,
133                 .it_interval = {0,0},
134         };
135         
136         if (timer_settime (timerid, abstime, &tvalue, NULL))
137                 return EINVAL;
138         
139         return 0;
140 }
141
142
143 int fosa_timer_get_remaining_time
144                 (fosa_timer_id_t timerid, struct timespec *remaining_time)
145 {
146         struct itimerspec value;
147         
148         if (timer_gettime (timerid, &value))
149                 return EINVAL;
150         
151         *remaining_time = value.it_value;
152         return 0;
153 }
154
155
156 int fosa_timer_disarm(fosa_timer_id_t timerid, struct timespec
157                 *remaining_time)
158 {
159         struct itimerspec null_timer, old;
160         
161         // NULL timer -> disarm
162         null_timer = (struct itimerspec) {
163                 .it_value = {0, 0},
164                 .it_interval = {0, 0},
165         };
166         
167         if (timer_settime (timerid, 0, &null_timer, &old))
168                 return EINVAL;
169         
170         if (remaining_time)
171                 *remaining_time = old.it_value; 
172                 
173         return 0;
174 }
175