You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by st...@apache.org on 2016/01/20 07:11:48 UTC

[3/3] incubator-mynewt-larva git commit: add remote nmgr stats display. refactoring of stats code to share APIs amongst nmgr and shell.

add remote nmgr stats display.  refactoring of stats code to share APIs amongst nmgr and shell.


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/commit/a5b2c4bd
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/tree/a5b2c4bd
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/diff/a5b2c4bd

Branch: refs/heads/master
Commit: a5b2c4bd0b3fc57bb3b8fe01989bc0d01a01b7c4
Parents: 02b717b
Author: Sterling Hughes <st...@apache.org>
Authored: Tue Jan 19 22:11:31 2016 -0800
Committer: Sterling Hughes <st...@apache.org>
Committed: Tue Jan 19 22:11:31 2016 -0800

----------------------------------------------------------------------
 libs/json/include/json/json.h   |  1 +
 libs/json/src/json_encode.c     | 16 +++++++++++
 sys/stats/include/stats/stats.h | 10 ++++++-
 sys/stats/src/stats.c           | 52 +++++++++++++++++++++++++-----------
 sys/stats/src/stats_nmgr.c      | 26 +++++++++++++-----
 sys/stats/src/stats_shell.c     | 21 ++++++++++-----
 6 files changed, 95 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/a5b2c4bd/libs/json/include/json/json.h
----------------------------------------------------------------------
diff --git a/libs/json/include/json/json.h b/libs/json/include/json/json.h
index 4eee6d3..dfb75ac 100644
--- a/libs/json/include/json/json.h
+++ b/libs/json/include/json/json.h
@@ -99,6 +99,7 @@ struct json_encoder {
 #define JSON_NITEMS(x) (int)(sizeof(x)/sizeof(x[0]))
 
 int json_encode_object_start(struct json_encoder *);
+int json_encode_object_key(struct json_encoder *encoder, char *key);
 int json_encode_object_entry(struct json_encoder *, char *, 
         struct json_value *);
 int json_encode_object_finish(struct json_encoder *);

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/a5b2c4bd/libs/json/src/json_encode.c
----------------------------------------------------------------------
diff --git a/libs/json/src/json_encode.c b/libs/json/src/json_encode.c
index ed44402..efb68c8 100644
--- a/libs/json/src/json_encode.c
+++ b/libs/json/src/json_encode.c
@@ -142,6 +142,20 @@ err:
     return (rc);
 }
 
