intertask_interface.h 8.03 KB
Newer Older
Cedric Roux's avatar
 
Cedric Roux committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*******************************************************************************

  Eurecom OpenAirInterface
  Copyright(c) 1999 - 2012 Eurecom

  This program is free software; you can redistribute it and/or modify it
  under the terms and conditions of the GNU General Public License,
  version 2, as published by the Free Software Foundation.

  This program is distributed in the hope it will be useful, but WITHOUT
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  more details.

  You should have received a copy of the GNU General Public License along with
  this program; if not, write to the Free Software Foundation, Inc.,
  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.

  The full GNU General Public License is included in this distribution in
  the file called "COPYING".

  Contact Information
  Openair Admin: openair_admin@eurecom.fr
  Openair Tech : openair_tech@eurecom.fr
  Forums       : http://forums.eurecom.fr/openairinterface
  Address      : EURECOM, Campus SophiaTech, 450 Route des Chappes
                 06410 Biot FRANCE

*******************************************************************************/

/** @defgroup _intertask_interface_impl_ Intertask Interface Mechanisms
 * Implementation
 * @ingroup _ref_implementation_
 * @{
 */

37
#include <sys/epoll.h>
38

39
40
41
42
#ifdef RTAI
# include <rtai_sem.h>
#endif

Cedric Roux's avatar
 
Cedric Roux committed
43
44
45
46
47
48
49
#ifndef INTERTASK_INTERFACE_H_
#define INTERTASK_INTERFACE_H_

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

50
#include "intertask_interface_conf.h"
Cedric Roux's avatar
 
Cedric Roux committed
51
52
#include "intertask_interface_types.h"

Cedric Roux's avatar
Cedric Roux committed
53
54
55
56
57
58
59
#define ITTI_MSG_ID(mSGpTR)                 ((mSGpTR)->ittiMsgHeader.messageId)
#define ITTI_MSG_ORIGIN_ID(mSGpTR)          ((mSGpTR)->ittiMsgHeader.originTaskId)
#define ITTI_MSG_DESTINATION_ID(mSGpTR)     ((mSGpTR)->ittiMsgHeader.destinationTaskId)
#define ITTI_MSG_INSTANCE(mSGpTR)           ((mSGpTR)->ittiMsgHeader.instance)
#define ITTI_MSG_NAME(mSGpTR)               itti_get_message_name(ITTI_MSG_ID(mSGpTR))
#define ITTI_MSG_ORIGIN_NAME(mSGpTR)        itti_get_task_name(ITTI_MSG_ORIGIN_ID(mSGpTR))
#define ITTI_MSG_DESTINATION_NAME(mSGpTR)   itti_get_task_name(ITTI_MSG_DESTINATION_ID(mSGpTR))
60

Cedric Roux's avatar
 
Cedric Roux committed
61
62
63
64
/* Make the message number platform specific */
typedef unsigned long message_number_t;
#define MESSAGE_NUMBER_SIZE (sizeof(unsigned long))

65
typedef enum message_priorities_e {
Cedric Roux's avatar
 
Cedric Roux committed
66
67
68
69
70
71
72
    MESSAGE_PRIORITY_MAX       = 100,
    MESSAGE_PRIORITY_MAX_LEAST = 85,
    MESSAGE_PRIORITY_MED_PLUS  = 70,
    MESSAGE_PRIORITY_MED       = 55,
    MESSAGE_PRIORITY_MED_LEAST = 40,
    MESSAGE_PRIORITY_MIN_PLUS  = 25,
    MESSAGE_PRIORITY_MIN       = 10,
73
} message_priorities_t;
Cedric Roux's avatar
 
Cedric Roux committed
74
75
76

typedef struct message_info_s {
    task_id_t id;
77
    message_priorities_t priority;
Cedric Roux's avatar
 
Cedric Roux committed
78
79
80
    /* Message payload size */
    MessageHeaderSize size;
    /* Printable name */
81
    const char * const name;
Cedric Roux's avatar
 
Cedric Roux committed
82
83
} message_info_t;

84
typedef enum task_priorities_e {
Cedric Roux's avatar
 
Cedric Roux committed
85
86
87
88
89
90
91
    TASK_PRIORITY_MAX       = 100,
    TASK_PRIORITY_MAX_LEAST = 85,
    TASK_PRIORITY_MED_PLUS  = 70,
    TASK_PRIORITY_MED       = 55,
    TASK_PRIORITY_MED_LEAST = 40,
    TASK_PRIORITY_MIN_PLUS  = 25,
    TASK_PRIORITY_MIN       = 10,
92
} task_priorities_t;
Cedric Roux's avatar
 
Cedric Roux committed
93

94
95
typedef struct task_info_s {
    thread_id_t thread;
96
    task_id_t   parent_task;
97
98
    task_priorities_t priority;
    unsigned int queue_size;
99
100
101
102
    /* Printable name */
    const char * const name;
} task_info_t;

103
104
105
106
107
108
109
/** \brief Update the itti LTE time reference for messages
 \param current reference frame
 \param current reference slot
 @returns < 0 on failure, 0 otherwise
 **/
void itti_update_lte_time(uint32_t frame, uint8_t slot);

Cedric Roux's avatar
 
Cedric Roux committed
110
111
112
113
/** \brief Send a broadcast message to every task
 \param message_p Pointer to the message to send
 @returns < 0 on failure, 0 otherwise
 **/
114
int itti_send_broadcast_message(MessageDef *message_p);
Cedric Roux's avatar
 
Cedric Roux committed
115
116
117
118
119
120
121

/** \brief Send a message to a task (could be itself)
 \param task_id Task ID
 \param instance Instance of the task used for virtualization
 \param message Pointer to the message to send
 @returns -1 on failure, 0 otherwise
 **/
