Made sure that B_SYSTEM_TEAM is never used as a thread ID - the previous code didn't
look correct and was a bit expensive. Some cleanups. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@11629 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -149,10 +149,12 @@ thread_struct_hash(void *_t, const void *_key, uint32 range)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/** Allocates a thread structure (or reuses one from the dead queue).
|
||||||
|
*
|
||||||
* \param threadID The ID to be assigned to the new thread. If
|
* \param threadID The ID to be assigned to the new thread. If
|
||||||
* \code < 0 \endcode a fresh one is allocated.
|
* \code < 0 \endcode a fresh one is allocated.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static struct thread *
|
static struct thread *
|
||||||
create_thread_struct(const char *name, thread_id threadID)
|
create_thread_struct(const char *name, thread_id threadID)
|
||||||
{
|
{
|
||||||
@@ -174,7 +176,7 @@ create_thread_struct(const char *name, thread_id threadID)
|
|||||||
|
|
||||||
strlcpy(t->name, name, B_OS_NAME_LENGTH);
|
strlcpy(t->name, name, B_OS_NAME_LENGTH);
|
||||||
|
|
||||||
t->id = (threadID >= 0 ? threadID : allocate_thread_id());
|
t->id = threadID >= 0 ? threadID : allocate_thread_id();
|
||||||
t->team = NULL;
|
t->team = NULL;
|
||||||
t->cpu = NULL;
|
t->cpu = NULL;
|
||||||
t->sem.blocking = -1;
|
t->sem.blocking = -1;
|
||||||
@@ -309,10 +311,12 @@ _create_kernel_thread_kentry(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/** Creates a new thread in the team with the specified team ID.
|
||||||
|
*
|
||||||
* \param threadID The ID to be assigned to the new thread. If
|
* \param threadID The ID to be assigned to the new thread. If
|
||||||
* \code < 0 \endcode a fresh one is allocated.
|
* \code < 0 \endcode a fresh one is allocated.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static thread_id
|
static thread_id
|
||||||
create_thread(const char *name, team_id teamID, thread_entry_func entry,
|
create_thread(const char *name, team_id teamID, thread_entry_func entry,
|
||||||
void *args1, void *args2, int32 priority, bool kernel, thread_id threadID)
|
void *args1, void *args2, int32 priority, bool kernel, thread_id threadID)
|
||||||
@@ -1159,10 +1163,12 @@ peek_next_thread_id()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/** Kernel private thread creation function.
|
||||||
|
*
|
||||||
* \param threadID The ID to be assigned to the new thread. If
|
* \param threadID The ID to be assigned to the new thread. If
|
||||||
* \code < 0 \endcode a fresh one is allocated.
|
* \code < 0 \endcode a fresh one is allocated.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
thread_id
|
thread_id
|
||||||
spawn_kernel_thread_etc(thread_func function, const char *name, int32 priority,
|
spawn_kernel_thread_etc(thread_func function, const char *name, int32 priority,
|
||||||
void *arg, team_id team, thread_id threadID)
|
void *arg, team_id team, thread_id threadID)
|
||||||
@@ -1195,7 +1201,7 @@ thread_init(kernel_args *args)
|
|||||||
TRACE(("thread_init: entry\n"));
|
TRACE(("thread_init: entry\n"));
|
||||||
|
|
||||||
// create the thread hash table
|
// create the thread hash table
|
||||||
sThreadHash = hash_init(15, (addr_t)&t->all_next - (addr_t)t,
|
sThreadHash = hash_init(15, offsetof(struct thread, all_next),
|
||||||
&thread_struct_compare, &thread_struct_hash);
|
&thread_struct_compare, &thread_struct_hash);
|
||||||
|
|
||||||
// zero out the dead thread structure q
|
// zero out the dead thread structure q
|
||||||
@@ -1212,7 +1218,7 @@ thread_init(kernel_args *args)
|
|||||||
panic("arch_thread_init() failed!\n");
|
panic("arch_thread_init() failed!\n");
|
||||||
|
|
||||||
// skip all thread IDs including B_SYSTEM_TEAM, which is reserved
|
// skip all thread IDs including B_SYSTEM_TEAM, which is reserved
|
||||||
while (allocate_thread_id() < B_SYSTEM_TEAM);
|
sNextThreadID = B_SYSTEM_TEAM + 1;
|
||||||
|
|
||||||
// create an idle thread for each cpu
|
// create an idle thread for each cpu
|
||||||
|
|
||||||
@@ -1222,7 +1228,7 @@ thread_init(kernel_args *args)
|
|||||||
|
|
||||||
sprintf(temp, "idle thread %d", i);
|
sprintf(temp, "idle thread %d", i);
|
||||||
t = create_thread_struct(temp,
|
t = create_thread_struct(temp,
|
||||||
(i == 0 ? team_get_kernel_team_id() : -1));
|
i == 0 ? team_get_kernel_team_id() : -1);
|
||||||
if (t == NULL) {
|
if (t == NULL) {
|
||||||
panic("error creating idle thread struct\n");
|
panic("error creating idle thread struct\n");
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
@@ -1276,7 +1282,7 @@ thread_init(kernel_args *args)
|
|||||||
sDeathStacks[i].in_use = false;
|
sDeathStacks[i].in_use = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sDeathStackSem = create_sem(sNumDeathStacks, "death_stack_noavail_sem");
|
sDeathStackSem = create_sem(sNumDeathStacks, "death stack availability");
|
||||||
|
|
||||||
// set up some debugger commands
|
// set up some debugger commands
|
||||||
add_debugger_command("threads", &dump_thread_list, "list all threads");
|
add_debugger_command("threads", &dump_thread_list, "list all threads");
|
||||||
|
|||||||
Reference in New Issue
Block a user