summaryrefslogtreecommitdiff
path: root/nuttx/sched
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2013-01-18 16:37:37 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2013-01-18 16:37:37 +0000
commit5eb6c1464f2e3dbaff32b53bed81990932ae4ef8 (patch)
treead05ee2dccc40b4103f5077dc5d66367a16bba83 /nuttx/sched
parent4b2838bcbd58ec1d77e2c8b658191d6aab40a069 (diff)
downloadpx4-nuttx-5eb6c1464f2e3dbaff32b53bed81990932ae4ef8.tar.gz
px4-nuttx-5eb6c1464f2e3dbaff32b53bed81990932ae4ef8.tar.bz2
px4-nuttx-5eb6c1464f2e3dbaff32b53bed81990932ae4ef8.zip
Beginnings of definitions for the LPC1788; convert olimex-lpc1766stk to use kconfig-frontends
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5533 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/sched')
-rw-r--r--nuttx/sched/Makefile172
-rw-r--r--nuttx/sched/os_internal.h2
-rw-r--r--nuttx/sched/task_posixspawn.c3
-rw-r--r--nuttx/sched/task_reparent.c77
4 files changed, 129 insertions, 125 deletions
diff --git a/nuttx/sched/Makefile b/nuttx/sched/Makefile
index 73c67239e..38d3e047f 100644
--- a/nuttx/sched/Makefile
+++ b/nuttx/sched/Makefile
@@ -35,166 +35,172 @@
-include $(TOPDIR)/Make.defs
-ASRCS =
-AOBJS = $(ASRCS:.S=$(OBJEXT))
-
-MISC_SRCS = os_start.c os_bringup.c errno_getptr.c errno_get.c errno_set.c \
- sched_garbage.c sched_setupstreams.c sched_getfiles.c sched_getsockets.c \
- sched_getstreams.c sched_setupidlefiles.c sched_setuptaskfiles.c \
- sched_setuppthreadfiles.c sched_releasefiles.c
-
-TSK_SRCS = prctl.c task_create.c task_init.c task_setup.c task_activate.c \
- task_start.c task_delete.c task_deletecurrent.c task_exithook.c \
- task_restart.c task_vfork.c exit.c getpid.c sched_addreadytorun.c \
- sched_removereadytorun.c sched_addprioritized.c sched_mergepending.c \
- sched_addblocked.c sched_removeblocked.c sched_free.c sched_gettcb.c \
- sched_verifytcb.c sched_releasetcb.c task_posixspawn.c
-
-SCHED_SRCS = sched_setparam.c sched_setpriority.c sched_getparam.c \
- sched_setscheduler.c sched_getscheduler.c \
- sched_yield.c sched_rrgetinterval.c sched_foreach.c \
- sched_lock.c sched_unlock.c sched_lockcount.c sched_self.c
+ASRCS =
+AOBJS = $(ASRCS:.S=$(OBJEXT))
+
+MISC_SRCS = os_start.c os_bringup.c errno_getptr.c errno_get.c errno_set.c
+MISC_SRCS += sched_garbage.c sched_setupstreams.c sched_getfiles.c sched_getsockets.c
+MISC_SRCS += sched_getstreams.c sched_setupidlefiles.c sched_setuptaskfiles.c
+MISC_SRCS += sched_setuppthreadfiles.c sched_releasefiles.c
+
+TSK_SRCS = prctl.c task_create.c task_init.c task_setup.c task_activate.c
+TSK_SRCS += task_start.c task_delete.c task_deletecurrent.c task_exithook.c
+TSK_SRCS += task_restart.c task_vfork.c exit.c getpid.c sched_addreadytorun.c
+TSK_SRCS += sched_removereadytorun.c sched_addprioritized.c sched_mergepending.c
+TSK_SRCS += sched_addblocked.c sched_removeblocked.c sched_free.c sched_gettcb.c
+TSK_SRCS += sched_verifytcb.c sched_releasetcb.c
+
+ifneq ($(CONFIG_BINFMT_DISABLE),y)
+ifeq ($(CONFIG_LIBC_EXECFUNCS),y)
+TSK_SRCS += task_posixspawn.c
+endif
+endif
+
+SCHED_SRCS = sched_setparam.c sched_setpriority.c sched_getparam.c
+SCHED_SRCS += sched_setscheduler.c sched_getscheduler.c
+SCHED_SRCS += sched_yield.c sched_rrgetinterval.c sched_foreach.c
+SCHED_SRCS += sched_lock.c sched_unlock.c sched_lockcount.c sched_self.c
ifeq ($(CONFIG_SCHED_ATEXIT),y)
-SCHED_SRCS += atexit.c
+SCHED_SRCS += atexit.c
endif
ifeq ($(CONFIG_SCHED_ONEXIT),y)
-SCHED_SRCS += on_exit.c
+SCHED_SRCS += on_exit.c
endif
ifeq ($(CONFIG_PRIORITY_INHERITANCE),y)
-SCHED_SRCS += sched_reprioritize.c
+SCHED_SRCS += sched_reprioritize.c
endif
ifeq ($(CONFIG_SCHED_HAVE_PARENT),y)
-SCHED_SRCS += task_reparent.c
+SCHED_SRCS += task_reparent.c
endif
ifeq ($(CONFIG_SCHED_WAITPID),y)
-SCHED_SRCS += sched_waitpid.c
+SCHED_SRCS += sched_waitpid.c
ifeq ($(CONFIG_SCHED_HAVE_PARENT),y)
-SCHED_SRCS += sched_waitid.c sched_wait.c
+SCHED_SRCS += sched_waitid.c sched_wait.c
endif
endif
-ENV_SRCS = env_getenvironptr.c env_dup.c env_share.c env_release.c \
- env_findvar.c env_removevar.c \
- env_clearenv.c env_getenv.c env_putenv.c env_setenv.c env_unsetenv.c
+ENV_SRCS = env_getenvironptr.c env_dup.c env_share.c env_release.c
+ENV_SRCS += env_findvar.c env_removevar.c
+ENV_SRCS += env_clearenv.c env_getenv.c env_putenv.c env_setenv.c env_unsetenv.c
-WDOG_SRCS = wd_initialize.c wd_create.c wd_start.c wd_cancel.c wd_delete.c \
- wd_gettime.c
+WDOG_SRCS = wd_initialize.c wd_create.c wd_start.c wd_cancel.c wd_delete.c
+WDOG_SRCS += wd_gettime.c
-TIME_SRCS = sched_processtimer.c
+TIME_SRCS = sched_processtimer.c
ifneq ($(CONFIG_DISABLE_SIGNALS),y)
-TIME_SRCS += sleep.c usleep.c
+TIME_SRCS += sleep.c usleep.c
endif
-CLOCK_SRCS = clock_initialize.c clock_settime.c clock_gettime.c clock_getres.c \
- clock_time2ticks.c clock_abstime2ticks.c clock_ticks2time.c \
- clock_gettimeofday.c clock_systimer.c
+CLOCK_SRCS = clock_initialize.c clock_settime.c clock_gettime.c clock_getres.c
+CLOCK_SRCS += clock_time2ticks.c clock_abstime2ticks.c clock_ticks2time.c
+CLOCK_SRCS += clock_gettimeofday.c clock_systimer.c
-SIGNAL_SRCS = sig_initialize.c \
- sig_action.c sig_procmask.c sig_pending.c sig_suspend.c \
- sig_kill.c sig_queue.c sig_waitinfo.c sig_timedwait.c \
- sig_findaction.c sig_allocatependingsigaction.c \
- sig_releasependingsigaction.c sig_unmaskpendingsignal.c \
- sig_removependingsignal.c sig_releasependingsignal.c sig_lowest.c \
- sig_mqnotempty.c sig_cleanup.c sig_received.c sig_deliver.c pause.c
+SIGNAL_SRCS = sig_initialize.c
+SIGNAL_SRCS += sig_action.c sig_procmask.c sig_pending.c sig_suspend.c
+SIGNAL_SRCS += sig_kill.c sig_queue.c sig_waitinfo.c sig_timedwait.c
+SIGNAL_SRCS += sig_findaction.c sig_allocatependingsigaction.c
+SIGNAL_SRCS += sig_releasependingsigaction.c sig_unmaskpendingsignal.c
+SIGNAL_SRCS += sig_removependingsignal.c sig_releasependingsignal.c sig_lowest.c
+SIGNAL_SRCS += sig_mqnotempty.c sig_cleanup.c sig_received.c sig_deliver.c pause.c
-MQUEUE_SRCS = mq_open.c mq_close.c mq_unlink.c mq_send.c mq_timedsend.c\
- mq_sndinternal.c mq_receive.c mq_timedreceive.c mq_rcvinternal.c \
- mq_initialize.c mq_descreate.c mq_findnamed.c mq_msgfree.c mq_msgqfree.c
+MQUEUE_SRCS = mq_open.c mq_close.c mq_unlink.c mq_send.c mq_timedsend.c
+MQUEUE_SRCS += mq_sndinternal.c mq_receive.c mq_timedreceive.c mq_rcvinternal.c
+MQUEUE_SRCS += mq_initialize.c mq_descreate.c mq_findnamed.c mq_msgfree.c mq_msgqfree.c
ifneq ($(CONFIG_DISABLE_SIGNALS),y)
-MQUEUE_SRCS += mq_waitirq.c
+MQUEUE_SRCS += mq_waitirq.c
endif
ifneq ($(CONFIG_DISABLE_SIGNALS),y)
-MQUEUE_SRCS += mq_notify.c
+MQUEUE_SRCS += mq_notify.c
endif
-PTHREAD_SRCS = pthread_create.c pthread_exit.c pthread_join.c pthread_detach.c \
- pthread_yield.c pthread_getschedparam.c pthread_setschedparam.c \
- pthread_mutexinit.c pthread_mutexdestroy.c \
- pthread_mutexlock.c pthread_mutextrylock.c pthread_mutexunlock.c \
- pthread_condinit.c pthread_conddestroy.c \
- pthread_condwait.c pthread_condsignal.c pthread_condbroadcast.c \
- pthread_barrierinit.c pthread_barrierdestroy.c pthread_barrierwait.c \
- pthread_cancel.c pthread_setcancelstate.c \
- pthread_keycreate.c pthread_setspecific.c pthread_getspecific.c pthread_keydelete.c \
- pthread_initialize.c pthread_completejoin.c pthread_findjoininfo.c \
- pthread_removejoininfo.c pthread_once.c pthread_setschedprio.c
+PTHREAD_SRCS = pthread_create.c pthread_exit.c pthread_join.c pthread_detach.c
+PTHREAD_SRCS += pthread_yield.c pthread_getschedparam.c pthread_setschedparam.c
+PTHREAD_SRCS += pthread_mutexinit.c pthread_mutexdestroy.c
+PTHREAD_SRCS += pthread_mutexlock.c pthread_mutextrylock.c pthread_mutexunlock.c
+PTHREAD_SRCS += pthread_condinit.c pthread_conddestroy.c
+PTHREAD_SRCS += pthread_condwait.c pthread_condsignal.c pthread_condbroadcast.c
+PTHREAD_SRCS += pthread_barrierinit.c pthread_barrierdestroy.c pthread_barrierwait.c
+PTHREAD_SRCS += pthread_cancel.c pthread_setcancelstate.c
+PTHREAD_SRCS += pthread_keycreate.c pthread_setspecific.c pthread_getspecific.c pthread_keydelete.c
+PTHREAD_SRCS += pthread_initialize.c pthread_completejoin.c pthread_findjoininfo.c
+PTHREAD_SRCS += pthread_removejoininfo.c pthread_once.c pthread_setschedprio.c
ifneq ($(CONFIG_DISABLE_SIGNALS),y)
-PTHREAD_SRCS += pthread_condtimedwait.c pthread_kill.c pthread_sigmask.c
+PTHREAD_SRCS += pthread_condtimedwait.c pthread_kill.c pthread_sigmask.c
endif
-SEM_SRCS = sem_initialize.c sem_destroy.c sem_open.c sem_close.c sem_unlink.c \
- sem_wait.c sem_trywait.c sem_timedwait.c sem_post.c sem_findnamed.c
+SEM_SRCS = sem_initialize.c sem_destroy.c sem_open.c sem_close.c sem_unlink.c
+SEM_SRCS += sem_wait.c sem_trywait.c sem_timedwait.c sem_post.c sem_findnamed.c
ifneq ($(CONFIG_DISABLE_SIGNALS),y)
-SEM_SRCS += sem_waitirq.c
+SEM_SRCS += sem_waitirq.c
endif
ifeq ($(CONFIG_PRIORITY_INHERITANCE),y)
-SEM_SRCS += sem_holder.c
+SEM_SRCS += sem_holder.c
endif
ifneq ($(CONFIG_DISABLE_POSIX_TIMERS),y)
-TIMER_SRCS = timer_initialize.c timer_create.c timer_delete.c timer_getoverrun.c \
- timer_gettime.c timer_settime.c timer_release.c
+TIMER_SRCS += timer_initialize.c timer_create.c timer_delete.c timer_getoverrun.c
+TIMER_SRCS += timer_gettime.c timer_settime.c timer_release.c
endif
ifeq ($(CONFIG_SCHED_WORKQUEUE),y)
-WORK_SRCS = work_thread.c work_queue.c work_cancel.c work_signal.c
+WORK_SRCS = work_thread.c work_queue.c work_cancel.c work_signal.c
endif
ifeq ($(CONFIG_PAGING),y)
-PGFILL_SRCS = pg_miss.c pg_worker.c
+PGFILL_SRCS = pg_miss.c pg_worker.c
endif
-IRQ_SRCS = irq_initialize.c irq_attach.c irq_dispatch.c irq_unexpectedisr.c
+IRQ_SRCS = irq_initialize.c irq_attach.c irq_dispatch.c irq_unexpectedisr.c
-KMM_SRCS = kmm_initialize.c kmm_addregion.c kmm_semaphore.c \
- kmm_kmalloc.c kmm_kzalloc.c kmm_krealloc.c kmm_kfree.c
+KMM_SRCS = kmm_initialize.c kmm_addregion.c kmm_semaphore.c
+KMM_SRCS = kmm_kmalloc.c kmm_kzalloc.c kmm_krealloc.c kmm_kfree.c
-CSRCS = $(MISC_SRCS) $(TSK_SRCS) $(SCHED_SRCS) $(WDOG_SRCS) $(TIME_SRCS) \
- $(SEM_SRCS) $(TIMER_SRCS) $(WORK_SRCS) $(PGFILL_SRCS) $(IRQ_SRCS)
+CSRCS = $(MISC_SRCS) $(TSK_SRCS) $(SCHED_SRCS) $(WDOG_SRCS) $(TIME_SRCS) \
+ $(SEM_SRCS) $(TIMER_SRCS) $(WORK_SRCS) $(PGFILL_SRCS) $(IRQ_SRCS)
ifneq ($(CONFIG_DISABLE_CLOCK),y)
-CSRCS += $(CLOCK_SRCS)
+CSRCS += $(CLOCK_SRCS)
endif
ifneq ($(CONFIG_DISABLE_PTHREAD),y)
-CSRCS += $(PTHREAD_SRCS)
+CSRCS += $(PTHREAD_SRCS)
endif
ifneq ($(CONFIG_DISABLE_SIGNALS),y)
-CSRCS += $(SIGNAL_SRCS)
+CSRCS += $(SIGNAL_SRCS)
endif
ifneq ($(CONFIG_DISABLE_MQUEUE),y)
-CSRCS += $(MQUEUE_SRCS)
+CSRCS += $(MQUEUE_SRCS)
endif
ifneq ($(CONFIG_DISABLE_ENVIRON),y)
-CSRCS += $(ENV_SRCS)
+CSRCS += $(ENV_SRCS)
endif
ifeq ($(CONFIG_NUTTX_KERNEL),y)
-CSRCS += $(KMM_SRCS)
+CSRCS += $(KMM_SRCS)
endif
-COBJS = $(CSRCS:.c=$(OBJEXT))
+COBJS = $(CSRCS:.c=$(OBJEXT))
-SRCS = $(ASRCS) $(CSRCS)
-OBJS = $(AOBJS) $(COBJS)
+SRCS = $(ASRCS) $(CSRCS)
+OBJS = $(AOBJS) $(COBJS)
-BIN = libsched$(LIBEXT)
+BIN = libsched$(LIBEXT)
-all: $(BIN)
+all: $(BIN)
.PHONY: context depend clean distclean
$(AOBJS): %$(OBJEXT): %.S
diff --git a/nuttx/sched/os_internal.h b/nuttx/sched/os_internal.h
index f21d9654f..95b42c7ae 100644
--- a/nuttx/sched/os_internal.h
+++ b/nuttx/sched/os_internal.h
@@ -269,7 +269,7 @@ int task_argsetup(FAR _TCB *tcb, FAR const char *name, FAR const char *argv[]);
void task_exithook(FAR _TCB *tcb, int status);
int task_deletecurrent(void);
#ifdef CONFIG_SCHED_HAVE_PARENT
-int task_reparent(pid_t oldpid, pid_t newpid, pid_t chpid);
+int task_reparent(pid_t ppid, pid_t chpid);
#endif
#ifndef CONFIG_CUSTOM_STACK
int kernel_thread(FAR const char *name, int priority, int stack_size,
diff --git a/nuttx/sched/task_posixspawn.c b/nuttx/sched/task_posixspawn.c
index 4201e759b..7bb9c9a4d 100644
--- a/nuttx/sched/task_posixspawn.c
+++ b/nuttx/sched/task_posixspawn.c
@@ -40,6 +40,7 @@
#include <nuttx/config.h>
#include <sys/wait.h>
+#include <unistd.h>
#include <semaphore.h>
#include <signal.h>
#include <sched.h>
@@ -431,7 +432,7 @@ static int spawn_proxy(int argc, char *argv[])
* What should we do in the event of a failure?
*/
- int tmp = task_reparent(0, 0, *g_ps_parms.pid);
+ int tmp = task_reparent(0, *g_ps_parms.pid);
if (tmp < 0)
{
sdbg("ERROR: task_reparent() failed: %d\n", tmp);
diff --git a/nuttx/sched/task_reparent.c b/nuttx/sched/task_reparent.c
index 9daa0743b..244825f80 100644
--- a/nuttx/sched/task_reparent.c
+++ b/nuttx/sched/task_reparent.c
@@ -60,8 +60,8 @@
* Change the parent of a task.
*
* Parameters:
- * oldpid - PID of the old parent task (0 if this task)
- * newpid - PID ot the new parent task (0 for the parent of this task)
+ * ppid - PID of the new parent task (0 for grandparent, i.e. the parent
+ * of the current parent task)
* chpid - PID of the child to be reparented.
*
* Return Value:
@@ -69,72 +69,69 @@
*
*****************************************************************************/
-int task_reparent(pid_t oldpid, pid_t newpid, pid_t chpid)
+int task_reparent(pid_t ppid, pid_t chpid)
{
- _TCB *oldtcb;
- _TCB *newtcb;
+ _TCB *ptcb;
_TCB *chtcb;
+ _TCB *otcb;
+ pid_t opid;
irqstate_t flags;
int ret;
- /* If oldpid is zero, then we are parent task. */
+ /* Disable interrupts so that nothing can change in the relatinoship of
+ * the three task: Child, current parent, and new parent.
+ */
- if (oldpid == 0)
- {
- oldpid = getpid();
- }
+ flags = irqsave();
- /* Get the current parent task's TCB */
+ /* Get the child tasks TCB (chtcb) */
- oldtcb = sched_gettcb(oldpid);
- if (!oldtcb)
+ chtcb = sched_gettcb(chpid);
+ if (!chtcb)
{
- return -ESRCH;
+ ret = -ECHILD;
+ goto errout_with_ints;
}
- /* Disable interrupts so that nothing can change from this point */
+ /* Get the PID of the child task's parent (opid) */
- flags = irqsave();
+ opid = chtcb->parent;
- /* If newpid is zero, then new is the parent of oldpid. */
+ /* Get the TCB of the child task's parent (otcb) */
- if (newpid == 0)
- {
- newpid = oldtcb->parent;
- }
-
- /* Get the new parent task's TCB */
-
- newtcb = sched_gettcb(newpid);
- if (!newtcb)
+ otcb = sched_gettcb(opid);
+ if (!otcb)
{
ret = -ESRCH;
goto errout_with_ints;
}
- /* Get the child tasks TCB */
+ /* If new parent task's PID (ppid) is zero, then new parent is the
+ * grandparent will be the new parent, i.e., the parent of the current
+ * parent task.
+ */
- chtcb = sched_gettcb(chpid);
- if (!chtcb)
+ if (ppid == 0)
{
- ret = -ECHILD;
- goto errout_with_ints;
+ ppid = otcb->parent;
}
+
+ /* Get the new parent task's TCB (ptcb) */
- /* Verify that oldpid is the parent of chpid */
-
- if (chtcb->parent != oldpid)
+ ptcb = sched_gettcb(ppid);
+ if (!ptcb)
{
- ret = -ECHILD;
+ ret = -ESRCH;
goto errout_with_ints;
}
- /* Okay, reparent the child */
+ /* Then reparent the child */
+
+ DEBUGASSERT(otcb->nchildren > 0);
- DEBUGASSERT(oldtcb->nchildren > 0);
- chtcb->parent = newpid;
- oldtcb->nchildren--;
- newtcb->nchildren++;
+ chtcb->parent = ppid; /* The task specified by ppid is the new parent */
+ otcb->nchildren--; /* The orignal parent now has one few children */
+ ptcb->nchildren++; /* The new parent has one additional child */
ret = OK;
errout_with_ints: