[rtems-libbsd commit] Restructure init and add more detailed initialization .

Jennifer Averett jennifer at rtems.org
Tue Jul 17 13:17:10 UTC 2012


Module:    rtems-libbsd
Branch:    master
Commit:    9ee8629924e80589049dfc47be80fd423930bb6d
Changeset: http://git.rtems.org/rtems-libbsd/commit/?id=9ee8629924e80589049dfc47be80fd423930bb6d

Author:    Jennifer Averett <jennifer.averett at oarcorp.com>
Date:      Tue Jul 17 08:19:04 2012 -0500

Restructure init and add more detailed initialization.

---

 rtemsbsd/src/rtems-bsd-thread.c |  110 +++++++++++++++++++++++++++++++++------
 1 files changed, 93 insertions(+), 17 deletions(-)

diff --git a/rtemsbsd/src/rtems-bsd-thread.c b/rtemsbsd/src/rtems-bsd-thread.c
index f6b9abf..230fa8f 100644
--- a/rtemsbsd/src/rtems-bsd-thread.c
+++ b/rtemsbsd/src/rtems-bsd-thread.c
@@ -45,13 +45,102 @@
 #include <freebsd/sys/proc.h>
 #include <freebsd/sys/kthread.h>
 #include <freebsd/sys/malloc.h>
+#include <freebsd/sys/lock.h>
+#include <freebsd/sys/mutex.h>
+#include <freebsd/sys/jail.h>
 
 RTEMS_CHAIN_DEFINE_EMPTY(rtems_bsd_thread_chain);
 
 /* FIXME: What to do with the credentials? */
 static struct ucred FIXME_ucred = {
-  .cr_ref = 1
+  .cr_ref = 1				/* reference count */
 };
+static struct proc  FIXME_proc = {
+  .p_ucred = NULL /* (c) Process owner's identity. */
+};
+static int prison_init = 1;
+static struct prison FIXME_prison = {
+  .pr_parent = NULL
+};
+
+static struct thread *
+rtems_bsd_thread_init_note( rtems_id id )
+{
+	rtems_status_code sc = RTEMS_SUCCESSFUL;
+	unsigned index = 0;
+	char name [5] = "_???";
+	struct thread *td = malloc(sizeof(struct thread), M_TEMP, M_WAITOK | M_ZERO);
+  struct proc   *proc;
+
+	if ( td == NULL )
+		return td;
+
+	sc = rtems_task_set_note( id, RTEMS_NOTEPAD_0, ( uint32_t )td );
+	if (sc != RTEMS_SUCCESSFUL) {
+		free(td, M_TEMP);
+		return NULL;
+	}
+
+	index = rtems_object_id_get_index(id);
+	snprintf(name + 1, sizeof(name) - 1, "%03u", index);
+	sc = rtems_object_set_name(id, name);
+	if (sc != RTEMS_SUCCESSFUL) {
+		rtems_task_delete(id);
+		free(td, M_TEMP);
+		return 	NULL;
+	}
+
+	td->td_id = id;
+	td->td_ucred = crhold(&FIXME_ucred);
+  
+	td->td_proc = &FIXME_proc;
+	if (td->td_proc->p_ucred != NULL)
+		return td;
+
+  if (prison_init ) {
+    mtx_init(&FIXME_prison.pr_mtx, "prison lock", NULL, MTX_DEF | MTX_DUPOK);
+    prison_init = 0;
+  }
+
+  FIXME_ucred.cr_prison = &FIXME_prison;     /* jail(2) */
+
+	td->td_proc->p_ucred = crhold(&FIXME_ucred);
+	mtx_init(&td->td_proc->p_mtx, "process lock", NULL, MTX_DEF | MTX_DUPOK);
+	td->td_proc->p_pid = getpid();
+	td->td_proc->p_fibnum = 0;
+
+  return td;
+}
+
+/*
+ *  XXX Threads which delete themselves will leak this
+ *  XXX Maybe better integrated into the TCB OR a task variable.
+ *  XXX but this is OK for now
+ */
+struct thread *rtems_get_curthread(void)
+{
+	struct thread *td;
+	rtems_status_code sc;
+	rtems_id id;
+
+	/*
+	 * If we already have a struct thread associated with this thread,
+	 * obtain it
+	 */
+  id = rtems_task_self();
+
+	sc = rtems_task_get_note( id, RTEMS_NOTEPAD_0, (uint32_t *) &td );
+	if (sc != RTEMS_SUCCESSFUL) {
+			panic("rtems_get_curthread: get note Error\n");
+	}
+
+  td = rtems_bsd_thread_init_note( id);
+  if ( td == NULL ){
+		panic("rtems_get_curthread: Unable to generate thread note\n");
+  }
+
+  return td;
+}
 
 static int
 rtems_bsd_thread_start(struct thread **td_ptr, void (*func)(void *), void *arg, int flags, int pages, const char *fmt, va_list ap)
@@ -80,23 +169,10 @@ rtems_bsd_thread_start(struct thread **td_ptr, void (*func)(void *), void *arg,
 			return ENOMEM;
 		}
 
-    sc = rtems_task_set_note( id, RTEMS_NOTEPAD_0, ( uint32_t )td );
-    if (sc != RTEMS_SUCCESSFUL) {
-      free(td, M_TEMP);
-
-      return ENOMEM;
-    }
-
-		index = rtems_object_id_get_index(id);
-		snprintf(name + 1, sizeof(name) - 1, "%03u", index);
-		sc = rtems_object_set_name(id, name);
-		if (sc != RTEMS_SUCCESSFUL) {
-			rtems_task_delete(id);
-			free(td, M_TEMP);
-
+    td = rtems_bsd_thread_init_note( id );
+    if (!td)
 			return ENOMEM;
-		}
-
+		
 		sc = rtems_task_start(id, (rtems_task_entry) func, (rtems_task_argument) arg);
 		if (sc != RTEMS_SUCCESSFUL) {
 			rtems_task_delete(id);




More information about the vc mailing list