+}
+
+/**
+ * leave the thread
+ * @param me the description of the thread to leave
+ */
+static void thread_leave()
+{
+ struct thread **prv, *me;
+
+ /* unlink the current thread and cleanup */
+ me = current_thread;
+ prv = &threads;
+ while (*prv != me)
+ prv = &(*prv)->next;
+ *prv = me->next;
+
+ current_thread = me->upper;
+}
+
+/**
+ * Main processing loop of internal threads with processing jobs.
+ * The loop must be called with the mutex locked
+ * and it returns with the mutex locked.
+ * @param me the description of the thread to use
+ * TODO: how are timeout handled when reentering?
+ */
+static void thread_run_internal(volatile struct thread *me)
+{
+ struct job *job;
+
+ /* enter thread */
+ thread_enter(me);