os; add owner task to eventq structure. Assert if os_eventq_get() is not done by owner.
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/429ab09c Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/429ab09c Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/429ab09c Branch: refs/heads/develop Commit: 429ab09cb69749781290825764f01636ec0ff149 Parents: 7bdbd5e Author: Marko Kiiskila <[email protected]> Authored: Thu Dec 15 11:02:47 2016 -0800 Committer: Sterling Hughes <[email protected]> Committed: Sun Dec 18 13:56:17 2016 -0800 ---------------------------------------------------------------------- kernel/os/include/os/os_eventq.h | 3 ++- kernel/os/src/os_eventq.c | 13 ++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/429ab09c/kernel/os/include/os/os_eventq.h ---------------------------------------------------------------------- diff --git a/kernel/os/include/os/os_eventq.h b/kernel/os/include/os/os_eventq.h index 87b93ea..cfe0d34 100644 --- a/kernel/os/include/os/os_eventq.h +++ b/kernel/os/include/os/os_eventq.h @@ -41,7 +41,8 @@ struct os_event { #define OS_EVENT_QUEUED(__ev) ((__ev)->ev_queued) struct os_eventq { - struct os_task *evq_task; + struct os_task *evq_owner; /* owner task */ + struct os_task *evq_task; /* sleeper; must be either NULL, or the owner */ STAILQ_HEAD(, os_event) evq_list; }; http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/429ab09c/kernel/os/src/os_eventq.c ---------------------------------------------------------------------- diff --git a/kernel/os/src/os_eventq.c b/kernel/os/src/os_eventq.c index 1e76c7c..d443dfd 100644 --- a/kernel/os/src/os_eventq.c +++ b/kernel/os/src/os_eventq.c @@ -111,10 +111,21 @@ os_eventq_get(struct os_eventq *evq) os_sr_t sr; struct os_task *t; + t = os_sched_get_current_task(); + if (evq->evq_owner != t) { + if (evq->evq_owner == NULL) { + evq->evq_owner = t; + } else { + /* + * A task is trying to read from event queue which is handled + * by another. + */ + assert(0); + } + } OS_ENTER_CRITICAL(sr); pull_one: ev = STAILQ_FIRST(&evq->evq_list); - t = os_sched_get_current_task(); if (ev) { STAILQ_REMOVE(&evq->evq_list, ev, os_event, ev_next); ev->ev_queued = 0;
