Module: xenomai-rpm
Branch: queue/vfile
Commit: ed4dce52fcde91d54b66d0192af52e60314905fe
URL:    
http://git.xenomai.org/?p=xenomai-rpm.git;a=commit;h=ed4dce52fcde91d54b66d0192af52e60314905fe

Author: Philippe Gerum <r...@xenomai.org>
Date:   Wed Apr 28 17:01:42 2010 +0200

nucleus/heap: convert to vfile

---

 ksrc/nucleus/heap.c |  188 ++++++++++++++++++++++++++++++---------------------
 1 files changed, 112 insertions(+), 76 deletions(-)

diff --git a/ksrc/nucleus/heap.c b/ksrc/nucleus/heap.c
index afcc4f8..def742b 100644
--- a/ksrc/nucleus/heap.c
+++ b/ksrc/nucleus/heap.c
@@ -66,18 +66,123 @@ HEAP {
 #include <nucleus/pod.h>
 #include <nucleus/thread.h>
 #include <nucleus/heap.h>
+#include <nucleus/vfile.h>
 #include <nucleus/assert.h>
 #include <asm/xenomai/bits/heap.h>
 
-xnheap_t kheap;                /* System heap */
+struct xnheap kheap;           /* System heap */
 EXPORT_SYMBOL_GPL(kheap);
 
 #if CONFIG_XENO_OPT_SYS_STACKPOOLSZ > 0
-xnheap_t kstacks;      /* Private stack pool */
+struct xnheap kstacks;         /* Private stack pool */
 #endif
 
-static DEFINE_XNQUEUE(heapq);  /* Heap list for /proc reporting */
-static unsigned long heapq_rev;
+static DEFINE_XNQUEUE(heapq);  /* Heap list for v-file dump */
+
+#ifdef CONFIG_PROC_FS
+
+static struct xnvfile_rev_tag vfile_tag;
+
+static struct xnvfile_snapshot_ops vfile_ops;
+
+struct vfile_priv {
+       int nrheaps;
+       struct xnholder *curr;
+};
+
+struct vfile_data {
+       size_t usable_mem;
+       size_t used_mem;
+       size_t page_size;
+       char label[XNOBJECT_NAME_LEN+16];
+};
+
+static struct xnvfile_snapshot vfile = {
+       .privsz = sizeof(struct vfile_priv),
+       .datasz = sizeof(struct vfile_data),
+       .tag = &vfile_tag,
+       .ops = &vfile_ops,
+};
+
+static int vfile_rewind(struct xnvfile_snapshot_iterator *it)
+{
+       struct vfile_priv *priv = xnvfile_snapshot_iterator_priv(it);
+
+       priv->nrheaps = countq(&heapq);
+       priv->curr = getheadq(&heapq);
+
+       return 0;
+}
+
+static void *vfile_begin(struct xnvfile_snapshot_iterator *it)
+{
+       struct vfile_priv *priv = xnvfile_snapshot_iterator_priv(it);
+
+       return kmalloc(priv->nrheaps * sizeof(struct vfile_data),
+                      GFP_KERNEL);
+}
+
+static void vfile_end(struct xnvfile_snapshot_iterator *it, void *buf)
+{
+       kfree(buf);
+}
+
+static int vfile_next(struct xnvfile_snapshot_iterator *it, void *data)
+{
+       struct vfile_priv *priv = xnvfile_snapshot_iterator_priv(it);
+       struct vfile_data *p = data;
+       struct xnheap *heap;
+
+       if (priv->curr == NULL)
+               return 0;       /* We are done. */
+
+       heap = container_of(priv->curr, struct xnheap, stat_link);
+       priv->curr = nextq(&heapq, priv->curr);
+
+       p->usable_mem = xnheap_usable_mem(heap);
+       p->used_mem = xnheap_used_mem(heap);
+       p->page_size = xnheap_page_size(heap);
+       strncpy(p->label, heap->label, sizeof(p->label));
+
+       return 1;
+}
+
+static int vfile_show(struct xnvfile_snapshot_iterator *it, void *data)
+{
+       struct vfile_data *p = data;
+
+       if (p == NULL)
+               xnvfile_printf(it, "%9s %9s  %6s  %s\n",
+                              "TOTAL", "USED", "PAGESZ", "NAME");
+       else
+               xnvfile_printf(it, "%9Zu %9Zu  %6Zu  %.*s\n",
+                              p->usable_mem,
+                              p->used_mem,
+                              p->page_size,
+                              sizeof(p->label),
+                              p->label);
+       return 0;
+}
+
+static struct xnvfile_snapshot_ops vfile_ops = {
+       .rewind = vfile_rewind,
+       .begin = vfile_begin,
+       .next = vfile_next,
+       .end = vfile_end,
+       .show = vfile_show,
+};
+
+void xnheap_init_proc(void)
+{
+       xnvfile_init_snapshot("heap", &vfile, NULL);
+}
+
+void xnheap_cleanup_proc(void)
+{
+       xnvfile_destroy_snapshot(&vfile);
+}
+
+#endif /* CONFIG_PROC_FS */
 
 static void init_extent(xnheap_t *heap, xnextent_t *extent)
 {
@@ -241,7 +346,7 @@ int xnheap_init(xnheap_t *heap,
 
        xnlock_get_irqsave(&nklock, s);
        appendq(&heapq, &heap->stat_link);
-       heapq_rev++;
+       xnvfile_touch_tag(&vfile_tag);
        xnlock_put_irqrestore(&nklock, s);
 
        xnarch_init_display_context(heap);
@@ -325,7 +430,7 @@ void xnheap_destroy(xnheap_t *heap,
 
        xnlock_get_irqsave(&nklock, s);
        removeq(&heapq, &heap->stat_link);
-       heapq_rev++;
+       xnvfile_touch_tag(&vfile_tag);
        xnlock_put_irqrestore(&nklock, s);
 
        if (!flushfn)
@@ -1298,7 +1403,7 @@ void xnheap_destroy_mapped(xnheap_t *heap,
 
        xnlock_get_irqsave(&nklock, s);
        removeq(&heapq, &heap->stat_link);
-       heapq_rev++;
+       xnvfile_touch_tag(&vfile_tag);
        xnlock_put_irqrestore(&nklock, s);
 
        len = xnheap_extentsize(heap);
@@ -1408,75 +1513,6 @@ void xnheap_destroy_mapped(xnheap_t *heap,
 }
 #endif /* !CONFIG_XENO_OPT_PERVASIVE */
 
-#ifdef CONFIG_PROC_FS
-
-#include <linux/proc_fs.h>
-
-static int heap_read_proc(char *page,
-                         char **start,
-                         off_t off, int count, int *eof, void *data)
-{
-       unsigned long rev;
-       xnholder_t *entry;
-       xnheap_t *heap;
-       int len;
-       spl_t s;
-
-       if (!xnpod_active_p())
-               return -ESRCH;
-
-       xnlock_get_irqsave(&nklock, s);
-
-restart:
-       len = 0;
-
-       entry = getheadq(&heapq);
-       while (entry) {
-               heap = container_of(entry, xnheap_t, stat_link);
-               len += sprintf(page + len,
-                              "size=%lu:used=%lu:pagesz=%lu  (%s)\n",
-                              xnheap_usable_mem(heap),
-                              xnheap_used_mem(heap),
-                              xnheap_page_size(heap),
-                              heap->label);
-
-               rev = heapq_rev;
-
-               xnlock_sync_irq(&nklock, s);
-
-               if (heapq_rev != rev)
-                       goto restart;
-
-               entry = nextq(&heapq, entry);
-       }
-
-       xnlock_put_irqrestore(&nklock, s);
-
-       len -= off;
-       if (len <= off + count)
-               *eof = 1;
-       *start = page + off;
-       if (len > count)
-               len = count;
-       if (len < 0)
-               len = 0;
-
-       return len;
-}
-
-void xnheap_init_proc(void)
-{
-       rthal_add_proc_leaf("heap", &heap_read_proc, NULL, NULL,
-                           rthal_proc_root);
-}
-
-void xnheap_cleanup_proc(void)
-{
-       remove_proc_entry("heap", rthal_proc_root);
-}
-
-#endif /* CONFIG_PROC_FS */
-
 EXPORT_SYMBOL_GPL(xnheap_init_mapped);
 EXPORT_SYMBOL_GPL(xnheap_destroy_mapped);
 


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

Reply via email to