summaryrefslogtreecommitdiffstats
path: root/rtemsbsd/src/rtems-bsd-newproc.c
diff options
context:
space:
mode:
authorJennifer Averett <jennifer.averett@oarcorp.com>2012-03-29 12:46:14 -0500
committerJennifer Averett <jennifer.averett@oarcorp.com>2012-03-29 12:46:14 -0500
commit134df2ebd59728b891db6e23b5d826b037ba5b14 (patch)
treef79a8398c8f1a4d4392a397d67807bea84d0a098 /rtemsbsd/src/rtems-bsd-newproc.c
parentAdded log and prison methods to resolve linker errors for RealTek Nic. (diff)
downloadrtems-libbsd-134df2ebd59728b891db6e23b5d826b037ba5b14.tar.bz2
Resolve warnings from taskqueue when linking with RealTek Nic.
Diffstat (limited to 'rtemsbsd/src/rtems-bsd-newproc.c')
-rw-r--r--rtemsbsd/src/rtems-bsd-newproc.c100
1 files changed, 100 insertions, 0 deletions
diff --git a/rtemsbsd/src/rtems-bsd-newproc.c b/rtemsbsd/src/rtems-bsd-newproc.c
new file mode 100644
index 00000000..342d88db
--- /dev/null
+++ b/rtemsbsd/src/rtems-bsd-newproc.c
@@ -0,0 +1,100 @@
+/**
+ * @file
+ *
+ * @ingroup rtems_bsd_rtems
+ *
+ * @brief TODO.
+ */
+
+/*
+ * COPYRIGHT (c) 1989-2012.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ */
+
+#include <string.h>
+#include <stdio.h>
+#include <rtems.h>
+
+
+static uint32_t networkDaemonPriority = 100; /* XXX */
+
+/*
+ * Structure passed to task-start stub
+ */
+struct newtask {
+ void (*entry)(void *);
+ void *arg;
+};
+
+/*
+ * Task-start stub
+ */
+static void
+taskEntry (rtems_task_argument arg)
+{
+ struct newtask t;
+
+ /*
+ * Pick up task information and free
+ * the memory allocated to pass the
+ * information to this task.
+ */
+ t = *(struct newtask *)arg;
+ free ((struct newtask *)arg);
+
+ /*
+ * XXX If we need a semaphore it should be added here
+ */
+
+ /*
+ * Enter the task
+ */
+ (*t.entry)(t.arg);
+ rtems_panic ("Network task returned!\n");
+}
+
+/*
+ * Start a network task
+ */
+rtems_id
+rtems_bsdnet_newproc (char *name, int stacksize, void(*entry)(void *), void *arg)
+{
+ struct newtask *t;
+ char nm[4];
+ rtems_id tid;
+ rtems_status_code sc;
+
+ strncpy (nm, name, 4);
+ sc = rtems_task_create (rtems_build_name(nm[0], nm[1], nm[2], nm[3]),
+ networkDaemonPriority,
+ stacksize,
+ RTEMS_PREEMPT|RTEMS_NO_TIMESLICE|RTEMS_NO_ASR|RTEMS_INTERRUPT_LEVEL(0),
+ RTEMS_NO_FLOATING_POINT|RTEMS_LOCAL,
+ &tid
+ );
+ if (sc != RTEMS_SUCCESSFUL)
+ rtems_panic ("Can't create network daemon `%s': `%s'\n", name, rtems_status_text (sc));
+
+ /*
+ * Set up task arguments
+ */
+ t = malloc (sizeof *t);
+ t->entry = entry;
+ t->arg = arg;
+
+ /*
+ * Start the task
+ */
+ sc = rtems_task_start (tid, taskEntry, (rtems_task_argument)t);
+ if (sc != RTEMS_SUCCESSFUL)
+ rtems_panic ("Can't start network daemon `%s': `%s'\n", name, rtems_status_text (sc));
+
+ /*
+ * Let our caller know the i.d. of the new task
+ */
+ return tid;
+}