Added new debug output macros (TRACE()).
thread_exit() for now prints a warning if it was called with interrupts disabled. Fixed a bug in thread_exit2() that restored the interrupts too early, instead of simply enabling them (and restoring them later) [found by Marcus O. great debug additions]. Fixes for the khash changes. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2119 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
+29
-13
@@ -35,6 +35,14 @@
|
|||||||
#include <kerrors.h>
|
#include <kerrors.h>
|
||||||
#include <syscalls.h>
|
#include <syscalls.h>
|
||||||
|
|
||||||
|
#define TRACE_THREAD 0
|
||||||
|
#if TRACE_THREAD
|
||||||
|
# define TRACE(x) dprintf x
|
||||||
|
#else
|
||||||
|
# define TRACE(x) ;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#define THREAD_MAX_MESSAGE_SIZE 65536
|
#define THREAD_MAX_MESSAGE_SIZE 65536
|
||||||
|
|
||||||
struct thread_key {
|
struct thread_key {
|
||||||
@@ -180,16 +188,16 @@ thread_struct_compare(void *_t, const void *_key)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static unsigned int
|
static uint32
|
||||||
thread_struct_hash(void *_t, const void *_key, unsigned int range)
|
thread_struct_hash(void *_t, const void *_key, uint32 range)
|
||||||
{
|
{
|
||||||
struct thread *t = _t;
|
struct thread *t = _t;
|
||||||
const struct thread_key *key = _key;
|
const struct thread_key *key = _key;
|
||||||
|
|
||||||
if (t != NULL)
|
if (t != NULL)
|
||||||
return (t->id % range);
|
return t->id % range;
|
||||||
|
|
||||||
return (key->id % range);
|
return key->id % range;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -831,23 +839,25 @@ static void
|
|||||||
thread_exit2(void *_args)
|
thread_exit2(void *_args)
|
||||||
{
|
{
|
||||||
struct thread_exit_args args;
|
struct thread_exit_args args;
|
||||||
// char *temp;
|
|
||||||
|
|
||||||
// copy the arguments over, since the source is probably on the kernel stack we're about to delete
|
// copy the arguments over, since the source is probably on the kernel stack we're about to delete
|
||||||
memcpy(&args, _args, sizeof(struct thread_exit_args));
|
memcpy(&args, _args, sizeof(struct thread_exit_args));
|
||||||
|
|
||||||
// restore the interrupts
|
// restore the interrupts
|
||||||
restore_interrupts(args.int_state);
|
enable_interrupts();
|
||||||
|
// ToDo: was:
|
||||||
|
// restore_interrupts(args.int_state);
|
||||||
|
// we probably don't want to let the interrupts disabled at this point??
|
||||||
|
|
||||||
// dprintf("thread_exit2, running on death stack 0x%lx\n", args.t->kernel_stack_base);
|
TRACE(("thread_exit2, running on death stack 0x%lx\n", args.t->kernel_stack_base));
|
||||||
|
|
||||||
// delete the old kernel stack region
|
// delete the old kernel stack region
|
||||||
// dprintf("thread_exit2: deleting old kernel stack id 0x%x for thread 0x%x\n", args.old_kernel_stack, args.t->id);
|
TRACE(("thread_exit2: deleting old kernel stack id 0x%x for thread 0x%x\n", args.old_kernel_stack, args.t->id));
|
||||||
vm_delete_region(vm_get_kernel_aspace_id(), args.old_kernel_stack);
|
vm_delete_region(vm_get_kernel_aspace_id(), args.old_kernel_stack);
|
||||||
|
|
||||||
// dprintf("thread_exit2: removing thread 0x%x from global lists\n", args.t->id);
|
|
||||||
|
|
||||||
// remove this thread from all of the global lists
|
// remove this thread from all of the global lists
|
||||||
|
TRACE(("thread_exit2: removing thread 0x%x from global lists\n", args.t->id));
|
||||||
|
|
||||||
disable_interrupts();
|
disable_interrupts();
|
||||||
GRAB_TEAM_LOCK();
|
GRAB_TEAM_LOCK();
|
||||||
remove_thread_from_team(team_get_kernel_team(), args.t);
|
remove_thread_from_team(team_get_kernel_team(), args.t);
|
||||||
@@ -856,7 +866,10 @@ thread_exit2(void *_args)
|
|||||||
hash_remove(thread_hash, args.t);
|
hash_remove(thread_hash, args.t);
|
||||||
RELEASE_THREAD_LOCK();
|
RELEASE_THREAD_LOCK();
|
||||||
|
|
||||||
// dprintf("thread_exit2: done removing thread from lists\n");
|
// ToDo: is this correct at this point?
|
||||||
|
restore_interrupts(args.int_state);
|
||||||
|
|
||||||
|
TRACE(("thread_exit2: done removing thread from lists\n"));
|
||||||
|
|
||||||
if (args.death_sem >= 0)
|
if (args.death_sem >= 0)
|
||||||
release_sem_etc(args.death_sem, 1, B_DO_NOT_RESCHEDULE);
|
release_sem_etc(args.death_sem, 1, B_DO_NOT_RESCHEDULE);
|
||||||
@@ -881,9 +894,12 @@ thread_exit(void)
|
|||||||
unsigned int death_stack;
|
unsigned int death_stack;
|
||||||
sem_id cached_death_sem;
|
sem_id cached_death_sem;
|
||||||
|
|
||||||
dprintf("thread 0x%lx exiting %s w/return code 0x%x\n", t->id,
|
if (!are_interrupts_enabled())
|
||||||
|
dprintf("thread_exit() called with interrupts disabled!\n");
|
||||||
|
|
||||||
|
TRACE(("thread 0x%lx exiting %s w/return code 0x%x\n", t->id,
|
||||||
t->return_flags & THREAD_RETURN_INTERRUPTED ? "due to signal" : "normally",
|
t->return_flags & THREAD_RETURN_INTERRUPTED ? "due to signal" : "normally",
|
||||||
(int)t->return_code);
|
(int)t->return_code));
|
||||||
|
|
||||||
// boost our priority to get this over with
|
// boost our priority to get this over with
|
||||||
t->priority = B_FIRST_REAL_TIME_PRIORITY;
|
t->priority = B_FIRST_REAL_TIME_PRIORITY;
|
||||||
|
|||||||
Reference in New Issue
Block a user