MYNEWT-534 os - Move start ev when evq reassigned. If an application wants a package to use an event queue other than the main event queue, it calls the package-specific evq-set function. When this happens, the package's start event (if any) needs to be moved from the previous queue to the new one.
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/64c288f6 Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/64c288f6 Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/64c288f6 Branch: refs/heads/develop Commit: 64c288f6a4f4ce188305f0d66c719a1467a39948 Parents: 4719b3f Author: Christopher Collins <[email protected]> Authored: Wed Feb 8 18:49:46 2017 -0800 Committer: Christopher Collins <[email protected]> Committed: Wed Feb 8 19:00:04 2017 -0800 ---------------------------------------------------------------------- kernel/os/include/os/os_eventq.h | 2 -- kernel/os/src/os.c | 2 +- kernel/os/src/os_eventq.c | 47 ++++++++++++++++++++--------------- 3 files changed, 28 insertions(+), 23 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/64c288f6/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 092e724..2ae779c 100644 --- a/kernel/os/include/os/os_eventq.h +++ b/kernel/os/include/os/os_eventq.h @@ -56,8 +56,6 @@ void os_eventq_remove(struct os_eventq *, struct os_event *); struct os_eventq *os_eventq_dflt_get(void); void os_eventq_designate(struct os_eventq **dst, struct os_eventq *val, struct os_event *start_ev); -void os_eventq_ensure(struct os_eventq **evq, struct os_event *start_ev); - #ifdef __cplusplus } #endif http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/64c288f6/kernel/os/src/os.c ---------------------------------------------------------------------- diff --git a/kernel/os/src/os.c b/kernel/os/src/os.c index 754dcea..cbf8b62 100644 --- a/kernel/os/src/os.c +++ b/kernel/os/src/os.c @@ -132,7 +132,6 @@ os_main(void *arg) { int (*fn)(int argc, char **argv) = arg; - os_eventq_init(os_eventq_dflt_get()); #if !MYNEWT_VAL(SELFTEST) fn(0, NULL); #else @@ -175,6 +174,7 @@ os_init(int (*main_fn)(int argc, char **arg)) TAILQ_INIT(&g_callout_list); STAILQ_INIT(&g_os_task_list); + os_eventq_init(os_eventq_dflt_get()); /* Initialize device list. */ os_dev_reset(); http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/64c288f6/kernel/os/src/os_eventq.c ---------------------------------------------------------------------- diff --git a/kernel/os/src/os_eventq.c b/kernel/os/src/os_eventq.c index d5be9ae..626d560 100644 --- a/kernel/os/src/os_eventq.c +++ b/kernel/os/src/os_eventq.c @@ -289,32 +289,39 @@ os_eventq_dflt_get(void) return &os_eventq_main; } +/** + * Reassigns an event queue pointer to the specified value. This function is + * used for configuring a package to use a particular event queue. A package's + * event queue can generally be reassigned repeatedly. If the package has a + * startup event, the event is moved from the current queue (if any) to the + * specified queue. + * + * @param cur_evq Points to the eventq pointer to reassign. + * *cur_evq should be NULL if the package's + * eventq has not been assigned yet. + * @param new_evq The eventq that the package should be + * associated with. + * @param start_ev The package's startup event, if any. If this + * is non-NULL, the event gets removed from + * the current queue (if set), and enqueued to + * the new eventq. + */ void -os_eventq_designate(struct os_eventq **dst, struct os_eventq *val, +os_eventq_designate(struct os_eventq **cur_evq, + struct os_eventq *new_evq, struct os_event *start_ev) { - *dst = val; - if (start_ev != NULL) { - os_eventq_put(*dst, start_ev); - } -} + struct os_eventq *prev_evq; -void -os_eventq_ensure(struct os_eventq **evq, struct os_event *start_ev) -{ - struct os_eventq *eventq_dflt; + prev_evq = *cur_evq; + *cur_evq = new_evq; - if (*evq == NULL) { - eventq_dflt = os_eventq_dflt_get(); - if (eventq_dflt != NULL) { - os_eventq_designate(evq, eventq_dflt, start_ev); + if (start_ev != NULL) { + if (start_ev->ev_queued) { + assert(prev_evq != NULL); + os_eventq_remove(prev_evq, start_ev); } - - /* The system is misconfigured if there is still no parent eventq. The - * application should have explicitly specified a parent queue for each - * package, or indicated a default. - */ - assert(*evq != NULL); + os_eventq_put(new_evq, start_ev); } }
