Now properly shuts down the thread message cache in thread_exit(),

its semaphores get deleted, thanks to Jack Burton for reporting.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6904 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2004-03-05 12:55:27 +00:00
parent 5fd77dc430
commit 135d20a96e
+31 -8
View File
@@ -53,6 +53,8 @@
#define THREAD_MAX_MESSAGE_SIZE 65536
static status_t receive_data_etc(thread_id *_sender, void *buffer, size_t bufferSize, int32 flags);
struct thread_key {
thread_id id;
};
@@ -715,6 +717,7 @@ thread_exit(void)
bool delete_team = false;
unsigned int death_stack;
sem_id cached_death_sem;
status_t status;
if (!are_interrupts_enabled())
dprintf("thread_exit() called with interrupts disabled!\n");
@@ -725,6 +728,24 @@ thread_exit(void)
// boost our priority to get this over with
t->priority = B_FIRST_REAL_TIME_PRIORITY;
// ToDo: is it really that urgent?
// shutdown the thread messaging
status = acquire_sem_etc(t->msg.write_sem, 1, B_RELATIVE_TIMEOUT, 0);
if (status == B_WOULD_BLOCK) {
// there is data waiting for us, so let us eat it
thread_id sender;
delete_sem(t->msg.write_sem);
// first, let's remove all possibly waiting writers
receive_data_etc(&sender, NULL, 0, B_RELATIVE_TIMEOUT);
} else {
// we probably own the semaphore here, and we're the last to do so
delete_sem(t->msg.write_sem);
}
// now we can safely remove the msg.read_sem
delete_sem(t->msg.read_sem);
// Cancel previously installed alarm timer, if any
cancel_timer(&t->alarm);
@@ -1218,7 +1239,7 @@ send_data(thread_id thread, int32 code, const void *buffer, size_t bufferSize)
static status_t
receive_data_etc(thread_id *sender, void *buffer, size_t bufferSize, int32 flags)
receive_data_etc(thread_id *_sender, void *buffer, size_t bufferSize, int32 flags)
{
struct thread *thread = thread_get_current_thread();
status_t status;
@@ -1229,15 +1250,17 @@ receive_data_etc(thread_id *sender, void *buffer, size_t bufferSize, int32 flags
if (status < B_OK)
return status;
size = min(bufferSize, thread->msg.size);
status = cbuf_user_memcpy_from_chain(buffer, thread->msg.buffer, 0, size);
if (status < B_OK) {
cbuf_free_chain(thread->msg.buffer);
release_sem(thread->msg.write_sem);
return status;
if (buffer != NULL && bufferSize != 0) {
size = min(bufferSize, thread->msg.size);
status = cbuf_user_memcpy_from_chain(buffer, thread->msg.buffer, 0, size);
if (status < B_OK) {
cbuf_free_chain(thread->msg.buffer);
release_sem(thread->msg.write_sem);
return status;
}
}
*sender = thread->msg.sender;
*_sender = thread->msg.sender;
code = thread->msg.code;
cbuf_free_chain(thread->msg.buffer);