diff options
author | William Wilgus <me.theuser@yahoo.com> | 2019-10-07 21:26:51 -0500 |
---|---|---|
committer | William Wilgus <me.theuser@yahoo.com> | 2019-10-07 22:07:22 -0500 |
commit | 7f1e6b4638c35cf287297a2428e50764680214f7 (patch) | |
tree | e78752a0161cd9393e671664477b3574adad08a8 | |
parent | 19084181a19a924ef966820f4ae84c36f1e9835c (diff) | |
download | rockbox-7f1e6b4638c35cf287297a2428e50764680214f7.tar.gz rockbox-7f1e6b4638c35cf287297a2428e50764680214f7.zip |
lua rockev cleanup
with the addition of suspending all events on thread start and exit
we don't really need to block on THREAD_QUIT in so many places
Removed suspend clearing on event unregister and updated comments
Change-Id: Id9c6a460def558c5331ee292035691a9f82b2c43
-rw-r--r-- | apps/plugins/lua/rocklib_events.c | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/apps/plugins/lua/rocklib_events.c b/apps/plugins/lua/rocklib_events.c index 41ae8904d0..3d893bb7f9 100644 --- a/apps/plugins/lua/rocklib_events.c +++ b/apps/plugins/lua/rocklib_events.c | |||
@@ -47,10 +47,10 @@ | |||
47 | * NOTE!, CUSTOM_EVENT must be unset manually | 47 | * NOTE!, CUSTOM_EVENT must be unset manually |
48 | * id is only passed to callback by custom and playback events | 48 | * id is only passed to callback by custom and playback events |
49 | * | 49 | * |
50 | * rockev.suspend(["event"/nil][true/false]) passing nil affects all events | 50 | * rockev.suspend(["event"/nil][true/false]) passing nil suspends all events |
51 | * stops event from executing, any but the last event before | 51 | * stops event from executing, any event before re-enabling will be lost. |
52 | * re-enabling will be lost. Passing false, unregistering or re-registering | 52 | * Passing false will clear the suspend as will |
53 | * an event will clear the suspend | 53 | * unregistering or re-registering an event (except suspend all) |
54 | * | 54 | * |
55 | * rockev.unregister(evX) | 55 | * rockev.unregister(evX) |
56 | * Use unregister(evX) to remove an event | 56 | * Use unregister(evX) to remove an event |
@@ -286,7 +286,7 @@ static void event_thread(void) | |||
286 | break; | 286 | break; |
287 | case BUTEVENT: | 287 | case BUTEVENT: |
288 | ev_data.cb[BUTEVENT]->id = rb->button_get(false); | 288 | ev_data.cb[BUTEVENT]->id = rb->button_get(false); |
289 | if (ev_data.cb[BUTEVENT]->id == 0) | 289 | if (ev_data.cb[BUTEVENT]->id == BUTTON_NONE) |
290 | continue; /* check next event */ | 290 | continue; /* check next event */ |
291 | break; | 291 | break; |
292 | case CUSTOMEVENT: | 292 | case CUSTOMEVENT: |
@@ -333,7 +333,7 @@ event_error: | |||
333 | /* timer interrupt callback */ | 333 | /* timer interrupt callback */ |
334 | static void rev_timer_isr(void) | 334 | static void rev_timer_isr(void) |
335 | { | 335 | { |
336 | if (ev_data.thread_state != THREAD_QUIT || is_suspend(THREAD_SUSPENDMASK >> 8)) | 336 | if (!is_suspend(THREAD_SUSPENDMASK >> 8)) /* all events suspended? */ |
337 | { | 337 | { |
338 | ev_data.next_event--; | 338 | ev_data.next_event--; |
339 | ev_data.next_input--; | 339 | ev_data.next_input--; |
@@ -408,7 +408,7 @@ static void init_event_thread(bool init, struct event_data *ev_data) | |||
408 | } | 408 | } |
409 | return; | 409 | return; |
410 | } | 410 | } |
411 | else if (!init) | 411 | else if (!init || ev_data->thread_state == THREAD_QUIT) |
412 | return; | 412 | return; |
413 | 413 | ||
414 | create_event_thread_ref(ev_data); | 414 | create_event_thread_ref(ev_data); |
@@ -431,7 +431,7 @@ static void init_event_thread(bool init, struct event_data *ev_data) | |||
431 | static void playback_event_callback(unsigned short id, void *data) | 431 | static void playback_event_callback(unsigned short id, void *data) |
432 | { | 432 | { |
433 | /* playback events are synchronous we need to return ASAP so set a flag */ | 433 | /* playback events are synchronous we need to return ASAP so set a flag */ |
434 | if (ev_data.thread_state != THREAD_QUIT && !is_suspend(THREAD_SUSPENDMASK >> 8)) | 434 | if (!is_suspend(THREAD_PLAYBKEVENT)) /* playback events suspended? */ |
435 | { | 435 | { |
436 | ev_data.thread_state |= thread_ev_states[PLAYBKEVENT]; | 436 | ev_data.thread_state |= thread_ev_states[PLAYBKEVENT]; |
437 | ev_data.cb[PLAYBKEVENT]->id = id; | 437 | ev_data.cb[PLAYBKEVENT]->id = id; |
@@ -470,8 +470,10 @@ static void destroy_event_userdata(lua_State *L, int event) | |||
470 | if (ev_data.cb[event] != NULL) | 470 | if (ev_data.cb[event] != NULL) |
471 | { | 471 | { |
472 | int ev_flag = thread_ev_states[event]; | 472 | int ev_flag = thread_ev_states[event]; |
473 | ev_data.thread_state &= ~(ev_flag | (ev_flag << 8) | (ev_flag << 16)); | 473 | int ev_clear = (ev_flag | (ev_flag << 16)); |
474 | 474 | if (!is_suspend(THREAD_SUSPENDMASK >> 8)) /* all events suspended? */ | |
475 | ev_clear |= (ev_flag << 8); | ||
476 | ev_data.thread_state &= ~(ev_clear); | ||
475 | luaL_unref (L, LUA_REGISTRYINDEX, ev_data.cb[event]->cb_ref); | 477 | luaL_unref (L, LUA_REGISTRYINDEX, ev_data.cb[event]->cb_ref); |
476 | ev_data.cb[event] = NULL; | 478 | ev_data.cb[event] = NULL; |
477 | } | 479 | } |
@@ -540,9 +542,6 @@ static int rockev_gc(lua_State *L) { | |||
540 | 542 | ||
541 | static int rockev_register(lua_State *L) | 543 | static int rockev_register(lua_State *L) |
542 | { | 544 | { |
543 | if (ev_data.thread_state == THREAD_QUIT) | ||
544 | return 0; | ||
545 | |||
546 | int event = luaL_checkoption(L, 1, NULL, ev_map); | 545 | int event = luaL_checkoption(L, 1, NULL, ev_map); |
547 | int ev_flag = thread_ev_states[event]; | 546 | int ev_flag = thread_ev_states[event]; |
548 | int playbk_events; | 547 | int playbk_events; |
@@ -608,7 +607,7 @@ static int rockev_trigger(lua_State *L) | |||
608 | int ev_flag; | 607 | int ev_flag; |
609 | 608 | ||
610 | /* protect from invalid events */ | 609 | /* protect from invalid events */ |
611 | if (ev_data.cb[event] != NULL && ev_data.thread_state != THREAD_QUIT) | 610 | if (ev_data.cb[event] != NULL) |
612 | { | 611 | { |
613 | ev_flag = thread_ev_states[event]; | 612 | ev_flag = thread_ev_states[event]; |
614 | /* allow user to pass an id to some of the callback functions */ | 613 | /* allow user to pass an id to some of the callback functions */ |