fs/inode/, fs/vfs/, and sched/task/: File and socket descriptors are no longer allocated for kernel threads. They must use SYSLOG for output and the low-level psock interfaces for network I/O. This saves a little memory which might be important for small footprint configurations.

This commit is contained in:
Gregory Nutt 2016-04-14 10:14:38 -06:00
parent 39a37d6aa8
commit 3f731241cb
6 changed files with 63 additions and 41 deletions

View File

@ -11642,4 +11642,8 @@
* net/sockets/listen.c and accept.c and include/nuttx/net: Separate
out psock_listen() and psock_accepti() for internal OS usage
(2016-04-14).
* fs/inode/, fs/vfs/, and sched/task/: File and socket descriptors are
no longer allocated for kernel threads. They must use SYSLOG for
output and the low-level psock interfaces for network I/O. This
saves a little memory which might be important for small footprint
configurations (2015-04-14).

View File

@ -1,7 +1,7 @@
/****************************************************************************
* fs/inode/fs_files.c
*
* Copyright (C) 2007-2009, 2011-2013 Gregory Nutt. All rights reserved.
* Copyright (C) 2007-2009, 2011-2013, 2016 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
@ -51,22 +51,6 @@
#include "inode/inode.h"
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/****************************************************************************
* Private Types
****************************************************************************/
/****************************************************************************
* Private Data
****************************************************************************/
/****************************************************************************
* Private Data
****************************************************************************/
/****************************************************************************
* Private Functions
****************************************************************************/
@ -222,9 +206,18 @@ int file_dup2(FAR struct file *filep1, FAR struct file *filep2)
}
list = sched_getfiles();
DEBUGASSERT(list);
_files_semtake(list);
/* The file list can be NULL under two cases: (1) One is an obscure
* cornercase: When memory management debug output is enabled. Then
* there may be attempts to write to stdout from malloc before the group
* data has been allocated. The other other is (2) if this is a kernel
* thread. Kernel threads have no allocated file descriptors.
*/
if (list != NULL)
{
_files_semtake(list);
}
/* If there is already an inode contained in the new file structure,
* close the file and release the inode.
@ -278,7 +271,11 @@ int file_dup2(FAR struct file *filep1, FAR struct file *filep2)
}
}
_files_semgive(list);
if (list != NULL)
{
_files_semgive(list);
}
return OK;
/* Handler various error conditions */
@ -291,7 +288,11 @@ errout_with_inode:
errout_with_ret:
err = -ret;
_files_semgive(list);
if (list != NULL)
{
_files_semgive(list);
}
errout:
set_errno(err);
@ -312,8 +313,10 @@ int files_allocate(FAR struct inode *inode, int oflags, off_t pos, int minfd)
FAR struct filelist *list;
int i;
/* Get the file descriptor list. It should not be NULL in this context. */
list = sched_getfiles();
DEBUGASSERT(list);
DEBUGASSERT(list != NULL);
_files_semtake(list);
for (i = minfd; i < CONFIG_NFILE_DESCRIPTORS; i++)
@ -349,10 +352,12 @@ int files_close(int fd)
FAR struct filelist *list;
int ret;
/* Get the thread-specific file list */
/* Get the thread-specific file list. It should never be NULL in this
* context.
*/
list = sched_getfiles();
DEBUGASSERT(list);
DEBUGASSERT(list != NULL);
/* If the file was properly opened, there should be an inode assigned */

View File

@ -52,6 +52,7 @@
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* Is it better to allocate the struct inode_path_s from the heap? or
* from the stack? This decision depends on how often this is down and
* how much stack space you can afford.

View File

@ -1,7 +1,7 @@
/****************************************************************************
* fs/inode/fs_inode.c
*
* Copyright (C) 2007-2009, 2011-2012 Gregory Nutt. All rights reserved.
* Copyright (C) 2007-2009, 2011-2012, 2016 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
@ -57,6 +57,7 @@
/****************************************************************************
* Private Types
****************************************************************************/
/* Implements a re-entrant mutex for inode access. This must be re-entrant
* because there can be cycles. For example, it may be necessary to destroy
* a block driver inode on umount() after a removable block device has been

View File

@ -1,7 +1,7 @@
/****************************************************************************
* fs/vfs/fs_getfilep.c
*
* Copyright (C) 2014 Gregory Nutt. All rights reserved.
* Copyright (C) 2014, 2016 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
@ -91,12 +91,14 @@ FAR struct file *fs_getfilep(int fd)
list = sched_getfiles();
/* The file list can be NULL under one obscure cornercase: When memory
* management debug output is enabled. Then there may be attempts to
* write to stdout from malloc before the group data has been allocated.
/* The file list can be NULL under two cases: (1) One is an obscure
* cornercase: When memory management debug output is enabled. Then
* there may be attempts to write to stdout from malloc before the group
* data has been allocated. The other other is (2) if this is a kernel
* thread. Kernel threads have no allocated file descriptors.
*/
if (!list)
if (list == NULL)
{
errcode = EAGAIN;
goto errout;

View File

@ -1,7 +1,7 @@
/****************************************************************************
* sched/task/task_create.c
*
* Copyright (C) 2007-2010, 2013-2014 Gregory Nutt. All rights reserved.
* Copyright (C) 2007-2010, 2013-2014, 2016 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
@ -85,7 +85,8 @@
****************************************************************************/
static int thread_create(FAR const char *name, uint8_t ttype, int priority,
int stack_size, main_t entry, FAR char * const argv[])
int stack_size, main_t entry,
FAR char * const argv[])
{
FAR struct task_tcb_s *tcb;
pid_t pid;
@ -115,14 +116,20 @@ static int thread_create(FAR const char *name, uint8_t ttype, int priority,
}
#endif
/* Associate file descriptors with the new task */
#if CONFIG_NFILE_DESCRIPTORS > 0 || CONFIG_NSOCKET_DESCRIPTORS > 0
ret = group_setuptaskfiles(tcb);
if (ret < OK)
/* Associate file descriptors with the new task. Exclude kernel threads;
* kernel threads do not have file or socket descriptors. They must use
* SYSLOG for output and the low-level psock interfaces for network I/O.
*/
if (ttype != TCB_FLAG_TTYPE_KERNEL)
{
errcode = -ret;
goto errout_with_tcb;
ret = group_setuptaskfiles(tcb);
if (ret < OK)
{
errcode = -ret;
goto errout_with_tcb;
}
}
#endif
@ -228,7 +235,8 @@ errout:
int task_create(FAR const char *name, int priority,
int stack_size, main_t entry, FAR char * const argv[])
{
return thread_create(name, TCB_FLAG_TTYPE_TASK, priority, stack_size, entry, argv);
return thread_create(name, TCB_FLAG_TTYPE_TASK, priority, stack_size,
entry, argv);
}
#endif
@ -251,5 +259,6 @@ int task_create(FAR const char *name, int priority,
int kernel_thread(FAR const char *name, int priority,
int stack_size, main_t entry, FAR char * const argv[])
{
return thread_create(name, TCB_FLAG_TTYPE_KERNEL, priority, stack_size, entry, argv);
return thread_create(name, TCB_FLAG_TTYPE_KERNEL, priority, stack_size,
entry, argv);
}