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
/*
 * 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_BUFFER_H
#define _XENOMAI_ALCHEMY_BUFFER_H
 
#include <stdint.h>
#include <alchemy/timer.h>
 
/**
 * @addtogroup alchemy_buffer
 * @{
 */
 
/** Creation flags. */
#define B_PRIO  0x1    /* Pend by task priority order. */
#define B_FIFO  0x0    /* Pend by FIFO order. */
 
struct RT_BUFFER {
   uintptr_t handle;
};
 
typedef struct RT_BUFFER RT_BUFFER;
 
/**
 * @brief Buffer status descriptor
 * @anchor RT_BUFFER_INFO
 *
 * This structure reports various static and runtime information about
 * a real-time buffer, returned by a call to rt_buffer_inquire().
 */
struct RT_BUFFER_INFO {
   /**
    * Number of tasks waiting on the read side of the buffer for
    * input data.
    */
   int iwaiters;
   /**
    * Number of tasks waiting on the write side of the buffer for
    * sending out data.
    */
   int owaiters;
   /**
    * Overall size of buffer (in bytes).
    */
   size_t totalmem;
   /**
    * Amount of memory currently available for holding more data.
    */
   size_t availmem;
   /**
    * Name of the buffer.
    */
   char name[XNOBJECT_NAME_LEN];
};
 
typedef struct RT_BUFFER_INFO RT_BUFFER_INFO;
 
#ifdef __cplusplus
extern "C" {
#endif
 
int rt_buffer_create(RT_BUFFER *bf,
            const char *name,
            size_t bufsz,
            int mode);
 
int rt_buffer_delete(RT_BUFFER *bf);
 
ssize_t rt_buffer_write_timed(RT_BUFFER *bf,
                 const void *ptr, size_t size,
                 const struct timespec *abs_timeout);
 
static inline
ssize_t rt_buffer_write_until(RT_BUFFER *bf,
                 const void *ptr, size_t size,
                 RTIME timeout)
{
   struct timespec ts;
   return rt_buffer_write_timed(bf, ptr, size,
                    alchemy_abs_timeout(timeout, &ts));
}
 
static inline
ssize_t rt_buffer_write(RT_BUFFER *bf,
           const void *ptr, size_t size,
           RTIME timeout)
{
   struct timespec ts;
   return rt_buffer_write_timed(bf, ptr, size,
                    alchemy_rel_timeout(timeout, &ts));
}
 
ssize_t rt_buffer_read_timed(RT_BUFFER *bf,
                void *ptr, size_t size,
                const struct timespec *abs_timeout);
 
static inline
ssize_t rt_buffer_read_until(RT_BUFFER *bf,
                void *ptr, size_t size,
                RTIME timeout)
{
   struct timespec ts;
   return rt_buffer_read_timed(bf, ptr, size,
                   alchemy_abs_timeout(timeout, &ts));
}
 
static inline
ssize_t rt_buffer_read(RT_BUFFER *bf,
              void *ptr, size_t size,
              RTIME timeout)
{
   struct timespec ts;
   return rt_buffer_read_timed(bf, ptr, size,
                   alchemy_rel_timeout(timeout, &ts));
}
 
int rt_buffer_clear(RT_BUFFER *bf);
 
int rt_buffer_inquire(RT_BUFFER *bf,
             RT_BUFFER_INFO *info);
 
int rt_buffer_bind(RT_BUFFER *bf,
          const char *name, RTIME timeout);
 
int rt_buffer_unbind(RT_BUFFER *bf);
 
#ifdef __cplusplus
}
#endif
 
/** @} */
 
#endif /* _XENOMAI_ALCHEMY_BUFFER_H */