Author: martin
Date: 2006-06-28 16:06:07 -0400 (Wed, 28 Jun 2006)
New Revision: 62128
Modified:
trunk/mono/libgc/ChangeLog
trunk/mono/libgc/darwin_stop_world.c
trunk/mono/libgc/pthread_support.c
Log:
2006-06-28 Martin Baulig <[EMAIL PROTECTED]>
* darwin_stop_world.c, pthread_support.c: Committing a patch from
Allan Hsu <[EMAIL PROTECTED]> to fix memory leaks; see bug #78628.
Modified: trunk/mono/libgc/ChangeLog
===================================================================
--- trunk/mono/libgc/ChangeLog 2006-06-28 20:01:15 UTC (rev 62127)
+++ trunk/mono/libgc/ChangeLog 2006-06-28 20:06:07 UTC (rev 62128)
@@ -1,3 +1,8 @@
+2006-06-28 Martin Baulig <[EMAIL PROTECTED]>
+
+ * darwin_stop_world.c, pthread_support.c: Committing a patch from
+ Allan Hsu <[EMAIL PROTECTED]> to fix memory leaks; see bug #78628.
+
2006-06-26 Zoltan Varga <[EMAIL PROTECTED]>
* solaris_threads.c: And another one.
Modified: trunk/mono/libgc/darwin_stop_world.c
===================================================================
--- trunk/mono/libgc/darwin_stop_world.c 2006-06-28 20:01:15 UTC (rev
62127)
+++ trunk/mono/libgc/darwin_stop_world.c 2006-06-28 20:06:07 UTC (rev
62128)
@@ -167,6 +167,7 @@
void GC_push_all_stacks() {
int i;
+ task_t my_task;
kern_return_t r;
mach_port_t me;
ptr_t lo, hi;
@@ -176,7 +177,8 @@
me = mach_thread_self();
if (!GC_thr_initialized) GC_thr_init();
- r = task_threads(current_task(), &act_list, &listcount);
+ my_task = current_task();
+ r = task_threads(my_task, &act_list, &listcount);
if(r != KERN_SUCCESS) ABORT("task_threads failed");
for(i = 0; i < listcount; i++) {
thread_act_t thread = act_list[i];
@@ -265,9 +267,11 @@
(unsigned long) hi
);
# endif
- GC_push_all_stack(lo, hi);
+ GC_push_all_stack(lo, hi);
+ mach_port_deallocate(my_task, thread);
} /* for(p=GC_threads[i]...) */
- vm_deallocate(current_task(), (vm_address_t)act_list, sizeof(thread_t) *
listcount);
+ vm_deallocate(my_task, (vm_address_t)act_list, sizeof(thread_t) *
listcount);
+ mach_port_deallocate(my_task, me);
}
#endif /* !DARWIN_DONT_PARSE_STACK */
@@ -361,6 +365,8 @@
}
if (!found) GC_mach_threads_count++;
}
+
+ mach_port_deallocate(current_task(), my_thread);
return changed;
}
@@ -370,6 +376,7 @@
{
int i, changes;
GC_thread p;
+ task_t my_task = current_task();
mach_port_t my_thread = mach_thread_self();
kern_return_t kern_result;
thread_act_array_t act_list, prev_list;
@@ -405,13 +412,21 @@
prevcount = 0;
do {
int result;
- kern_result = task_threads(current_task(), &act_list, &listcount);
+ kern_result = task_threads(my_task, &act_list, &listcount);
result = GC_suspend_thread_list(act_list, listcount,
prev_list, prevcount);
changes = result;
prev_list = act_list;
prevcount = listcount;
- vm_deallocate(current_task(), (vm_address_t)act_list, sizeof(thread_t)
* listcount);
+
+ if(kern_result == KERN_SUCCESS) {
+ int i;
+
+ for(i = 0; i < listcount; i++)
+ mach_port_deallocate(my_task, act_list[i]);
+
+ vm_deallocate(my_task, (vm_address_t)act_list, sizeof(thread_t)
* listcount);
+ }
} while (changes);
@@ -428,12 +443,15 @@
#if DEBUG_THREADS
GC_printf1("World stopped from 0x%lx\n", my_thread);
#endif
+
+ mach_port_deallocate(my_task, my_thread);
}
/* Caller holds allocation lock, and has held it continuously since */
/* the world stopped. */
void GC_start_world()
{
+ task_t my_task = current_task();
mach_port_t my_thread = mach_thread_self();
int i, j;
GC_thread p;
@@ -454,7 +472,7 @@
}
# endif
- kern_result = task_threads(current_task(), &act_list, &listcount);
+ kern_result = task_threads(my_task, &act_list, &listcount);
for(i = 0; i < listcount; i++) {
thread_act_t thread = act_list[i];
if (thread != my_thread &&
@@ -482,8 +500,12 @@
}
}
}
+
+ mach_port_deallocate(my_task, thread);
}
- vm_deallocate(current_task(), (vm_address_t)act_list, sizeof(thread_t) *
listcount);
+ vm_deallocate(my_task, (vm_address_t)act_list, sizeof(thread_t) *
listcount);
+
+ mach_port_deallocate(my_task, my_thread);
# if DEBUG_THREADS
GC_printf0("World started\n");
# endif
Modified: trunk/mono/libgc/pthread_support.c
===================================================================
--- trunk/mono/libgc/pthread_support.c 2006-06-28 20:01:15 UTC (rev 62127)
+++ trunk/mono/libgc/pthread_support.c 2006-06-28 20:06:07 UTC (rev 62128)
@@ -700,6 +700,11 @@
if (gc_thread_vtable && gc_thread_vtable->thread_exited)
gc_thread_vtable->thread_exited (id, &p->stop_info.stack_ptr);
#endif
+
+#ifdef GC_DARWIN_THREADS
+ mach_port_deallocate(mach_task_self(), p->stop_info.mach_thread);
+#endif
+
GC_INTERNAL_FREE(p);
}
@@ -722,6 +727,11 @@
} else {
prev -> next = p -> next;
}
+
+#ifdef GC_DARWIN_THREADS
+ mach_port_deallocate(mach_task_self(), p->stop_info.mach_thread);
+#endif
+
GC_INTERNAL_FREE(p);
}
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches