I just killed quite some time debugging a weird lockup I had with a third party program under NetBSD.
Long story short... That program overrides malloc and returns memory that is only 8 bytes aligned. That creates problems for our pthreads, as rwlock code assumes that pthread_self() is 16-byte aligned and uses the lower bits for the flags (see RW_THREAD in pthread_int.h and code in pthread_rwlock.c). The two approaches I can think of are to use posix_memalign+memset instead of calloc and to use calloc and manually re-align the result. So either newthread = calloc(1, __pthread_st_size + ~RW_THREAD); if ((uintptr_t)newthread & ~RW_THREAD) { newthread = (pthread_t)(((uintptr_t)(newthread) + ~RW_THREAD) & RW_THREAD); } or posix_memalign((void **)&newthread, -RW_THREAD, __pthread_st_size); memset(newthread, 0, __pthread_st_size); The latter seems a bit prettier, but many older programs that override malloc don't override posix_memalign, so we will still use our own malloc for this. Not sure if this is a problem. Debugging mallocs probably all properly override posix_memalign. Ideas? -uwe