122
int itti_send_msg_to_task(task_id_t task_id, instance_t instance, MessageDef *message);
Cedric Roux's avatar
 
Cedric Roux committed
123

124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/** \brief Add a new fd to monitor.
 * NOTE: it is up to the user to read data associated with the fd
 *  \param task_id Task ID of the receiving task
 *  \param fd The file descriptor to monitor
 **/
void itti_subscribe_event_fd(task_id_t task_id, int fd);

/** \brief Remove a fd from the list of fd to monitor
 *  \param task_id Task ID of the task
 *  \param fd The file descriptor to remove
 **/
void itti_unsubscribe_event_fd(task_id_t task_id, int fd);

/** \brief Return the list of events excluding the fd associated with itti
 *  \param task_id Task ID of the task
 *  \param events events list
 *  @returns number of events to handle
 **/
int itti_get_events(task_id_t task_id, struct epoll_event **events);

Cedric Roux's avatar
 
Cedric Roux committed
144
145
146
147
148
/** \brief Retrieves a message in the queue associated to task_id.
 * If the queue is empty, the thread is blocked till a new message arrives.
 \param task_id Task ID of the receiving task
 \param received_msg Pointer to the allocated message
 **/
149
void itti_receive_msg(task_id_t task_id, MessageDef **received_msg);
Cedric Roux's avatar
 
Cedric Roux committed
150

151
/** \brief Try to retrieves a message in the queue associated to task_id.
Cedric Roux's avatar
 
Cedric Roux committed
152
153
154
 \param task_id Task ID of the receiving task
 \param received_msg Pointer to the allocated message
 **/
155
void itti_poll_msg(task_id_t task_id, MessageDef **received_msg);
Cedric Roux's avatar
 
Cedric Roux committed
156
157
158
159
160
161
162

/** \brief Start thread associated to the task
 * \param task_id task to start
 * \param start_routine entry point for the task
 * \param args_p Optional argument to pass to the start routine
 * @returns -1 on failure, 0 otherwise
 **/
163
int itti_create_task(task_id_t task_id,
Cedric Roux's avatar
Cedric Roux committed
164
165
                     void *(*start_routine) (void *),
                     void *args_p);
Cedric Roux's avatar
 
Cedric Roux committed
166

167
168
169
170
171
172
173
#ifdef RTAI
/** \brief Mark the task as a real time task
 * \param task_id task to mark as real time
 **/
void itti_set_task_real_time(task_id_t task_id);
#endif

174
175
176
177
178
/** \brief Indicates to ITTI if newly created tasks should wait for all tasks to be ready
 * \param wait_tasks non 0 to make new created tasks to wait, 0 to let created tasks to run
 **/
void itti_wait_ready(int wait_tasks);

Cedric Roux's avatar
 
Cedric Roux committed
179
180
181
/** \brief Mark the task as in ready state
 * \param task_id task to mark as ready
 **/
182
183
void itti_mark_task_ready(task_id_t task_id);

184
185
186
187
/** \brief Exit the current task.
 **/
void itti_exit_task(void);

188
189
190
191
/** \brief Indicate that the task is completed and initiate termination of all tasks.
 * \param task_id task that is completed
 **/
void itti_terminate_tasks(task_id_t task_id);
Cedric Roux's avatar
 
Cedric Roux committed
192
193
194
195

/** \brief Return the printable string associated with the message
 * \param message_id Id of the message
 **/
196
const char *itti_get_message_name(MessagesIds message_id);
Cedric Roux's avatar
 
Cedric Roux committed
197

Cedric Roux's avatar
Cedric Roux committed
198
199
200
/** \brief Return the printable string associated with a task id
 * \param thread_id Id of the task
 **/
201
const char *itti_get_task_name(task_id_t task_id);
Cedric Roux's avatar
Cedric Roux committed
202

Cedric Roux's avatar
 
Cedric Roux committed
203
/** \brief Alloc and memset(0) a new itti message.
204
205
206
 * \param origin_task_id Task ID of the sending task
 * \param message_id Message ID
 * @returns NULL in case of failure or newly allocated mesage ref
Cedric Roux's avatar
 
Cedric Roux committed
207
 **/
208
inline MessageDef *itti_alloc_new_message(
Cedric Roux's avatar
Cedric Roux committed
209
210
211
212
213
214
215
216
217
218
219
220
221
    task_id_t         origin_task_id,
    MessagesIds       message_id);

/** \brief Alloc and memset(0) a new itti message.
 * \param origin_task_id Task ID of the sending task
 * \param message_id Message ID
 * \param size size of the payload to send
 * @returns NULL in case of failure or newly allocated mesage ref
 **/
inline MessageDef *itti_alloc_new_message_sized(
    task_id_t         origin_task_id,
    MessagesIds       message_id,
    MessageHeaderSize size);
Cedric Roux's avatar
 
Cedric Roux committed
222

223
224
225
226
227
228
229
230
231
/** \brief handle signals and wait for all threads to join when the process complete.
 * This function should be called from the main thread after having created all ITTI tasks.
 **/
void itti_wait_tasks_end(void);

/** \brief Send a termination message to all tasks.
 * \param task_id task that is broadcasting the message.
 **/
void itti_send_terminate_message(task_id_t task_id);
Cedric Roux's avatar
 
Cedric Roux committed
232

233
void *itti_malloc(task_id_t origin_task_id, task_id_t destination_task_id, ssize_t size);
234
235
236

void itti_free(task_id_t task_id, void *ptr);

Cedric Roux's avatar
 
Cedric Roux committed
237
238
#endif /* INTERTASK_INTERFACE_H_ */
/* @} */