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

[10/27] incubator-mynewt-core git commit: oic; use os_events for trigger processing incoming/outgoing data.

oic; use os_events for trigger processing incoming/outgoing data.


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

Branch: refs/heads/develop
Commit: e31f405466a445e8c38e5dcac40655cd58edcda6
Parents: 9f291c6
Author: Marko Kiiskila <ma...@runtime.io>
Authored: Thu Nov 17 17:52:48 2016 -0800
Committer: Marko Kiiskila <ma...@runtime.io>
Committed: Mon Nov 21 17:15:48 2016 -0800

----------------------------------------------------------------------
 net/oic/src/api/oc_buffer.c | 185 ++++++++++++++++++++++++---------------
 net/oic/src/api/oc_ri.c     |   3 -
 2 files changed, 114 insertions(+), 74 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e31f4054/net/oic/src/api/oc_buffer.c
----------------------------------------------------------------------
diff --git a/net/oic/src/api/oc_buffer.c b/net/oic/src/api/oc_buffer.c
index f5bc70d..e800e08 100644
--- a/net/oic/src/api/oc_buffer.c
+++ b/net/oic/src/api/oc_buffer.c
@@ -13,6 +13,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 */
+#include <os/os_eventq.h>
 
 #include "messaging/coap/engine.h"
 #include "port/oc_signal_main_loop.h"
@@ -28,114 +29,156 @@
 #include "oc_buffer.h"
 #include "oc_events.h"
 
-OC_PROCESS(message_buffer_handler, "OC Message Buffer Handler");
+#include "port/mynewt/adaptor.h"
+
 OC_MEMB(oc_buffers_s, oc_message_t, (MAX_NUM_CONCURRENT_REQUESTS * 2));
 
