Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion Modules/app-module/include/app/loader.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ extern "C" {
* firmware binary. Called on the dedicated task app-module's scheduler spawns for this instance,
* blocking for the app's whole lifetime - same contract as an external app's main(), plus
* @a app_instance_id identifying this running instance (use it with
* app_event_subscribe()/window_manager_create()/app_manager_finish()/etc.).
* app_event_subscribe()/window_manager_create()/etc.). The instance closes when this function
* returns - no separate call is needed.
* AppManifest::location.location holds this cast to void*.
*/
typedef int32_t (*AppMainFn)(uint32_t app_instance_id, int argc, char* argv[]);
Expand Down
16 changes: 2 additions & 14 deletions Modules/app-module/include/app/manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,23 +90,11 @@ error_t app_manager_start_for_result(const char* id, AppInstanceId parent_instan
* Stop an app instance permanently. Emits APP_EVENT_CLOSE and bound-waits for its task to exit
* if it was running.
* @warning Must not be called from the instance's own task (it bound-waits via thread_join(),
* which asserts against joining yourself) - an app closing itself must call app_manager_finish()
* instead, right before returning from its own AppMainFn/AppLoaderApi::run().
* which asserts against joining yourself) - an app closes itself by returning from its own
* AppMainFn/AppLoaderApi::run(), not by calling this on itself.
*/
error_t app_manager_stop(AppInstanceId app_instance_id);

/**
* Called by an app instance, from its own task, right before it returns in response to
* APP_EVENT_CLOSE - whether that close was self-initiated (e.g. its own back button) or came
* from someone else. Marks this instance Stopped immediately (rather than waiting for its task
* to actually exit) so app_manager_get_state()/app_manager_get_topmost_instance_id() reflect the
* closure as soon as the app has decided to close, not just once its task has fully unwound.
* @warning Does not join or free this instance's own task/ledger entry (can't - this runs on
* that very task); those are cleaned up on a later app_manager_stop() call, same as any
* self-terminating instance.
*/
error_t app_manager_finish(AppInstanceId app_instance_id);

/** @return the instance's current state, or APP_INSTANCE_STATE_STOPPED if the id is unknown. */
AppInstanceState app_manager_get_state(AppInstanceId app_instance_id);

