masayuki2009 commented on a change in pull request #2946: URL: https://github.com/apache/incubator-nuttx/pull/2946#discussion_r585295414
########## File path: sched/task/task_exithook.c ########## @@ -645,7 +645,20 @@ void nxtask_exithook(FAR struct tcb_s *tcb, int status, bool nonblocking) if (!nonblocking) { + /* NOTE: nxtask_flushstreams() calls lib_flushall() + * which handles a semaphore in userspace. + * It should be done without a critical section. + */ + +#ifdef CONFIG_SMP + leave_critical_section(flags); +#endif + nxtask_flushstreams(tcb); Review comment: @xiaoxiang781216 OK. How about this change? ``` diff --git a/sched/task/task_exithook.c b/sched/task/task_exithook.c index 8378c0c8fc..0e34a99ab7 100644 --- a/sched/task/task_exithook.c +++ b/sched/task/task_exithook.c @@ -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!) */ ``` ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org