And add the count of used bytes to the xnheap_desc structure. This allows
for checking for leaks in unit tests.
---
 include/asm-generic/syscall.h |    2 +-
 include/nucleus/heap.h        |    7 +++++++
 ksrc/nucleus/shadow.c         |   31 ++++++++++++++++++++++++++-----
 src/skins/common/sem_heap.c   |    4 ++--
 4 files changed, 36 insertions(+), 8 deletions(-)

diff --git a/include/asm-generic/syscall.h b/include/asm-generic/syscall.h
index 4154b46..a9cdc87 100644
--- a/include/asm-generic/syscall.h
+++ b/include/asm-generic/syscall.h
@@ -32,7 +32,7 @@
 #define __xn_sys_info          4       /* xnshadow_get_info(muxid,&info) */
 #define __xn_sys_arch          5       /* r = xnarch_local_syscall(args) */
 #define __xn_sys_trace         6       /* r = xntrace_xxx(...) */
-#define __xn_sys_sem_heap      7
+#define __xn_sys_heap_info     7
 #define __xn_sys_current       8       /* threadh = xnthread_handle(cur) */
 #define __xn_sys_current_info  9       /* r = xnshadow_current_info(&info) */
 #define __xn_sys_mayday        10      /* request mayday fixup */
diff --git a/include/nucleus/heap.h b/include/nucleus/heap.h
index 253dca3..53b3bb4 100644
--- a/include/nucleus/heap.h
+++ b/include/nucleus/heap.h
@@ -281,10 +281,17 @@ int xnheap_check_block(xnheap_t *heap,
 #define XNHEAP_DEV_NAME  "/dev/rtheap"
 #define XNHEAP_DEV_MINOR 254
 
+/* Possible arguments to the sys_heap_info syscall */
+#define XNHEAP_PROC_PRIVATE_HEAP 0
+#define XNHEAP_PROC_SHARED_HEAP  1
+#define XNHEAP_SYS_HEAP          2
+#define XNHEAP_SYS_STACKPOOL     3
+
 struct xnheap_desc {
        unsigned long handle;
        unsigned int size;
        unsigned long area;
+       unsigned long used;
 };
 
 #endif /* !_XENO_NUCLEUS_HEAP_H */
diff --git a/ksrc/nucleus/shadow.c b/ksrc/nucleus/shadow.c
index a228c91..bd0096f 100644
--- a/ksrc/nucleus/shadow.c
+++ b/ksrc/nucleus/shadow.c
@@ -2052,18 +2052,39 @@ static int xnshadow_sys_trace(struct pt_regs *regs)
        return err;
 }
 
-static int xnshadow_sys_sem_heap(struct pt_regs *regs)
+static int xnshadow_sys_heap_info(struct pt_regs *regs)
 {
        struct xnheap_desc hd, __user *u_hd;
        struct xnheap *heap;
-       unsigned global;
+       unsigned heap_nr;
 
-       global = __xn_reg_arg2(regs);
+       heap_nr = __xn_reg_arg2(regs);
        u_hd = (struct xnheap_desc __user *)__xn_reg_arg1(regs);
-       heap = &xnsys_ppd_get(global)->sem_heap;
+
+       switch(heap_nr) {
+       case XNHEAP_PROC_PRIVATE_HEAP:
+       case XNHEAP_PROC_SHARED_HEAP:
+               heap = &xnsys_ppd_get(heap_nr)->sem_heap;
+               break;
+
+       case XNHEAP_SYS_HEAP:
+               heap = &kheap;
+               break;
+
+#if CONFIG_XENO_OPT_SYS_STACKPOOLSZ > 0
+       case XNHEAP_SYS_STACKPOOL:
+               heap = &kstacks;
+               break;
+#endif
+
+       default:
+               return -EINVAL;
+       }
+
        hd.handle = (unsigned long)heap;
        hd.size = xnheap_extentsize(heap);
        hd.area = xnheap_base_memory(heap);
+       hd.used = xnheap_used_mem(heap);
 
        return __xn_safe_copy_to_user(u_hd, &hd, sizeof(*u_hd));
 }
@@ -2122,7 +2143,7 @@ static xnsysent_t __systab[] = {
        [__xn_sys_completion] = {&xnshadow_sys_completion, __xn_exec_lostage},
        [__xn_sys_barrier] = {&xnshadow_sys_barrier, __xn_exec_lostage},
        [__xn_sys_trace] = {&xnshadow_sys_trace, __xn_exec_any},
-       [__xn_sys_sem_heap] = {&xnshadow_sys_sem_heap, __xn_exec_lostage},
+       [__xn_sys_heap_info] = {&xnshadow_sys_heap_info, __xn_exec_lostage},
        [__xn_sys_current] = {&xnshadow_sys_current, __xn_exec_any},
        [__xn_sys_current_info] =
                {&xnshadow_sys_current_info, __xn_exec_shadow},
diff --git a/src/skins/common/sem_heap.c b/src/skins/common/sem_heap.c
index 2c9514e..baaa6a6 100644
--- a/src/skins/common/sem_heap.c
+++ b/src/skins/common/sem_heap.c
@@ -57,10 +57,10 @@ static void *map_sem_heap(unsigned int shared)
        int ret;
 
        hdesc = shared ? &global_hdesc : &private_hdesc;
-       ret = XENOMAI_SYSCALL2(__xn_sys_sem_heap, hdesc, shared);
+       ret = XENOMAI_SYSCALL2(__xn_sys_heap_info, hdesc, shared);
        if (ret < 0) {
                errno = -ret;
-               perror("Xenomai: sys_sem_heap");
+               perror("Xenomai: sys_heap_info");
                return MAP_FAILED;
        }
 
-- 
1.7.2.5


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

Reply via email to