[Mono-list] Patch for GC_stop_world bug in Android apps

Koushik Dutta koush at koushikdutta.com
Thu Sep 30 00:26:25 EDT 2010


Here is the fix for the following bug:
https://bugzilla.novell.com/show_bug.cgi?id=633454

The underlying problem is there is a bug in Android's libc, where after a
process forks, the kernel id of the forked thread is not changed to reflect
the new child thread. The pthread kernel id still points to the kernel id of
the parent process: zygote.

This bug breaks all multithread monodroid apps (as well as my mono on
Android port), as Garbage Collection fails and the process hangs.

The fix/workaround for the bug in Android is as follows:
The GC_Thread structure on Android has a new "kernel_id" member. When
GC_new_thread is called, the kernel id is also retrieved and stored with
gettid. When the world needs to be stopped/started, a new function
android_thread_kill is called, which is a reimplementation of Android's
pthread_kill. Instead, which takes the correct kernel id, rather than the
potentially hosed pthread.

I have attached a patch file, as well as committed to my fork of mono on
Github:
http://github.com/koush/mono/commit/414aff5598a2dea618741bea714fa8dd1baf0d52
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/mono-list/attachments/20100929/9cb29d8b/attachment-0001.html 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pthread_android.patch
Type: application/octet-stream
Size: 2863 bytes
Desc: not available
Url : http://lists.ximian.com/pipermail/mono-list/attachments/20100929/9cb29d8b/attachment-0001.obj 


More information about the Mono-list mailing list