+/**
+ * \fn tThread *Threads_CloneTCB(Uint *Err, Uint Flags)
+ */
+tThread *Threads_CloneTCB(Uint *Err, Uint Flags)
+{
+ tThread *cur, *new;
+ int i;
+ cur = Proc_GetCurThread();
+
+ new = malloc(sizeof(tThread));
+ if(new == NULL) {
+ *Err = -ENOMEM;
+ return NULL;
+ }
+
+ new->Next = NULL;
+ new->IsLocked = 0;
+ new->Status = THREAD_STAT_ACTIVE;
+ new->RetStatus = 0;
+
+ // Get Thread ID
+ new->TID = giNextTID++;
+ new->PTID = cur->TID;
+
+ // Clone Name
+ new->ThreadName = malloc(strlen(cur->ThreadName)+1);
+ strcpy(new->ThreadName, cur->ThreadName);
+
+ // Set Thread Group ID (PID)
+ if(Flags & CLONE_VM)
+ new->TGID = new->TID;
+ else
+ new->TGID = cur->TGID;
+
+ // Messages are not inherited
+ new->Messages = NULL;
+ new->LastMessage = NULL;
+
+ // Set State
+ new->Remaining = new->Quantum = cur->Quantum;
+ new->NumTickets = cur->NumTickets;
+
+ // Set Signal Handlers
+ new->CurSignal = 0;
+ if(Flags & CLONE_VM)
+ memset(new->SignalHandlers, 0, sizeof(new->SignalHandlers));
+ else
+ memcpy(new->SignalHandlers, cur->SignalHandlers, sizeof(new->SignalHandlers));
+ memset(&new->SignalState, 0, sizeof(tTaskState));
+
+ for( i = 0; i < NUM_CFG_ENTRIES; i ++ )
+ {
+ switch(cCONFIG_TYPES[i])
+ {
+ default:
+ new->Config[i] = cur->Config[i];
+ break;
+ case CFGT_HEAPSTR:
+ if(cur->Config[i])
+ new->Config[i] = (Uint) strdup( (void*)cur->Config[i] );
+ else
+ new->Config[i] = 0;
+ break;
+ }
+ }
+
+ return new;
+}
+
+/**
+ * \fn Uint *Threads_GetCfgPtr(int Id)
+ */
+Uint *Threads_GetCfgPtr(int Id)
+{
+ if(Id < 0 || Id >= NUM_CFG_ENTRIES) {
+ Warning("Threads_GetCfgPtr: Index %i is out of bounds", Id);
+ return NULL;
+ }
+
+ return &Proc_GetCurThread()->Config[Id];
+}
+