diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-07-14 19:30:31 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-07-14 19:30:31 +0000 |
commit | e135573acc348649e767ca67a1ec189fe4e0fcda (patch) | |
tree | b34f7d2914cba8aeb9311c5bae3771af40054640 /nuttx/sched/sched_setuptaskfiles.c | |
parent | d76fa866ad009d65396acf1aa08fcffd3b4b041e (diff) | |
download | px4-nuttx-e135573acc348649e767ca67a1ec189fe4e0fcda.tar.gz px4-nuttx-e135573acc348649e767ca67a1ec189fe4e0fcda.tar.bz2 px4-nuttx-e135573acc348649e767ca67a1ec189fe4e0fcda.zip |
Fix STM32 F2/F4 SDIO clocking; Clean-up files in sched/ directory
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4940 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/sched/sched_setuptaskfiles.c')
-rw-r--r-- | nuttx/sched/sched_setuptaskfiles.c | 191 |
1 files changed, 130 insertions, 61 deletions
diff --git a/nuttx/sched/sched_setuptaskfiles.c b/nuttx/sched/sched_setuptaskfiles.c index 3b75fa350..7f754e151 100644 --- a/nuttx/sched/sched_setuptaskfiles.c +++ b/nuttx/sched/sched_setuptaskfiles.c @@ -70,11 +70,127 @@ ****************************************************************************/ /**************************************************************************** + * Name: sched_dupfiles + * + * Description: + * Duplicate parent task's file descriptors. + * + * Input Parameters: + * tcb - tcb of the new task. + * + * Return Value: + * None + * + ****************************************************************************/ + +#if CONFIG_NFILE_DESCRIPTORS > 0 && !defined(CONFIG_FDCLONE_DISABLE) +static inline void sched_dupfiles(FAR _TCB *tcb) +{ + /* The parent task is the one at the head of the ready-to-run list */ + + FAR _TCB *rtcb = (FAR _TCB*)g_readytorun.head; + FAR struct file *parent; + FAR struct file *child; + int i; + + /* Duplicate the file descriptors. This will be either all of the + * file descriptors or just the first three (stdin, stdout, and stderr) + * if CONFIG_FDCLONE_STDIO is defined. NFSDS_TOCLONE is set + * accordingly above. + */ + + if (rtcb->filelist) + { + /* Get pointers to the parent and child task file lists */ + + parent = rtcb->filelist->fl_files; + child = tcb->filelist->fl_files; + + /* Check each file in the parent file list */ + + for (i = 0; i < NFDS_TOCLONE; i++) + { + /* Check if this file is opened by the parent. We can tell if + * if the file is open because it contain a reference to a non-NULL + * i-node structure. + */ + + if (parent[i].f_inode) + { + /* Yes... duplicate it for the child */ + + (void)files_dup(&parent[i], &child[i]); + } + } + } +} +#else /* CONFIG_NFILE_DESCRIPTORS && !CONFIG_FDCLONE_DISABLE */ +# define sched_dupfiles(tcb) +#endif /* CONFIG_NFILE_DESCRIPTORS && !CONFIG_FDCLONE_DISABLE */ + +/**************************************************************************** + * Name: sched_dupsockets + * + * Description: + * Duplicate the parent task's socket descriptors. + * + * Input Parameters: + * tcb - tcb of the new task. + * + * Return Value: + * None + * + ****************************************************************************/ + +#if CONFIG_NSOCKET_DESCRIPTORS > 0 && !defined(CONFIG_SDCLONE_DISABLE) +static inline void sched_dupsockets(FAR _TCB *tcb) +{ + /* The parent task is the one at the head of the ready-to-run list */ + + FAR _TCB *rtcb = (FAR _TCB*)g_readytorun.head; + FAR struct sockets *parent; + FAR struct sockets *child; + int i; + + /* Duplicate the socket descriptors of all sockets opened by the parent + * task. + */ + + if (rtcb->sockets) + { + /* Get pointers to the parent and child task socket lists */ + + parent = rtcb->sockets->sl_sockets; + child = tcb->sockets->sl_sockets; + + /* Check each socket in the parent socket list */ + + for (i = 0; i < CONFIG_NSOCKET_DESCRIPTORS; i++) + { + /* Check if this parent socket is allocated. We can tell if the + * socket is allocated because it will have a positive, non-zero + * reference count. + */ + + if (parent[i].s_crefs > 0) + { + /* Yes... duplicate it for the child */ + + (void)net_clone(&parent[i], &child[i]); + } + } + } +} +#else /* CONFIG_NSOCKET_DESCRIPTORS && !CONFIG_SDCLONE_DISABLE */ +# define sched_dupsockets(tcb) +#endif /* CONFIG_NSOCKET_DESCRIPTORS && !CONFIG_SDCLONE_DISABLE */ + +/**************************************************************************** * Public Functions ****************************************************************************/ /**************************************************************************** - * Function: sched_setuptaskfiles + * Name: sched_setuptaskfiles * * Description: * Configure a newly allocated TCB so that it will inherit @@ -92,88 +208,41 @@ int sched_setuptaskfiles(FAR _TCB *tcb) { -#if CONFIG_NFILE_DESCRIPTORS > 0 - FAR _TCB *rtcb = (FAR _TCB*)g_readytorun.head; - int i; -#endif /* CONFIG_NFILE_DESCRIPTORS > 0 */ - int ret = OK; - -#if CONFIG_NFILE_DESCRIPTORS > 0 - /* Allocate file descriptors for the TCB */ +#if CONFIG_NFILE_DESCRIPTORS > 0 tcb->filelist = files_alloclist(); if (!tcb->filelist) { return -ENOMEM; } - -#endif /* CONFIG_NFILE_DESCRIPTORS */ - -#if CONFIG_NSOCKET_DESCRIPTORS > 0 +#endif /* Allocate socket descriptors for the TCB */ +#if CONFIG_NSOCKET_DESCRIPTORS > 0 tcb->sockets = net_alloclist(); if (!tcb->sockets) { return -ENOMEM; } - -#endif /* CONFIG_NSOCKET_DESCRIPTORS */ - -#if CONFIG_NFILE_DESCRIPTORS > 0 -#if !defined(CONFIG_FDCLONE_DISABLE) - - /* Duplicate the file descriptors. This will be either all of the - * file descriptors or just the first three (stdin, stdout, and stderr) - * if CONFIG_FDCLONE_STDIO is defined. NFSDS_TOCLONE is set - * accordingly above. - */ - - if (rtcb->filelist) - { - for (i = 0; i < NFDS_TOCLONE; i++) - { - /* Check if this file is opened */ - - if (rtcb->filelist->fl_files[i].f_inode) - { - (void)files_dup(&rtcb->filelist->fl_files[i], - &tcb->filelist->fl_files[i]); - } - } - } #endif -#if CONFIG_NFILE_STREAMS > 0 - - /* Allocate file streams for the TCB */ - - ret = sched_setupstreams(tcb); + /* Duplicate the parent task's file descriptors */ -#endif /* CONFIG_NFILE_STREAMS */ -#endif /* CONFIG_NFILE_DESCRIPTORS */ + sched_dupfiles(tcb); -#if CONFIG_NSOCKET_DESCRIPTORS > 0 && !defined(CONFIG_SDCLONE_DISABLE) + /* Duplicate the parent task's socket descriptors */ - /* Duplicate the socket descriptors */ + sched_dupsockets(tcb); - if (rtcb->sockets) - { - for (i = 0; i < CONFIG_NSOCKET_DESCRIPTORS; i++) - { - /* Check if this socket is allocated */ + /* Allocate file/socket streams for the new TCB */ - if (rtcb->sockets->sl_sockets[i].s_crefs > 0) - { - (void)net_clone(&rtcb->sockets->sl_sockets[i], - &tcb->sockets->sl_sockets[i]); - } - } - } +#if CONFIG_NFILE_STREAMS > 0 + return sched_setupstreams(tcb); +#else + return OK; #endif - return ret; } -#endif /* CONFIG_NFILE_DESCRIPTORS || CONFIG_NSOCKET_DESCRIPTORS */ +#endif /* CONFIG_NFILE_DESCRIPTORS > 0 || CONFIG_NSOCKET_DESCRIPTORS > 0*/ |