tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

pthreads vs. overriden malloc

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);


    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.



Home | Main Index | Thread Index | Old Index