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: svn://svn.code.sf.net/p/nuttx/code/trunk@4738 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
parent
a23a99c97c
commit
3c23ea4f5e
@ -84,3 +84,6 @@
|
|||||||
or a normal application. This is necessary to prevent CTaskbar from
|
or a normal application. This is necessary to prevent CTaskbar from
|
||||||
displaying a task bar on top of a full-screen window.
|
displaying a task bar on top of a full-screen window.
|
||||||
* NxWM::CTaskbar: Ooops... minimizing the wrong application!
|
* 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.
|
||||||
|
@ -83,13 +83,20 @@ namespace NxWM
|
|||||||
NXCONSOLE m_nxcon; /**< NxConsole handle */
|
NXCONSOLE m_nxcon; /**< NxConsole handle */
|
||||||
pid_t m_pid; /**< Task ID of the NxConsole thread */
|
pid_t m_pid; /**< Task ID of the NxConsole thread */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is the NxConsole task. This function first redirects output to the
|
* This is the NxConsole task. This function first redirects output to the
|
||||||
* console window.
|
* console window then calls to start the NSH logic.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int nxconsole(int argc, char *argv[]);
|
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.
|
* Called when the window minimize button is pressed.
|
||||||
*/
|
*/
|
||||||
|
@ -58,6 +58,7 @@
|
|||||||
* CONFIG_NX : NX must enabled
|
* CONFIG_NX : NX must enabled
|
||||||
* CONFIG_NX_MULTIUSER=y : NX must be configured in multiuse mode
|
* CONFIG_NX_MULTIUSER=y : NX must be configured in multiuse mode
|
||||||
* CONFIG_NXCONSOLE=y : For NxConsole support
|
* CONFIG_NXCONSOLE=y : For NxConsole support
|
||||||
|
* CONFIG_SCHED_ONEXIT : Support for on_exit()
|
||||||
*
|
*
|
||||||
* General settings:
|
* General settings:
|
||||||
*
|
*
|
||||||
@ -90,6 +91,16 @@
|
|||||||
# warning "NxConsole support may be needed (CONFIG_NXCONSOLE)"
|
# warning "NxConsole support may be needed (CONFIG_NXCONSOLE)"
|
||||||
#endif
|
#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
|
* Default font ID
|
||||||
*/
|
*/
|
||||||
|
@ -73,12 +73,14 @@ namespace NxWM
|
|||||||
|
|
||||||
struct SNxConsole
|
struct SNxConsole
|
||||||
{
|
{
|
||||||
sem_t sem; /**< Sem that posted when the task is initialized */
|
FAR void *console; /**< The console 'this' pointer use with on_exit() */
|
||||||
NXTKWINDOW hwnd; /**< Window handle */
|
sem_t exclSem; /**< Sem that gives exclusive access to this structure */
|
||||||
NXCONSOLE nxcon; /**< NxConsole handle */
|
sem_t waitSem; /**< Sem that posted when the task is initialized */
|
||||||
int minor; /**< Next device minor number */
|
NXTKWINDOW hwnd; /**< Window handle */
|
||||||
struct nxcon_window_s wndo; /**< Describes the NxConsole window */
|
NXCONSOLE nxcon; /**< NxConsole handle */
|
||||||
bool result; /**< True if successfully initialized */
|
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;
|
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
|
// Recover the NXTK window instance contained in the application window
|
||||||
|
|
||||||
NXWidgets::INxWindow *window = m_window->getWindow();
|
NXWidgets::INxWindow *window = m_window->getWindow();
|
||||||
@ -224,8 +235,9 @@ bool CNxConsole::run(void)
|
|||||||
|
|
||||||
// Start the NxConsole task
|
// Start the NxConsole task
|
||||||
|
|
||||||
g_nxconvars.result = false;
|
g_nxconvars.console = (FAR void *)this;
|
||||||
g_nxconvars.nxcon = 0;
|
g_nxconvars.result = false;
|
||||||
|
g_nxconvars.nxcon = 0;
|
||||||
|
|
||||||
sched_lock();
|
sched_lock();
|
||||||
m_pid = TASK_CREATE("NxConsole", CONFIG_NXWM_NXCONSOLE_PRIO,
|
m_pid = TASK_CREATE("NxConsole", CONFIG_NXWM_NXCONSOLE_PRIO,
|
||||||
@ -234,34 +246,39 @@ bool CNxConsole::run(void)
|
|||||||
|
|
||||||
// Did we successfully start the NxConsole task?
|
// Did we successfully start the NxConsole task?
|
||||||
|
|
||||||
|
bool result = true;
|
||||||
if (m_pid < 0)
|
if (m_pid < 0)
|
||||||
{
|
{
|
||||||
return false;
|
result = false;
|
||||||
}
|
|
||||||
|
|
||||||
// Wait for up to two second for the task to initialize
|
|
||||||
|
|
||||||
struct timespec abstime;
|
|
||||||
clock_gettime(CLOCK_REALTIME, &abstime);
|
|
||||||
abstime.tv_sec += 2;
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
m_nxcon = g_nxconvars.nxcon;
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Stop the application
|
// Wait for up to two seconds for the task to initialize
|
||||||
|
|
||||||
stop();
|
struct timespec abstime;
|
||||||
return false;
|
clock_gettime(CLOCK_REALTIME, &abstime);
|
||||||
|
abstime.tv_sec += 2;
|
||||||
|
|
||||||
|
int ret = sem_timedwait(&g_nxconvars.waitSem, &abstime);
|
||||||
|
sched_unlock();
|
||||||
|
|
||||||
|
if (ret == OK && g_nxconvars.result)
|
||||||
|
{
|
||||||
|
// Save the handle to use in the stop method
|
||||||
|
|
||||||
|
m_nxcon = g_nxconvars.nxcon;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Stop the application
|
||||||
|
|
||||||
|
stop();
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sem_post(&g_nxconvars.exclSem);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -270,7 +287,7 @@ bool CNxConsole::run(void)
|
|||||||
|
|
||||||
void CNxConsole::stop(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)
|
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
|
* 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[])
|
int CNxConsole::nxconsole(int argc, char *argv[])
|
||||||
@ -351,6 +368,13 @@ int CNxConsole::nxconsole(int argc, char *argv[])
|
|||||||
|
|
||||||
int fd = -1;
|
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
|
// Use the window handle to create the NX console
|
||||||
|
|
||||||
g_nxconvars.nxcon = nxtk_register(g_nxconvars.hwnd, &g_nxconvars.wndo,
|
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
|
// Inform the parent thread that we successfully initialized
|
||||||
|
|
||||||
g_nxconvars.result = true;
|
g_nxconvars.result = true;
|
||||||
sem_post(&g_nxconvars.sem);
|
sem_post(&g_nxconvars.waitSem);
|
||||||
|
|
||||||
// Run the NSH console
|
// Run the NSH console
|
||||||
|
|
||||||
@ -409,8 +433,10 @@ int CNxConsole::nxconsole(int argc, char *argv[])
|
|||||||
(void)nsh_consolemain(argc, argv);
|
(void)nsh_consolemain(argc, argv);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// We get here if console exits
|
// We get here if the NSH console should exits. nsh_consolemain() ALWAYS
|
||||||
#warning "Missing logic"
|
// exits by calling nsh_exit() (which is a pointer to nsh_consoleexit())
|
||||||
|
// which, in turn, calls exit()
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
|
|
||||||
errout_with_nxcon:
|
errout_with_nxcon:
|
||||||
@ -419,10 +445,30 @@ errout_with_nxcon:
|
|||||||
errout:
|
errout:
|
||||||
g_nxconvars.nxcon = 0;
|
g_nxconvars.nxcon = 0;
|
||||||
g_nxconvars.result = false;
|
g_nxconvars.result = false;
|
||||||
sem_post(&g_nxconvars.sem);
|
sem_post(&g_nxconvars.waitSem);
|
||||||
return EXIT_FAILURE;
|
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.
|
* Called when the window minimize button is pressed.
|
||||||
*/
|
*/
|
||||||
@ -452,7 +498,8 @@ bool NxWM::nshlibInitialize(void)
|
|||||||
{
|
{
|
||||||
// Initialize the global data structure
|
// 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
|
// Initialize the NSH library
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user