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