+static TaskInfo*
+newTask (OSThreadId id, rtsBool is_worker)
+{
+ long currentElapsedTime, currentUserTime, elapsedGCTime;
+ TaskInfo *task_info;
+
+ if (taskCount >= taskTableSize) {
+ expandTaskTable();
+ }
+
+ insertHashTable( taskHash, id, &(taskTable[taskCount]) );
+
+ stat_getTimes(¤tElapsedTime, ¤tUserTime, &elapsedGCTime);
+
+ task_info = &taskTable[taskCount];
+
+ task_info->id = id;
+ task_info->is_worker = is_worker;
+ task_info->stopped = rtsFalse;
+ task_info->mut_time = 0.0;
+ task_info->mut_etime = 0.0;
+ task_info->gc_time = 0.0;
+ task_info->gc_etime = 0.0;
+ task_info->muttimestart = currentUserTime;
+ task_info->elapsedtimestart = currentElapsedTime;
+
+ taskCount++;
+ workerCount++;
+ tasksRunning++;
+
+ IF_DEBUG(scheduler,sched_belch("startTask: new task %ld (total_count: %d; waiting: %d)\n", id, taskCount, rts_n_waiting_tasks););
+
+ return task_info;
+}
+
+rtsBool
+startTask (void (*taskStart)(void))