hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/*
 * Copyright (C) 2011 Philippe Gerum <rpm@xenomai.org>.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
 */
#ifndef _XENOMAI_ALCHEMY_QUEUE_H
#define _XENOMAI_ALCHEMY_QUEUE_H
 
#include <stdint.h>
#include <alchemy/timer.h>
 
/**
 * @addtogroup alchemy_queue
 * @{
 */
 
/** Creation flags. */
#define Q_PRIO  0x1    /* Pend by task priority order. */
#define Q_FIFO  0x0    /* Pend by FIFO order. */
 
#define Q_UNLIMITED 0    /* No size limit. */
 
/*
 * Operation flags.
 */
#define Q_NORMAL     0x0
#define Q_URGENT     0x1
#define Q_BROADCAST  0x2
 
struct RT_QUEUE {
   uintptr_t handle;
};
 
typedef struct RT_QUEUE RT_QUEUE;
 
/**
 * @brief Queue status descriptor
 * @anchor RT_QUEUE_INFO
 *
 * This structure reports various static and runtime information about
 * a real-time queue, returned by a call to rt_queue_inquire().
 */
struct RT_QUEUE_INFO {
   /**
    * Number of tasks currently waiting on the queue for
    * messages.
    */
   int nwaiters;
   /**
    * Number of messages pending in queue.
    */
   int nmessages;
   /**
    * Queue mode bits, as given to rt_queue_create().
    */
   int mode;
   /**
    * Maximum number of messages in queue, zero if unlimited.
    */
   size_t qlimit;
   /**
    * Size of memory pool for holding message buffers (in bytes).
    */
   size_t poolsize;
   /**
    * Amount of memory consumed from the buffer pool.
    */
   size_t usedmem;
   /**
    * Name of message queue.
    */
   char name[XNOBJECT_NAME_LEN];
};
 
typedef struct RT_QUEUE_INFO RT_QUEUE_INFO;
 
#ifdef __cplusplus
extern "C" {
#endif
 
int rt_queue_create(RT_QUEUE *queue,
           const char *name,
           size_t poolsize, size_t qlimit, int mode);
 
int rt_queue_delete(RT_QUEUE *queue);
 
void *rt_queue_alloc(RT_QUEUE *queue,
            size_t size);
 
int rt_queue_free(RT_QUEUE *queue,
         void *buf);
 
int rt_queue_send(RT_QUEUE *queue,
         const void *buf, size_t size, int mode);
 
int rt_queue_write(RT_QUEUE *queue,
          const void *buf, size_t size, int mode);
 
ssize_t rt_queue_receive_timed(RT_QUEUE *queue,
                  void **bufp,
                  const struct timespec *abs_timeout);
 
static inline
ssize_t rt_queue_receive_until(RT_QUEUE *queue,
                  void **bufp, RTIME timeout)
{
   struct timespec ts;
   return rt_queue_receive_timed(queue, bufp,
                     alchemy_abs_timeout(timeout, &ts));
}
 
static inline
ssize_t rt_queue_receive(RT_QUEUE *queue,
            void **bufp, RTIME timeout)
{
   struct timespec ts;
   return rt_queue_receive_timed(queue, bufp,
                     alchemy_rel_timeout(timeout, &ts));
}
 
ssize_t rt_queue_read_timed(RT_QUEUE *queue,
               void *buf, size_t size,
               const struct timespec *abs_timeout);
 
static inline
ssize_t rt_queue_read_until(RT_QUEUE *queue,
               void *buf, size_t size, RTIME timeout)
{
   struct timespec ts;
   return rt_queue_read_timed(queue, buf, size,
                  alchemy_abs_timeout(timeout, &ts));
}
 
static inline
ssize_t rt_queue_read(RT_QUEUE *queue,
             void *buf, size_t size, RTIME timeout)
{
   struct timespec ts;
   return rt_queue_read_timed(queue, buf, size,
                  alchemy_rel_timeout(timeout, &ts));
}
 
int rt_queue_flush(RT_QUEUE *queue);
 
int rt_queue_inquire(RT_QUEUE *queue,
            RT_QUEUE_INFO *info);
 
int rt_queue_bind(RT_QUEUE *queue,
         const char *name,
         RTIME timeout);
 
int rt_queue_unbind(RT_QUEUE *queue);
 
#ifdef __cplusplus
}
#endif
 
/** @} */
 
#endif /* _XENOMAI_ALCHEMY_QUEUE_H */