Expand Down
11 changes: 8 additions & 3 deletions Modules/app-module/source/app_scheduler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -156,9 +156,9 @@ void app_task_main(void* context) {

deliver_result_to_parent_if_any(ctx->app_instance_id, result);

// A safe default terminal marker for CLOSE (and any other exit): an app that calls
// app_manager_finish() already marked itself Stopped before returning, so this is a no-op
// for it - but it's still needed as the terminal marker for any other exit path.
// The terminal marker for every exit path: an app instance is Stopped exactly when its
// AppMainFn/AppLoaderApi::run() has returned, whether that return was self-initiated or in
// response to APP_EVENT_CLOSE.
set_state(ctx->app_instance_id, APP_INSTANCE_STATE_STOPPED);

app_ledger_free_arguments(ctx->argc, ctx->argv);
Expand Down Expand Up @@ -269,6 +269,11 @@ error_t app_scheduler_stop(AppInstanceId app_instance_id, TickType_t join_timeou
AppEvent event { .type = APP_EVENT_CLOSE, .timestamp = 0, .result = {} };
app_event_emit(app_instance_id, &event);

// Marked as soon as the app has been told to close, not once its task has actually
// unwound - so app_manager_get_state()/app_manager_get_topmost_instance_id() reflect the
// closure immediately, without waiting on whatever teardown the app still has left to do.
set_state(app_instance_id, APP_INSTANCE_STATE_STOPPING);

// Blocks until app_task_main() gives this dedicated semaphore as the literal last thing it does before vTaskDelete().
// Uses aa dedicated semaphore rather than this task's default FreeRTOS notification because app_event.cpp's AppEventSubscription also uses that shared slot.
// An unrelated event (e.g. a different child's APP_EVENT_RESULT) delivered to this same task could otherwise unblock this early.
Expand Down
11 changes: 0 additions & 11 deletions Modules/app-module/source/manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -138,17 +138,6 @@ error_t app_manager_stop(AppInstanceId app_instance_id) {
return app_scheduler_stop(app_instance_id, pdMS_TO_TICKS(2000));
}

error_t app_manager_finish(AppInstanceId app_instance_id) {
auto& ledger = app_ledger();
mutex_lock(&ledger.mutex);
auto iterator = ledger.instances.find(app_instance_id);
if (iterator != ledger.instances.end()) {
iterator->second.state = APP_INSTANCE_STATE_STOPPED;
}
mutex_unlock(&ledger.mutex);
return ERROR_NONE;
}

AppInstanceState app_manager_get_state(AppInstanceId app_instance_id) {
auto& ledger = app_ledger();
mutex_lock(&ledger.mutex);
Expand Down
1 change: 0 additions & 1 deletion Modules/app-module/source/symbols.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ const ModuleSymbol app_module_symbols[] = {
DEFINE_MODULE_SYMBOL(app_manager_start_with_parameters),
DEFINE_MODULE_SYMBOL(app_manager_start_for_result),
DEFINE_MODULE_SYMBOL(app_manager_stop),
DEFINE_MODULE_SYMBOL(app_manager_finish),
DEFINE_MODULE_SYMBOL(app_manager_get_state),
DEFINE_MODULE_SYMBOL(app_manager_find_manifest),
DEFINE_MODULE_SYMBOL(app_manager_for_each_manifest),
Expand Down
1 change: 0 additions & 1 deletion Modules/app-module/tests/source/app_manager_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,6 @@ int32_t fake_run(void*, uint32_t app_instance_id, int argc, char* argv[]) {
break; // safety net so a bug here can't hang the test suite
}
if (event.type == APP_EVENT_CLOSE) {
app_manager_finish(app_instance_id);
break;
}
}
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/addgps/AddGps.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
}
switch (event.type) {
case APP_EVENT_CLOSE:
app_manager_finish(appInstanceId);
shouldClose = true;
break;
case APP_EVENT_RESULT:
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/alertdialog/AlertDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
break;
}
if (event.type == APP_EVENT_CLOSE) {
app_manager_finish(appInstanceId); // no-op: modal children never supersede anything
break;
}
}
Expand Down
3 changes: 0 additions & 3 deletions Tactility/Source/app/appdetails/AppDetails.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
ctx.targetAppId = (argc > 0) ? argv[0] : std::string();
if (app_manager_find_manifest(ctx.targetAppId.c_str(), &ctx.targetManifest) != ERROR_NONE) {
LOG_W(TAG, "App %s not found", ctx.targetAppId.c_str());
app_manager_finish(appInstanceId);
return 0;
}

Expand All @@ -129,14 +128,12 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
}
switch (event.type) {
case APP_EVENT_CLOSE:
app_manager_finish(appInstanceId);
shouldClose = true;
break;
case APP_EVENT_RESULT:
if (event.result.launch_id == ctx.pendingUninstallDialogId) {
if (event.result.result == 0) { // 0 = Yes
app_uninstall(ctx.targetManifest.id);
app_manager_finish(appInstanceId);
shouldClose = true;
}
app_manager_stop(event.result.launch_id);
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/apphub/AppHubApp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
}
switch (event.type) {
case APP_EVENT_CLOSE:
app_manager_finish(appInstanceId);
shouldClose = true;
break;
default:
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/apphubdetails/AppHubDetailsApp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
}
switch (event.type) {
case APP_EVENT_CLOSE:
app_manager_finish(appInstanceId);
shouldClose = true;
break;
case APP_EVENT_RESULT: {
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/applist/AppList.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
break;
}
if (event.type == APP_EVENT_CLOSE) {
app_manager_finish(appInstanceId);
break;
}
}
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/appsettings/AppSettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
}
switch (event.type) {
case APP_EVENT_CLOSE:
app_manager_finish(appInstanceId);
shouldClose = true;
break;
default:
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/apwebserver/ApWebServer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
}
switch (event.type) {
case APP_EVENT_CLOSE:
app_manager_finish(appInstanceId);
shouldClose = true;
break;
default:
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/audiosettings/AudioSettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
}
switch (event.type) {
case APP_EVENT_CLOSE:
app_manager_finish(appInstanceId);
shouldClose = true;
break;
default:
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/boot/Boot.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
break;
}
if (event.type == APP_EVENT_CLOSE) {
app_manager_finish(appInstanceId);
break;
}
}
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/btmanage/BtManage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
}
switch (event.type) {
case APP_EVENT_CLOSE:
app_manager_finish(appInstanceId);
shouldClose = true;
break;
default:
Expand Down
2 changes: 0 additions & 2 deletions Tactility/Source/app/btpeersettings/BtPeerSettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
}
switch (event.type) {
case APP_EVENT_CLOSE:
app_manager_finish(appInstanceId);
shouldClose = true;
break;
case APP_EVENT_RESULT:
Expand All @@ -226,7 +225,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
}
}
bluetooth::unpair(ctx.addr);
app_manager_finish(appInstanceId);
shouldClose = true;
}
app_manager_stop(event.result.launch_id);
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/chat/ChatApp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
}
switch (event.type) {
case APP_EVENT_CLOSE:
app_manager_finish(appInstanceId);
shouldClose = true;
break;
default:
Expand Down
3 changes: 0 additions & 3 deletions Tactility/Source/app/crashdiagnostics/CrashDiagnostics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -168,15 +168,12 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
}
switch (event.type) {
case APP_EVENT_CLOSE:
app_manager_finish(appInstanceId);
shouldClose = true;
break;
default:
break;
}
}
} else {
app_manager_finish(appInstanceId);
}

