Hi,

playing a stupid rt_heap user (actually I didn't just play this...), I
stumbled over this undocumented oddity:

rt_heap_create(&heap, name, 10000, H_PRIO|H_MAPPABLE);
rt_heap_alloc(&heap, 10000, TM_NONBLOCK, &ptr);

Creation is successful, allocation fails. The reason: while during
creation the net heap size is rounded down to page boundaries, the
allocation of memory > PAGE_SIZE is rounded up. One could add H_SINGLE
to the flags, but this may even result in allocating less memory than
the user expected, causing severe problems later.

How to resolve this best? I thought about rounding twice in
rt_head_create (one time the net size, the second time including the
overhead), but this encodes characteristics of the underlying heap
allocator into the skin (I have a generic heap allocator framework in
mind for 2.3). So I decided to do this rounding in xnheap_overhead()
instead, see attached patch. Hope I didn't skewed up any calculation. At
least the scenario above now works fine.

Jan
Index: include/nucleus/heap.h
===================================================================
--- include/nucleus/heap.h      (revision 1322)
+++ include/nucleus/heap.h      (working copy)
@@ -109,8 +109,14 @@ extern xnheap_t kheap;
 #define xnheap_used_mem(heap)        ((heap)->ubytes)
 #define xnheap_max_contiguous(heap)  ((heap)->maxcont)
 #define xnheap_overhead(hsize,psize) \
-((sizeof(xnextent_t) + (((hsize) - sizeof(xnextent_t)) / (psize)) + \
- XNHEAP_MINALIGNSZ - 1) & ~(XNHEAP_MINALIGNSZ - 1))
+({ \
+    u_long rounded_hsize = (hsize + psize - 1) & ~(psize - 1); \
+    u_long overhead = ((sizeof(xnextent_t) + \
+       (((rounded_hsize) - sizeof(xnextent_t)) / (psize)) + \
+       XNHEAP_MINALIGNSZ - 1) & ~(XNHEAP_MINALIGNSZ - 1)); \
+    overhead += rounded_hsize - hsize; \
+    overhead; \
+})
 
 #define xnmalloc(size)     xnheap_alloc(&kheap,size)
 #define xnfree(ptr)        xnheap_free(&kheap,ptr)

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core

Reply via email to