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
/*
 * 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_HEAP_H
#define _XENOMAI_ALCHEMY_HEAP_H
 
#include <stdint.h>
#include <alchemy/timer.h>
 
/**
 * @addtogroup alchemy_heap
 * @{
 */
 
/** Creation flags. */
#define H_PRIO    0x1    /* Pend by task priority order. */
#define H_FIFO    0x0    /* Pend by FIFO order. */
#define H_SINGLE  0x4    /* Manage as single-block area. */
 
struct RT_HEAP {
   uintptr_t handle;
};
 
typedef struct RT_HEAP RT_HEAP;
 
/**
 * @brief Heap status descriptor
 * @anchor RT_HEAP_INFO
 *
 * This structure reports various static and runtime information about
 * a real-time heap, returned by a call to rt_heap_inquire().
 */
struct RT_HEAP_INFO {
   /**
    * Number of tasks waiting for available memory in
    * rt_heap_alloc().
    */
   int nwaiters;
   /**
    * Creation mode flags as given to rt_heap_create().
    */
   int mode;
   /**
    * Size of heap (in bytes) as given to rt_heap_create(). The
    * maximum amount of memory available from this heap may be
    * larger, due to internal padding.
    */
   size_t heapsize;
   /**
    * Maximum amount of memory available from the heap. This
    * value accounts for the overhead of internal data structures
    * required to maintain the heap.
    */
   size_t usablemem;
   /**
    * Amount of heap memory currently consumed. info.usablemem -
    * info.usedmem computes the current amount of free memory in
    * the relevant heap.
    */
   size_t usedmem;
   /**
    * Name of heap.
    */
   char name[XNOBJECT_NAME_LEN];
};
 
typedef struct RT_HEAP_INFO RT_HEAP_INFO;
 
#ifdef __cplusplus
extern "C" {
#endif
 
int rt_heap_create(RT_HEAP *heap,
          const char *name,
          size_t heapsize,
          int mode);
 
int rt_heap_delete(RT_HEAP *heap);
 
int rt_heap_alloc_timed(RT_HEAP *heap,
           size_t size,
           const struct timespec *abs_timeout,
           void **blockp);
 
static inline
int rt_heap_alloc_until(RT_HEAP *heap,
           size_t size, RTIME timeout, void **blockp)
{
   struct timespec ts;
   return rt_heap_alloc_timed(heap, size,
                  alchemy_abs_timeout(timeout, &ts),
                  blockp);
}
 
static inline
int rt_heap_alloc(RT_HEAP *heap,
         size_t size, RTIME timeout, void **blockp)
{
   struct timespec ts;
   return rt_heap_alloc_timed(heap, size,
                  alchemy_rel_timeout(timeout, &ts),
                  blockp);
}
 
int rt_heap_free(RT_HEAP *heap,
        void *block);
 
int rt_heap_inquire(RT_HEAP *heap,
           RT_HEAP_INFO *info);
 
int rt_heap_bind(RT_HEAP *heap,
        const char *name,
        RTIME timeout);
 
int rt_heap_unbind(RT_HEAP *heap);
 
#ifdef __cplusplus
}
#endif
 
/** @} */
 
#endif /* _XENOMAI_ALCHEMY_HEAP_H */