[Issue 16636] New: Memory corruption when using OSX pthread function in 32-bit with -g enabled

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Mon Oct 24 07:48:58 PDT 2016


https://issues.dlang.org/show_bug.cgi?id=16636

          Issue ID: 16636
           Summary: Memory corruption when using OSX pthread function in
                    32-bit with -g enabled
           Product: D
           Version: D2
          Hardware: x86
                OS: Mac OS X
            Status: NEW
          Severity: major
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: aliloko at gmail.com

DMD version: 

    DMD64 D Compiler v2.072.0-b2


OS: 

    macOS Sierra 10.12 on x86 processor



Build test case with comand:


    $ rdmd -m32 -g main.d

    What happens is that there is a deadlock instead of finishing.

    Many ways not to work-around the bug:
     - remove the _created bool from the structure (44-byte struct instead of
48)
     - change the size of this boolean to 8-bytes (52 byte struct)
     - compile for 64-bit
     - remove the -g flags


Source:

------------------- main.d -------------------------


import core.sys.posix.pthread;

UncheckedMutex makeMutex() nothrow @nogc
{
    return UncheckedMutex(42);
}

struct UncheckedMutex
{
    private this(int dummyArg) nothrow @nogc
    {
        pthread_mutex_init( &m_hndl, null );
    }

    ~this() nothrow @nogc
    {
        pthread_mutex_destroy(&m_hndl);
    }

    @disable this(this);

    /// Lock mutex
    void lock() nothrow @nogc
    {
        int res = pthread_mutex_lock(&m_hndl);
        if (res != 0)
            assert(false);
    }

    // undocumented function for internal use
    void unlock() nothrow @nogc
    {
        int res = pthread_mutex_unlock(&m_hndl );
        if (res != 0)
            assert(false);
    }

private:
    pthread_mutex_t m_hndl = cast(pthread_mutex_t)0;

    // removing this fix the deadlock
    bool _created;
}

void main()
{
    auto mutex = makeMutex();
    foreach(i; 0..2)
    {
        mutex.lock(); // the second call will deadlock here
        mutex.unlock();
    }
    mutex.destroy();
}


------------------- main.d -------------------------

--


More information about the Digitalmars-d-bugs mailing list