+int 
+json_encode_object_key(struct json_encoder *encoder, char *key)
+{
+    if (encoder->je_has_objects) {
+        encoder->je_write(encoder->je_arg, ",", sizeof(",")-1);
+    }
+
+    /* Write the key entry */
+    encoder->je_write(encoder->je_arg, "\"", sizeof("\"")-1);
+    encoder->je_write(encoder->je_arg, key, strlen(key));
+    encoder->je_write(encoder->je_arg, "\": ", sizeof("\": ")-1);
+
+    return (0);
+}
 
 int 
 json_encode_object_entry(struct json_encoder *encoder, char *key, 
@@ -172,6 +186,8 @@ int
 json_encode_object_finish(struct json_encoder *encoder)
 {
     JSON_ENCODE_OBJECT_END(encoder);
+    /* Useful in case of nested objects. */
+    encoder->je_has_objects = 1;
 
     return (0);
 }

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/a5b2c4bd/sys/stats/include/stats/stats.h
----------------------------------------------------------------------
diff --git a/sys/stats/include/stats/stats.h b/sys/stats/include/stats/stats.h
index 69410d5..5c71c77 100644
--- a/sys/stats/include/stats/stats.h
+++ b/sys/stats/include/stats/stats.h
@@ -103,7 +103,15 @@ int stats_module_init(void);
 int stats_init(struct stats_hdr *shdr, uint8_t size, uint8_t cnt, 
     struct stats_name_map *map, uint8_t map_cnt);
 int stats_register(char *name, struct stats_hdr *shdr);
-struct stats_hdr *stats_find(char *name);
+
+typedef int (*stats_walk_func_t)(struct stats_hdr *, void *, char *, 
+        uint8_t *);
+int stats_walk(struct stats_hdr *, stats_walk_func_t, void *);
+
+typedef int (*stats_group_walk_func_t)(struct stats_hdr *, void *);
+int stats_group_walk(stats_group_walk_func_t, void *);
+
+struct stats_hdr *stats_group_find(char *name);
 
 /* Private */
 #ifdef NEWTMGR_PRESENT 

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/a5b2c4bd/sys/stats/src/stats.c
----------------------------------------------------------------------
diff --git a/sys/stats/src/stats.c b/sys/stats/src/stats.c
index dc5cdec..0b15188 100644
--- a/sys/stats/src/stats.c
+++ b/sys/stats/src/stats.c
@@ -40,6 +40,8 @@ stats_walk(struct stats_hdr *hdr, stats_walk_func_t walk_func, void *arg)
     char name_buf[12];
     uint8_t *cur;
     uint8_t *end;
+    int ent_n;
+    int len;
     int rc;
 
     cur = (uint8_t *) hdr + sizeof(*hdr);
@@ -86,14 +88,14 @@ stats_module_init(void)
     int rc;
 
 #ifdef SHELL_PRESENT 
-    rc = stats_register_shell();
+    rc = stats_shell_register();
     if (rc != 0) {
         goto err;
     }
 #endif
 
 #ifdef NEWTMGR_PRESENT 
-    rc = stats_register_nmgr_group();
+    rc = stats_nmgr_register_group();
     if (rc != 0) {
         goto err;
     }
@@ -132,6 +134,38 @@ stats_init(struct stats_hdr *shdr, uint8_t size, uint8_t cnt,
     return (0);
 }
 
+int 
+stats_group_walk(stats_group_walk_func_t walk_func, void *arg)
+{
+    struct stats_hdr *hdr;
+    int rc;
+
+    STAILQ_FOREACH(hdr, &g_stats_registry, s_next) {
+        rc = walk_func(hdr, arg);
+        if (rc != 0) {
+            goto err;
+        }
+    }
+    return (0);
+err:
+    return (rc);
+}
+
+struct stats_hdr * 
+stats_group_find(char *name)
+{
+    struct stats_hdr *cur;
+
+    cur = NULL;
+    STAILQ_FOREACH(cur, &g_stats_registry, s_next) {
+        if (!strcmp(cur->s_name, name)) {
+            break;
+        }
+    }
+
+    return (cur);
+}
+
 int
 stats_register(char *name, struct stats_hdr *shdr)
 {
@@ -159,18 +193,4 @@ err:
     return (rc);
 }
 
-struct stats_hdr * 
-stats_find(char *name)
-{
-    struct stats_hdr *cur;
-
-    cur = NULL;
-    STAILQ_FOREACH(cur, &g_stats_registry, s_next) {
-        if (!strcmp(cur->s_name, name)) {
-            break;
-        }
-    }
-
-    return (cur);
-}
 

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/a5b2c4bd/sys/stats/src/stats_nmgr.c
----------------------------------------------------------------------
diff --git a/sys/stats/src/stats_nmgr.c b/sys/stats/src/stats_nmgr.c
index ac4722f..7c92e04 100644
--- a/sys/stats/src/stats_nmgr.c
+++ b/sys/stats/src/stats_nmgr.c
@@ -18,33 +18,38 @@
 
 #include <string.h>
 
-#include "stats/stats.h"
-
 #include <stdio.h>
 
+#ifdef NEWTMGR_PRESENT 
+
+#include "newtmgr/newtmgr.h" 
+#include "json/json.h" 
+#include "stats/stats.h"
 
 /* Source code is only included if the newtmgr library is enabled.  Otherwise
  * this file is compiled out for code size.
  */
-#ifdef NEWTMGR_PRESENT 
 static int stats_nmgr_read(struct nmgr_hdr *, struct os_mbuf *, uint16_t,
         struct nmgr_hdr *, struct os_mbuf *);
 
 static struct nmgr_group shell_nmgr_group;
 
+#define STATS_NMGR_ID_READ (0) 
+
 /* ORDER MATTERS HERE.
  * Each element represents the command ID, referenced from newtmgr.
  */
 static struct nmgr_handler shell_nmgr_group_handlers[] = {
     [STATS_NMGR_ID_READ] = {stats_nmgr_read, stats_nmgr_read},
 };
+
 static int 
 stats_nmgr_walk_func(struct stats_hdr *hdr, void *arg, char *sname, 
         uint8_t *stat)
 {
     struct json_encoder *encoder;
-    struct json_val jv;
-    int len;
+    struct json_value jv;
+    int rc;
 
     encoder = (struct json_encoder *) arg;
 
@@ -75,12 +80,14 @@ stats_nmgr_read(struct nmgr_hdr *nmr, struct os_mbuf *req, uint16_t srcoff,
         struct nmgr_hdr *rsp_hdr, struct os_mbuf *rsp)
 {
     struct stats_hdr *hdr;
+#define STATS_NMGR_NAME_LEN (32)
     char stats_name[STATS_NMGR_NAME_LEN];
     struct json_attr_t attrs[] = {
         { "n", t_string, .addr.string = &stats_name[0], 
             .len = sizeof(stats_name) },
         { NULL },
     };
+    struct json_value jv;
     int rc;
 
     rc = nmgr_jbuf_setibuf(&nmgr_task_jbuf, req, srcoff + sizeof(*nmr), 
@@ -94,9 +101,9 @@ stats_nmgr_read(struct nmgr_hdr *nmr, struct os_mbuf *req, uint16_t srcoff,
         goto err;
     }
 
-    hdr = stats_find(stats_name);
+    hdr = stats_group_find(stats_name);
     if (!hdr) {
-        rc = EINVAL;
+        rc = OS_EINVAL;
         goto err;
     }
 
@@ -106,8 +113,13 @@ stats_nmgr_read(struct nmgr_hdr *nmr, struct os_mbuf *req, uint16_t srcoff,
     }
 
     json_encode_object_start(&nmgr_task_jbuf.njb_enc);
+    JSON_VALUE_STRINGN(&jv, stats_name, strlen(stats_name));
+    json_encode_object_entry(&nmgr_task_jbuf.njb_enc, "n", &jv);
+    json_encode_object_key(&nmgr_task_jbuf.njb_enc, "f");
+    json_encode_object_start(&nmgr_task_jbuf.njb_enc);
     stats_walk(hdr, stats_nmgr_walk_func, &nmgr_task_jbuf.njb_enc);
     json_encode_object_finish(&nmgr_task_jbuf.njb_enc);
+    json_encode_object_finish(&nmgr_task_jbuf.njb_enc);
 
     return (0);
 err:

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-larva/blob/a5b2c4bd/sys/stats/src/stats_shell.c
----------------------------------------------------------------------
diff --git a/sys/stats/src/stats_shell.c b/sys/stats/src/stats_shell.c
index d9a756e..66469c6 100644
--- a/sys/stats/src/stats_shell.c
+++ b/sys/stats/src/stats_shell.c
@@ -31,8 +31,8 @@
 uint8_t stats_shell_registered;
 struct shell_cmd shell_stats_cmd;
 
-static void 
-shell_stats_display_entry(struct stats_hdr *hdr, void *arg, char *name,
+static int 
+stats_shell_display_entry(struct stats_hdr *hdr, void *arg, char *name,
         uint8_t *stat)
 {
     switch (hdr->s_size) {
@@ -50,6 +50,15 @@ shell_stats_display_entry(struct stats_hdr *hdr, void *arg, char *name,
                     hdr->s_size);
             break;
     }
+
+    return (0);
+}
+
+static int 
+stats_shell_display_group(struct stats_hdr *hdr, void *arg)
+{
+    console_printf("\t%s\n", hdr->s_name);
+    return (0);
 }
 
 static int 
@@ -63,15 +72,13 @@ shell_stats_display(int argc, char **argv)
     if (name == NULL || !strcmp(name, "")) {
         console_printf("Must specify a statistic name to dump, "
                 "possible names are:\n");
-        STAILQ_FOREACH(hdr, &g_stats_registry, s_next) {
-            console_printf("\t%s\n", hdr->s_name);
-        }
+        stats_group_walk(stats_shell_display_group, NULL);
         rc = OS_EINVAL;
     }
 
-    hdr = stats_find(name);
+    hdr = stats_group_find(name);
     if (!hdr) {
-        console_printf("Could not find statistic %s\n", name);
+        console_printf("Could not find statistic group %s\n", name);
         rc = OS_EINVAL;
         goto err;
     }