Hi all, as a reminder (userspace, native skin, shared heap) [1]: API documentation: "If the heap is shared, this value can be either zero, or the same value given to rt_heap_create()." This is not true. As the heapsize gets altered in rt_heap_create for page size alignment, the following call to rt_heap_alloc with the same value will fail.
Ex: rt_heap_create( ..., ..., 10000, ... ) rt_heap_alloc( ..., 10000, ..., .... ) -> This call fails I suggest only accepting zero as a valid size for shared heaps. about attached patch: 1) not tested 2) there are possible better names than H_ALL 3) the comments could be in a better english 4) i hope you get the idea thx kisda [1] https://mail.gna.org/public/xenomai-core/2006-01/msg00177.html
Index: include/native/heap.h
===================================================================
--- include/native/heap.h (Revision 465)
+++ include/native/heap.h (Arbeitskopie)
@@ -32,6 +32,9 @@
#define H_DMA 0x100 /* Use memory suitable for DMA. */
#define H_SHARED 0x200 /* Use mappable shared memory. */
+/* Operation flags. */
+#define H_ALL 0x0 /* Entire heap space. */
+
typedef struct rt_heap_info {
int nwaiters; /* !< Number of pending tasks. */
Index: ksrc/skins/native/heap.c
===================================================================
--- ksrc/skins/native/heap.c (Revision 465)
+++ ksrc/skins/native/heap.c (Arbeitskopie)
@@ -410,10 +410,9 @@
* from.
*
* @param size The requested size in bytes of the block. If the heap
- * is shared, this value can be either zero, or the same value given
- * to rt_heap_create(). In any case, the same block covering the
- * entire heap space will always be returned to all callers of this
- * service.
+ * is shared, H_ALL should be passed, as always the same block
+ * covering the entire heap space will be returned to all callers of
+ * this service.
*
* @param timeout The number of clock ticks to wait for a block of
* sufficient size to be available from a local heap (see
@@ -432,8 +431,7 @@
* @return 0 is returned upon success. Otherwise:
*
* - -EINVAL is returned if @a heap is not a heap descriptor, or @a
- * heap is shared (i.e. H_SHARED mode) and @a size is non-zero but
- * does not match the actual heap size passed to rt_heap_create().
+ * heap is shared (i.e. H_SHARED mode) and @a size is not H_ALL.
*
* - -EIDRM is returned if @a heap is a deleted heap descriptor.
*
@@ -503,12 +501,7 @@
if (!block)
{
- /* It's ok to pass zero for size here, since the requested
- size is implicitely the whole heap space; but if
- non-zero is given, it must match the actual heap
- size. */
-
- if (size > 0 && size != xnheap_size(&heap->heap_base))
+ if (size != H_ALL)
{
err = -EINVAL;
goto unlock_and_exit;
pgpsDlebpJPHk.pgp
Description: PGP signature
