sched: task: Call nxtask_flushstreams() without critical section
Summary: - During investigating critical section with semaphores, I noticed that nxtask_flushstreams() is called with a critical section. - The function calls lib_flushall() which handles a semaphore in userspace. - So it should be done without a critical section Impact: - SMP only Testing: - Tested with ostest the following configs - esp32-devkitc:smp (QEMU), sabre-6quad:smp (QEMU) - maix-bit:smp (QEMU), sim:smp - spresense:smp - Tested with nxplayer and stress test with spresense:wifi_smp Signed-off-by: Masayuki Ishikawa <Masayuki.Ishikawa@jp.sony.com>
This commit is contained in:
parent
cbe3fb5c60
commit
9d370fc363
@ -586,7 +586,6 @@ void nxtask_exithook(FAR struct tcb_s *tcb, int status, bool nonblocking)
|
||||
tcb->cpcount = 0;
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SCHED_ATEXIT) || defined(CONFIG_SCHED_ONEXIT)
|
||||
/* If exit function(s) were registered, call them now before we do any un-
|
||||
* initialization.
|
||||
*
|
||||
@ -604,14 +603,28 @@ void nxtask_exithook(FAR struct tcb_s *tcb, int status, bool nonblocking)
|
||||
|
||||
if (!nonblocking)
|
||||
{
|
||||
#if defined(CONFIG_SCHED_ATEXIT) || defined(CONFIG_SCHED_ONEXIT)
|
||||
nxtask_atexit(tcb);
|
||||
|
||||
/* Call any registered on_exit function(s) */
|
||||
|
||||
nxtask_onexit(tcb, status);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* If this is the last thread in the group, then flush all streams
|
||||
* (File descriptors will be closed when the TCB is deallocated).
|
||||
*
|
||||
* NOTES:
|
||||
* 1. We cannot flush the buffered I/O if nonblocking is requested.
|
||||
* that might cause this logic to block.
|
||||
* 2. This function will only be called with non-blocking == true
|
||||
* only when called through _exit(). _exit() behavior does not
|
||||
* require that the streams be flushed
|
||||
*/
|
||||
|
||||
nxtask_flushstreams(tcb);
|
||||
}
|
||||
|
||||
/* If the task was terminated by another task, it may be in an unknown
|
||||
* state. Make some feeble effort to recover the state.
|
||||
*/
|
||||
@ -632,22 +645,6 @@ void nxtask_exithook(FAR struct tcb_s *tcb, int status, bool nonblocking)
|
||||
|
||||
nxtask_exitwakeup(tcb, status);
|
||||
|
||||
/* If this is the last thread in the group, then flush all streams (File
|
||||
* descriptors will be closed when the TCB is deallocated).
|
||||
*
|
||||
* NOTES:
|
||||
* 1. We cannot flush the buffered I/O if nonblocking is requested.
|
||||
* that might cause this logic to block.
|
||||
* 2. This function will only be called with non-blocking == true
|
||||
* only when called through _exit(). _exit() behavior does not
|
||||
* require that the streams be flushed
|
||||
*/
|
||||
|
||||
if (!nonblocking)
|
||||
{
|
||||
nxtask_flushstreams(tcb);
|
||||
}
|
||||
|
||||
/* Leave the task group. Perhaps discarding any un-reaped child
|
||||
* status (no zombies here!)
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user