+static void oc_buffer_handler(struct os_event *);
+
+static struct oc_message_s *oc_buffer_inq;
+static struct oc_message_s *oc_buffer_outq;
+static struct os_event oc_buffer_ev = {
+    .ev_cb = oc_buffer_handler
+};
+
 oc_message_t *
 oc_allocate_message(void)
 {
-  oc_message_t *message = (oc_message_t *)oc_memb_alloc(&oc_buffers_s);
-  if (message) {
-    message->length = 0;
-    message->next = 0;
-    message->ref_count = 1;
-    LOG("buffer: Allocated TX/RX buffer; num free: %d\n",
-        oc_memb_numfree(&oc_buffers_s));
-  } else
-    LOG("buffer: No free TX/RX buffers!\n");
-  return message;
+    oc_message_t *message = (oc_message_t *)oc_memb_alloc(&oc_buffers_s);
+
+    if (message) {
+        message->length = 0;
+        message->next = 0;
+        message->ref_count = 1;
+        LOG("buffer: Allocated TX/RX buffer; num free: %d\n",
+          oc_memb_numfree(&oc_buffers_s));
+    } else {
+        LOG("buffer: No free TX/RX buffers!\n");
+    }
+    return message;
 }
 
 void
 oc_message_add_ref(oc_message_t *message)
 {
-  if (message)
-    message->ref_count++;
+    if (message) {
+        message->ref_count++;
+    }
 }
 
 void
 oc_message_unref(oc_message_t *message)
 {
-  if (message) {
-    message->ref_count--;
-    if (message->ref_count == 0) {
-      oc_memb_free(&oc_buffers_s, message);
-      LOG("buffer: freed TX/RX buffer; num free: %d\n",
-          oc_memb_numfree(&oc_buffers_s));
+    if (message) {
+        message->ref_count--;
+        if (message->ref_count == 0) {
+            oc_memb_free(&oc_buffers_s, message);
+            LOG("buffer: freed TX/RX buffer; num free: %d\n",
+              oc_memb_numfree(&oc_buffers_s));
+        }
+    }
+}
+
+static void
+oc_queue_msg(struct oc_message_s **head, struct oc_message_s *msg)
+{
+    struct oc_message_s *tmp;
+
+    msg->next = NULL; /* oc_message_s has been oc_list once, clear next */
+    if (!*head) {
+        *head = msg;
+    } else {
+        for (tmp = *head; tmp->next; tmp = tmp->next);
+        tmp->next = msg;
     }
-  }
 }
 
 void
 oc_recv_message(oc_message_t *message)
 {
-  oc_process_post(&message_buffer_handler, oc_events[INBOUND_NETWORK_EVENT],
-                  message);
-  oc_signal_main_loop();
+    oc_queue_msg(&oc_buffer_inq, message);
+    os_eventq_put(oc_evq_get(), &oc_buffer_ev);
 }
 
 void
 oc_send_message(oc_message_t *message)
 {
-  oc_process_post(&message_buffer_handler, oc_events[OUTBOUND_NETWORK_EVENT],
-                  message);
-
-  oc_signal_main_loop();
+    oc_queue_msg(&oc_buffer_outq, message);
+    os_eventq_put(oc_evq_get(), &oc_buffer_ev);
 }
 
-OC_PROCESS_THREAD(message_buffer_handler, ev, data)
+static void
+oc_buffer_tx(struct oc_message_s *message)
 {
-  OC_PROCESS_BEGIN();
-  LOG("Started buffer handler process\n");
-  while (1) {
-    OC_PROCESS_YIELD();
-
-    if (ev == oc_events[INBOUND_NETWORK_EVENT]) {
-#ifdef OC_SECURITY
-      uint8_t b = (uint8_t)((oc_message_t *)data)->data[0];
-      if (b > 19 && b < 64) {
-        LOG("Inbound network event: encrypted request\n");
-        oc_process_post(&oc_dtls_handler, oc_events[UDP_TO_DTLS_EVENT], data);
-      } else {
-          LOG("Inbound network event: decrypted request\n");
-          coap_receive(data);
-          oc_message_unref(data);
-      }
-#else
-      LOG("Inbound network event: decrypted request\n");
-      coap_receive(data);
-      oc_message_unref(data);
-#endif
-    } else if (ev == oc_events[OUTBOUND_NETWORK_EVENT]) {
-      oc_message_t *message = (oc_message_t *)data;
-
 #ifdef OC_CLIENT
-      if (message->endpoint.flags & MULTICAST) {
+    if (message->endpoint.flags & MULTICAST) {
         LOG("Outbound network event: multicast request\n");
         oc_send_multicast_message(message);
         oc_message_unref(message);
-      } else
+    } else {
 #endif
 #ifdef OC_SECURITY
         if (message->endpoint.flags & SECURED) {
-        LOG("Outbound network event: forwarding to DTLS\n");
-
-        if (!oc_sec_dtls_connected(&message->endpoint)) {
-          LOG("Posting INIT_DTLS_CONN_EVENT\n");
-          oc_process_post(&oc_dtls_handler, oc_events[INIT_DTLS_CONN_EVENT],
-                          data);
-        } else {
-          LOG("Posting RI_TO_DTLS_EVENT\n");
-          oc_process_post(&oc_dtls_handler, oc_events[RI_TO_DTLS_EVENT], data);
+            LOG("Outbound network event: forwarding to DTLS\n");
+
+            if (!oc_sec_dtls_connected(&message->endpoint)) {
+                LOG("Posting INIT_DTLS_CONN_EVENT\n");
+                oc_process_post(&oc_dtls_handler,
+                  oc_events[INIT_DTLS_CONN_EVENT], msg);
+            } else {
+                LOG("Posting RI_TO_DTLS_EVENT\n");
+                oc_process_post(&oc_dtls_handler,
+                  oc_events[RI_TO_DTLS_EVENT], msg);
+            }
+        } else
+#endif
+        {
+            LOG("Outbound network event: unicast message\n");
+            oc_send_buffer(message);
+            oc_message_unref(message);
         }
-      } else
+#ifdef OC_CLIENT
+    }
 #endif
-      {
-        LOG("Outbound network event: unicast message\n");
-        oc_send_buffer(message);
-        oc_message_unref(message);
-      }
+}
+
+static void
+oc_buffer_rx(struct oc_message_s *msg)
+{
+#ifdef OC_SECURITY
+    uint8_t b = (uint8_t)(msg->data[0];
+    if (b > 19 && b < 64) {
+        LOG("Inbound network event: encrypted request\n");
+        oc_process_post(&oc_dtls_handler, oc_events[UDP_TO_DTLS_EVENT], msg);
+    } else {
+        LOG("Inbound network event: decrypted request\n");
+        coap_receive(msg);
+        oc_message_unref(msg);
+    }
+#else
+    LOG("Inbound network event: decrypted request\n");
+    coap_receive(msg);
+    oc_message_unref(msg);
+#endif
+}
+
+static void
+oc_buffer_handler(struct os_event *ev)
+{
+    struct oc_message_s *msg;
+
+    while (oc_buffer_outq || oc_buffer_inq) {
+        msg = oc_buffer_outq;
+        if (msg) {
+            oc_buffer_outq = msg->next;
+            msg->next = NULL;
+            oc_buffer_tx(msg);
+        }
+        msg = oc_buffer_inq;
+        if (msg) {
+            oc_buffer_inq = msg->next;
+            msg->next = NULL;
+            oc_buffer_rx(msg);
+        }
     }
-  }
-  OC_PROCESS_END();
 }

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/e31f4054/net/oic/src/api/oc_ri.c
----------------------------------------------------------------------
diff --git a/net/oic/src/api/oc_ri.c b/net/oic/src/api/oc_ri.c
index 09d49f7..7903682 100644
--- a/net/oic/src/api/oc_ri.c
+++ b/net/oic/src/api/oc_ri.c
@@ -193,7 +193,6 @@ start_processes(void)
 {
   allocate_events();
   coap_engine_init();
-  oc_process_start(&message_buffer_handler, NULL);
 
 #ifdef OC_SECURITY
   oc_process_start(&oc_dtls_handler, NULL);
@@ -206,8 +205,6 @@ stop_processes(void)
 #ifdef OC_SECURITY
   oc_process_exit(&oc_dtls_handler);
 #endif
-
-  oc_process_exit(&message_buffer_handler);
 }
 
 #ifdef OC_SERVER