summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorWilliam Wilgus <me.theuser@yahoo.com>2019-10-07 21:26:51 -0500
committerWilliam Wilgus <me.theuser@yahoo.com>2019-10-07 22:07:22 -0500
commit7f1e6b4638c35cf287297a2428e50764680214f7 (patch)
treee78752a0161cd9393e671664477b3574adad08a8 /apps
parent19084181a19a924ef966820f4ae84c36f1e9835c (diff)
downloadrockbox-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
Diffstat (limited to 'apps')
-rw-r--r--apps/plugins/lua/rocklib_events.c27
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 */
334static void rev_timer_isr(void) 334static 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)
431static void playback_event_callback(unsigned short id, void *data) 431static 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
541static int rockev_register(lua_State *L) 543static 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 */