diff options
author | patacongo <patacongo@7fd9a85b-ad96-42d3-883c-3090e2eb8679> | 2012-05-15 00:45:14 +0000 |
---|---|---|
committer | patacongo <patacongo@7fd9a85b-ad96-42d3-883c-3090e2eb8679> | 2012-05-15 00:45:14 +0000 |
commit | 519ab1856fb8c69ff2bb15e512bdb8539c90129c (patch) | |
tree | 4692ee907021a755c1a5f3db5fd13e0d9712a2f7 /NxWidgets | |
parent | 383e7a0c97e0e559da8eb2c2a128153ad068d67a (diff) | |
download | px4-firmware-519ab1856fb8c69ff2bb15e512bdb8539c90129c.tar.gz px4-firmware-519ab1856fb8c69ff2bb15e512bdb8539c90129c.tar.bz2 px4-firmware-519ab1856fb8c69ff2bb15e512bdb8539c90129c.zip |
Fix several compiler errors that occur when CONFIG_SCHED_ONEXIT is enabled; on_exit is now used in NxWM::NxConsole to close the window with the NSH session exits
git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@4738 7fd9a85b-ad96-42d3-883c-3090e2eb8679
Diffstat (limited to 'NxWidgets')
-rwxr-xr-x | NxWidgets/ChangeLog.txt | 3 | ||||
-rw-r--r-- | NxWidgets/nxwm/include/cnxconsole.hxx | 15 | ||||
-rw-r--r-- | NxWidgets/nxwm/include/nxwmconfig.hxx | 11 | ||||
-rw-r--r-- | NxWidgets/nxwm/src/cnxconsole.cxx | 113 |
4 files changed, 105 insertions, 37 deletions
diff --git a/NxWidgets/ChangeLog.txt b/NxWidgets/ChangeLog.txt index b6d2cf9f8..733924248 100755 --- a/NxWidgets/ChangeLog.txt +++ b/NxWidgets/ChangeLog.txt @@ -84,3 +84,6 @@ or a normal application. This is necessary to prevent CTaskbar from displaying a task bar on top of a full-screen window. * NxWM::CTaskbar: Ooops... minimizing the wrong application! +* NxWM::CNxConsole: Add a on_exit() exit handler that will close the + NxConsole window when the NSH thread exits. A correct build now depends + on having CONFIG_SCHED_ONEXIT defined. diff --git a/NxWidgets/nxwm/include/cnxconsole.hxx b/NxWidgets/nxwm/include/cnxconsole.hxx index 426cf165f..91fb941d8 100644 --- a/NxWidgets/nxwm/include/cnxconsole.hxx +++ b/NxWidgets/nxwm/include/cnxconsole.hxx @@ -83,14 +83,21 @@ namespace NxWM NXCONSOLE m_nxcon; /**< NxConsole handle */ pid_t m_pid; /**< Task ID of the NxConsole thread */ - /** - * This is the NxConsole task. This function first redirects output to the - * console window. - */ + /** + * This is the NxConsole task. This function first redirects output to the + * console window then calls to start the NSH logic. + */ static int nxconsole(int argc, char *argv[]); /** + * This is the NxConsole task exit handler. It is registered with on_exit() + * and called automatically when the nxconsole task exits. + */ + + static void exitHandler(int code, FAR void *arg); + + /** * Called when the window minimize button is pressed. */ diff --git a/NxWidgets/nxwm/include/nxwmconfig.hxx b/NxWidgets/nxwm/include/nxwmconfig.hxx index 88c2ea8db..34721d777 100644 --- a/NxWidgets/nxwm/include/nxwmconfig.hxx +++ b/NxWidgets/nxwm/include/nxwmconfig.hxx @@ -58,6 +58,7 @@ * CONFIG_NX : NX must enabled * CONFIG_NX_MULTIUSER=y : NX must be configured in multiuse mode * CONFIG_NXCONSOLE=y : For NxConsole support + * CONFIG_SCHED_ONEXIT : Support for on_exit() * * General settings: * @@ -91,6 +92,16 @@ #endif /** + * on_exit() support is (probably) required. on_exit() is the normal + * mechanism used by NxWM applications to clean-up on a application task + * exit. + */ + +#ifndef CONFIG_SCHED_ONEXIT +# warning "on_exit() support may be needed (CONFIG_SCHED_ONEXIT)" +#endif + +/** * Default font ID */ diff --git a/NxWidgets/nxwm/src/cnxconsole.cxx b/NxWidgets/nxwm/src/cnxconsole.cxx index 0d0f8e60e..79baf67d9 100644 --- a/NxWidgets/nxwm/src/cnxconsole.cxx +++ b/NxWidgets/nxwm/src/cnxconsole.cxx @@ -73,12 +73,14 @@ namespace NxWM struct SNxConsole { - sem_t sem; /**< Sem that posted when the task is initialized */ - NXTKWINDOW hwnd; /**< Window handle */ - NXCONSOLE nxcon; /**< NxConsole handle */ - int minor; /**< Next device minor number */ - struct nxcon_window_s wndo; /**< Describes the NxConsole window */ - bool result; /**< True if successfully initialized */ + FAR void *console; /**< The console 'this' pointer use with on_exit() */ + sem_t exclSem; /**< Sem that gives exclusive access to this structure */ + sem_t waitSem; /**< Sem that posted when the task is initialized */ + NXTKWINDOW hwnd; /**< Window handle */ + NXCONSOLE nxcon; /**< NxConsole handle */ + int minor; /**< Next device minor number */ + struct nxcon_window_s wndo; /**< Describes the NxConsole window */ + bool result; /**< True if successfully initialized */ }; /******************************************************************************************** @@ -200,6 +202,15 @@ bool CNxConsole::run(void) return false; } + // Get exclusive access to the global data structure + + if (sem_wait(&g_nxconvars.exclSem) != 0) + { + // This might fail if a signal is received while we are waiting. + + return false; + } + // Recover the NXTK window instance contained in the application window NXWidgets::INxWindow *window = m_window->getWindow(); @@ -224,8 +235,9 @@ bool CNxConsole::run(void) // Start the NxConsole task - g_nxconvars.result = false; - g_nxconvars.nxcon = 0; + g_nxconvars.console = (FAR void *)this; + g_nxconvars.result = false; + g_nxconvars.nxcon = 0; sched_lock(); m_pid = TASK_CREATE("NxConsole", CONFIG_NXWM_NXCONSOLE_PRIO, @@ -234,34 +246,39 @@ bool CNxConsole::run(void) // Did we successfully start the NxConsole task? + bool result = true; if (m_pid < 0) { - return false; + result = false; } + else + { + // Wait for up to two seconds for the task to initialize - // Wait for up to two second for the task to initialize + struct timespec abstime; + clock_gettime(CLOCK_REALTIME, &abstime); + abstime.tv_sec += 2; - struct timespec abstime; - clock_gettime(CLOCK_REALTIME, &abstime); - abstime.tv_sec += 2; + int ret = sem_timedwait(&g_nxconvars.waitSem, &abstime); + sched_unlock(); - int ret = sem_timedwait(&g_nxconvars.sem, &abstime); - sched_unlock(); + if (ret == OK && g_nxconvars.result) + { + // Save the handle to use in the stop method - if (ret == OK && g_nxconvars.result) - { - // Save the handle to use in the stop method + m_nxcon = g_nxconvars.nxcon; + } + else + { + // Stop the application - m_nxcon = g_nxconvars.nxcon; - return true; + stop(); + result = false; + } } - else - { - // Stop the application - stop(); - return false; - } + sem_post(&g_nxconvars.exclSem); + return result; } /** @@ -270,7 +287,7 @@ bool CNxConsole::run(void) void CNxConsole::stop(void) { - // Delete the NxConsole task if it is still running (this could strand resources) + // Delete the NxConsole task if it is still running (this could strand resources). if (m_pid >= 0) { @@ -341,7 +358,7 @@ bool CNxConsole::isFullScreen(void) const /** * This is the NxConsole task. This function first redirects output to the - * console window. + * console window then calls to start the NSH logic. */ int CNxConsole::nxconsole(int argc, char *argv[]) @@ -351,6 +368,13 @@ int CNxConsole::nxconsole(int argc, char *argv[]) int fd = -1; + // Set up an on_exit() event that will be called when this task exits + + if (on_exit(exitHandler, g_nxconvars.console) != 0) + { + goto errout; + } + // Use the window handle to create the NX console g_nxconvars.nxcon = nxtk_register(g_nxconvars.hwnd, &g_nxconvars.wndo, @@ -401,7 +425,7 @@ int CNxConsole::nxconsole(int argc, char *argv[]) // Inform the parent thread that we successfully initialized g_nxconvars.result = true; - sem_post(&g_nxconvars.sem); + sem_post(&g_nxconvars.waitSem); // Run the NSH console @@ -409,8 +433,10 @@ int CNxConsole::nxconsole(int argc, char *argv[]) (void)nsh_consolemain(argc, argv); #endif - // We get here if console exits -#warning "Missing logic" + // We get here if the NSH console should exits. nsh_consolemain() ALWAYS + // exits by calling nsh_exit() (which is a pointer to nsh_consoleexit()) + // which, in turn, calls exit() + return EXIT_SUCCESS; errout_with_nxcon: @@ -419,11 +445,31 @@ errout_with_nxcon: errout: g_nxconvars.nxcon = 0; g_nxconvars.result = false; - sem_post(&g_nxconvars.sem); + sem_post(&g_nxconvars.waitSem); return EXIT_FAILURE; } /** + * This is the NxConsole task exit handler. It registered with on_exit() + * and called automatically when the nxconsole task exits. + */ + +void CNxConsole::exitHandler(int code, FAR void *arg) +{ + CNxConsole *This = (CNxConsole *)arg; + + // Set m_pid to -1 to prevent calling detlete_task() in CNxConsole::stop(). + // CNxConsole::stop() is called by the processing initiated by the following + // call to CTaskbar::stopApplication() + + This->m_pid = -1; + + // Remove the NxConsole application from the taskbar + + This->m_taskbar->stopApplication(This); +} + +/** * Called when the window minimize button is pressed. */ @@ -452,7 +498,8 @@ bool NxWM::nshlibInitialize(void) { // Initialize the global data structure - sem_init(&g_nxconvars.sem, 0, 0); + sem_init(&g_nxconvars.exclSem, 0, 1); + sem_init(&g_nxconvars.waitSem, 0, 0); // Initialize the NSH library |