diff --git a/include/nuttx/lib/lib.h b/include/nuttx/lib/lib.h index c504e832a1e..59fb9b9c13a 100644 --- a/include/nuttx/lib/lib.h +++ b/include/nuttx/lib/lib.h @@ -105,13 +105,7 @@ extern "C" * Public Function Prototypes ****************************************************************************/ -/* Functions contained in lib_streams.c *************************************/ - #ifdef CONFIG_FILE_STREAM -struct task_group_s; -void lib_stream_initialize(FAR struct task_group_s *group); -void lib_stream_release(FAR struct task_group_s *group); - /* Functions contained in lib_getstreams.c **********************************/ FAR struct streamlist *lib_get_streams(void); diff --git a/libs/libc/stdio/CMakeLists.txt b/libs/libc/stdio/CMakeLists.txt index b1f0cb926e3..f914b6ef4cf 100644 --- a/libs/libc/stdio/CMakeLists.txt +++ b/libs/libc/stdio/CMakeLists.txt @@ -99,7 +99,6 @@ if(CONFIG_FILE_STREAM) lib_tmpfile.c lib_setbuf.c lib_setvbuf.c - lib_libstream.c lib_libfilelock.c lib_libgetstreams.c lib_fputwc.c diff --git a/libs/libc/stdio/Make.defs b/libs/libc/stdio/Make.defs index d438ceaf6e1..d94658b6478 100644 --- a/libs/libc/stdio/Make.defs +++ b/libs/libc/stdio/Make.defs @@ -46,8 +46,8 @@ CSRCS += lib_rdflush_unlocked.c lib_wrflush_unlocked.c lib_putc.c lib_fputc.c CSRCS += lib_fputs.c lib_ungetc.c lib_fprintf.c lib_vfprintf.c CSRCS += lib_feof.c lib_ferror.c lib_rewind.c lib_clearerr.c CSRCS += lib_scanf.c lib_vscanf.c lib_fscanf.c lib_vfscanf.c lib_tmpfile.c -CSRCS += lib_setbuf.c lib_setvbuf.c lib_libstream.c lib_libfilelock.c -CSRCS += lib_libgetstreams.c lib_setbuffer.c lib_fputwc.c lib_putwc.c lib_fputws.c +CSRCS += lib_setbuf.c lib_setvbuf.c lib_libfilelock.c lib_libgetstreams.c +CSRCS += lib_setbuffer.c lib_fputwc.c lib_putwc.c lib_fputws.c endif # Add the stdio directory to the build diff --git a/libs/libc/stdio/lib_libstream.c b/libs/libc/stdio/lib_libstream.c deleted file mode 100644 index be6a2a1c021..00000000000 --- a/libs/libc/stdio/lib_libstream.c +++ /dev/null @@ -1,142 +0,0 @@ -/**************************************************************************** - * libs/libc/stdio/lib_libstream.c - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. The - * ASF licenses this file to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the - * License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - ****************************************************************************/ - -/**************************************************************************** - * Included Files - ****************************************************************************/ - -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "libc.h" - -#if defined(CONFIG_BUILD_FLAT) || defined(__KERNEL__) - -/**************************************************************************** - * Public Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: lib_stream_initialize - * - * Description: - * This function is called when a new task is allocated. It initializes - * the streamlist instance that is stored in the task group. - * - ****************************************************************************/ - -void lib_stream_initialize(FAR struct task_group_s *group) -{ - FAR struct streamlist *list; - - DEBUGASSERT(group && group->tg_info); - list = &group->tg_info->ta_streamlist; - - /* Initialize the list access mutex */ - - nxmutex_init(&list->sl_lock); - list->sl_head = NULL; - list->sl_tail = NULL; - - /* Initialize stdin, stdout and stderr stream */ - - list->sl_std[0].fs_fd = -1; - nxrmutex_init(&list->sl_std[0].fs_lock); - list->sl_std[1].fs_fd = -1; - nxrmutex_init(&list->sl_std[1].fs_lock); - list->sl_std[2].fs_fd = -1; - nxrmutex_init(&list->sl_std[2].fs_lock); -} - -/**************************************************************************** - * Name: lib_stream_release - * - * Description: - * This function is called when a TCB is destroyed. Note that it does not - * close the files by releasing the inode. That happens separately when - * the file descriptor list is freed. - * - ****************************************************************************/ - -void lib_stream_release(FAR struct task_group_s *group) -{ - FAR struct streamlist *list; - - DEBUGASSERT(group && group->tg_info); - list = &group->tg_info->ta_streamlist; - - /* Destroy the mutex and release the filelist */ - - nxmutex_destroy(&list->sl_lock); - - /* Release each stream in the list */ - - list->sl_tail = NULL; - while (list->sl_head != NULL) - { - FAR struct file_struct *stream = list->sl_head; - - list->sl_head = stream->fs_next; - -#ifndef CONFIG_STDIO_DISABLE_BUFFERING - /* Destroy the mutex that protects the IO buffer */ - - nxrmutex_destroy(&stream->fs_lock); -#endif - - /* Release the stream */ - -#ifdef CONFIG_BUILD_KERNEL - /* If the exiting group is unprivileged, then it has an address - * environment. Don't bother to release the memory in this case... - * There is no point since the memory lies in the user heap which - * will be destroyed anyway. But if this is a privileged group, - * when we still have to release the memory using the kernel - * allocator. - */ - - if ((group->tg_flags & GROUP_FLAG_PRIVILEGED) != 0) -#endif - { - group_free(group, stream); - } - } - - /* Destroy stdin, stdout and stderr stream */ - -#ifndef CONFIG_STDIO_DISABLE_BUFFERING - nxrmutex_destroy(&list->sl_std[0].fs_lock); - nxrmutex_destroy(&list->sl_std[1].fs_lock); - nxrmutex_destroy(&list->sl_std[2].fs_lock); -#endif -} - -#endif /* CONFIG_BUILD_FLAT || __KERNEL__ */ diff --git a/sched/tls/task_initinfo.c b/sched/tls/task_initinfo.c index a6d67e91832..14c366a1461 100644 --- a/sched/tls/task_initinfo.c +++ b/sched/tls/task_initinfo.c @@ -26,10 +26,44 @@ #include #include -#include #include "tls.h" +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: task_init_stream + * + * Description: + * This function is called when a new task is allocated. It initializes + * the streamlist instance that is stored in the task group. + * + ****************************************************************************/ + +#ifdef CONFIG_FILE_STREAM +static void task_init_stream(FAR struct streamlist *list) +{ + FAR struct file_struct *stream = list->sl_std; + + /* Initialize the list access mutex */ + + nxmutex_init(&list->sl_lock); + list->sl_head = NULL; + list->sl_tail = NULL; + + /* Initialize stdin, stdout and stderr stream */ + + stream[0].fs_fd = -1; + nxrmutex_init(&stream[0].fs_lock); + stream[1].fs_fd = -1; + nxrmutex_init(&stream[1].fs_lock); + stream[2].fs_fd = -1; + nxrmutex_init(&stream[2].fs_lock); +} +#endif + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -72,7 +106,7 @@ int task_init_info(FAR struct task_group_s *group) #ifdef CONFIG_FILE_STREAM /* Initialize file streams for the task group */ - lib_stream_initialize(group); + task_init_stream(&info->ta_streamlist); #endif return OK; diff --git a/sched/tls/task_uninitinfo.c b/sched/tls/task_uninitinfo.c index 3ccfee3f00e..9e7ae8b1524 100644 --- a/sched/tls/task_uninitinfo.c +++ b/sched/tls/task_uninitinfo.c @@ -24,11 +24,80 @@ #include #include -#include #include #include "tls.h" +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: task_uninit_stream + * + * Description: + * This function is called when a TCB is destroyed. Note that it does not + * close the files by releasing the inode. That happens separately when + * the file descriptor list is freed. + * + ****************************************************************************/ + +#ifdef CONFIG_FILE_STREAM +static void task_uninit_stream(FAR struct task_group_s *group) +{ + FAR struct streamlist *list; + FAR struct file_struct *stream; + + DEBUGASSERT(group && group->tg_info); + list = &group->tg_info->ta_streamlist; + stream = list->sl_std; + + /* Destroy the mutex and release the filelist */ + + nxmutex_destroy(&list->sl_lock); + + /* Destroy stdin, stdout and stderr stream */ + +#ifndef CONFIG_STDIO_DISABLE_BUFFERING + nxrmutex_destroy(&stream[0].fs_lock); + nxrmutex_destroy(&stream[1].fs_lock); + nxrmutex_destroy(&stream[2].fs_lock); +#endif + + /* Release each stream in the list */ + + list->sl_tail = NULL; + while (list->sl_head != NULL) + { + stream = list->sl_head; + list->sl_head = stream->fs_next; + +#ifndef CONFIG_STDIO_DISABLE_BUFFERING + /* Destroy the mutex that protects the IO buffer */ + + nxrmutex_destroy(&stream->fs_lock); +#endif + + /* Release the stream */ + +#ifdef CONFIG_BUILD_KERNEL + /* If the exiting group is unprivileged, then it has an address + * environment. Don't bother to release the memory in this case... + * There is no point since the memory lies in the user heap which + * will be destroyed anyway. But if this is a privileged group, + * when we still have to release the memory using the kernel + * allocator. + */ + + if ((group->tg_flags & GROUP_FLAG_PRIVILEGED) != 0) +#endif + { + group_free(group, stream); + } + } +} +#endif + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -69,7 +138,7 @@ void task_uninit_info(FAR struct task_group_s *group) #ifdef CONFIG_FILE_STREAM /* Free resource held by the stream list */ - lib_stream_release(group); + task_uninit_stream(group); #endif /* CONFIG_FILE_STREAM */ nxmutex_destroy(&info->ta_lock);