d8bc6e7119
After forking, the kernel_id field in the phtread_internal_t returned by pthread_self() is incorrect --- it's the tid from the parent, not the new tid of the child. The root cause is that: currently the kernel_id is set by _init_thread(), which is called in 2 cases: (1) called by __libc_init_common(). That happens when the execv( ) is called after fork( ). But when the zygote tries to fork the android application, the child application doesn't call execv( ), instread, it tries to call the Java main method directly. (2) called by pthread_create(). That happens when a new thread is created. For the lead thread which is the thread created by fork(), it should call execv() but it doesn't, as described in (1) above. So its kernel_id will inherit the parent's kernel_id. Fixed it in this patch. Change-Id: I63513e82af40ec5fe51fbb69456b1843e4bc0fc7 Signed-off-by: Chenyang Du <chenyang.du@intel.com> Signed-off-by: Jack Ren <jack.ren@intel.com> Signed-off-by: Bruce Beare <bruce.j.beare@intel.com> |
||
---|---|---|
.. | ||
arch-arm | ||
arch-x86 | ||
bionic | ||
docs | ||
include | ||
inet | ||
kernel | ||
netbsd | ||
private | ||
regex | ||
stdio | ||
stdlib | ||
string | ||
tools | ||
tzcode | ||
unistd | ||
wchar | ||
zoneinfo | ||
Android.mk | ||
CAVEATS | ||
Jamfile | ||
MODULE_LICENSE_BSD | ||
NOTICE | ||
README | ||
SYSCALLS.TXT |
Welcome to Bionic, Android's small and custom C library for the Android platform. Bionic is mainly a port of the BSD C library to our Linux kernel with the following additions/changes: - no support for locales - no support for wide chars (i.e. multi-byte characters) - its own smallish implementation of pthreads based on Linux futexes - support for x86, ARM and ARM thumb CPU instruction sets and kernel interfaces Bionic is released under the standard 3-clause BSD License Bionic doesn't want to implement all features of a traditional C library, we only add features to it as we need them, and we try to keep things as simple and small as possible. Our goal is not to support scaling to thousands of concurrent threads on multi-processors machines; we're running this on cell-phones, damnit !! Note that Bionic doesn't provide a libthread_db or a libm implementation. Adding new syscalls: ==================== Bionic provides the gensyscalls.py Python script to automatically generate syscall stubs from the list defined in the file SYSCALLS.TXT. You can thus add a new syscall by doing the following: - edit SYSCALLS.TXT - add a new line describing your syscall, it should look like: return_type syscall_name(parameters) syscall_number - in the event where you want to differentiate the syscall function from its entry name, use the alternate: return_type funcname:syscall_name(parameters) syscall_number - additionally, if the syscall number is different between ARM and x86, use: return_type funcname[:syscall_name](parameters) arm_number,x86_number - a syscall number can be -1 to indicate that the syscall is not implemented on a given platform, for example: void __set_tls(void*) arm_number,-1 the comments in SYSCALLS.TXT contain more information about the line format You can also use the 'checksyscalls.py' script to check that all the syscall numbers you entered are correct. It does so by looking at the values defined in your Linux kernel headers. The script indicates where the values are incorrect and what is expected instead.