On Jul 27, 2016, at 12:53 PM, Sebastian Lackner sebastian@fds-team.de wrote:
I have only two suggestions:
- gsbase_offset == 0 (key == i) could also be valid, so it would be useful to distinguish this case.
It can't be valid because that would put the TLS at the beginning of struct _pthread, but the ABI actually reveals the first couple of fields. pthread_t is a typedef for __darwin_pthread_t which is a typedef for struct _opaque_pthread_t which is defined (not just declared) in the headers (/usr/include/sys/_pthread/_pthread_types.h in the 10.11 SDK) and is less opaque than its name would suggest. Comments in the definition of struct _pthread in libpthread make note of the ABI compatibility factor.
In practice, the TLS array is at the end of the struct and I think Apple told us it has to be there.
- the logic could be moved to a helper function, for example using the init once mechanism
I suppose, but it will be called for the first thread before there's a chance of creating secondary threads. So, there's no race. Also, I haven't looked, but I'm not sure what thread setup has to have been completed before RtlRunOnceExecuteOnce() can safely be used.
-Ken