window_manager_remove(window);
Expand Down
2 changes: 0 additions & 2 deletions Tactility/Source/app/development/Development.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
LOG_E(TAG, "Service not found");
// No window/subscription was ever created - matches the old model, where onCreate()
// aborting the app meant onShow() was never called either.
app_manager_finish(appInstanceId);
return 0;
}

Expand Down Expand Up @@ -204,7 +203,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
}
switch (event.type) {
case APP_EVENT_CLOSE:
app_manager_finish(appInstanceId);
shouldClose = true;
break;
default:
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/files/FilesApp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
}
switch (event.type) {
case APP_EVENT_CLOSE:
app_manager_finish(appInstanceId);
shouldClose = true;
break;
case APP_EVENT_RESULT:
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/fileselection/FileSelection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
break;
}
if (event.type == APP_EVENT_CLOSE) {
app_manager_finish(appInstanceId); // no-op: modal children never supersede anything
break;
}
}
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/gpssettings/GpsSettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
}
switch (event.type) {
case APP_EVENT_CLOSE:
app_manager_finish(appInstanceId);
shouldClose = true;
break;
case APP_EVENT_RESULT:
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/grovesettings/GroveSettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
}
switch (event.type) {
case APP_EVENT_CLOSE:
app_manager_finish(appInstanceId);
shouldClose = true;
break;
default:
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/i2cscanner/I2cScanner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -403,7 +403,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
switch (event.type) {
case APP_EVENT_CLOSE:
stopScanningIfRunning(&ctx);
app_manager_finish(appInstanceId);
shouldClose = true;
break;
default:
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/imageviewer/ImageViewer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
}
switch (event.type) {
case APP_EVENT_CLOSE:
app_manager_finish(appInstanceId);
shouldClose = true;
break;
default:
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/inputdialog/InputDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
break;
}
if (event.type == APP_EVENT_CLOSE) {
app_manager_finish(appInstanceId); // no-op: modal children never supersede anything
break;
}
}
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/kerneldisplay/KernelDisplay.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
switch (event.type) {
case APP_EVENT_CLOSE:
persistIfUpdated(ctx);
app_manager_finish(appInstanceId);
shouldClose = true;
break;
default:
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/keyboard/KeyboardSettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
switch (event.type) {
case APP_EVENT_CLOSE:
persistIfUpdated(ctx);
app_manager_finish(appInstanceId);
shouldClose = true;
break;
default:
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/launcher/Launcher.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
break;
}
if (event.type == APP_EVENT_CLOSE) {
app_manager_finish(appInstanceId);
break;
}
}
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/localesettings/LocaleSettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
}
switch (event.type) {
case APP_EVENT_CLOSE:
app_manager_finish(appInstanceId);
shouldClose = true;
break;
default:
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/notes/Notes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
}
switch (event.type) {
case APP_EVENT_CLOSE:
app_manager_finish(appInstanceId);
shouldClose = true;
break;
case APP_EVENT_RESULT:
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/power/Power.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
}
switch (event.type) {
case APP_EVENT_CLOSE:
app_manager_finish(appInstanceId);
shouldClose = true;
break;
default:
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/poweroff/PowerOff.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
}
switch (event.type) {
case APP_EVENT_CLOSE:
app_manager_finish(appInstanceId);
shouldClose = true;
break;
default:
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/screenshot/Screenshot.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
}
switch (event.type) {
case APP_EVENT_CLOSE:
app_manager_finish(appInstanceId);
shouldClose = true;
break;
default:
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/selectiondialog/SelectionDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,6 @@ int32_t appMain(AppInstanceId appInstanceId, int argc, char* argv[]) {
break;
}
if (event.type == APP_EVENT_CLOSE) {
app_manager_finish(appInstanceId); // no-op: modal children never supersede anything
break;
}
}
Expand Down
1 change: 0 additions & 1 deletion Tactility/Source/app/settings/Settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,6 @@ int32_t appMain(uint32_t appInstanceId, int argc, char* argv[]) {
break;
}
if (event.type == APP_EVENT_CLOSE) {
app_manager_finish(appInstanceId);
break;
}
}
Expand Down
Loading
Loading