Issue with _dbus_write_socket on windows

Timothy Vismor vismor.td at gmail.com
Sat Nov 18 08:09:10 PST 2006


On 11/17/06, Havoc Pennington <hp at redhat.com> wrote:
>
>
>
> Timothy Vismor wrote:
> >
> > A common way to guarantee a unique instance of a Windows application
> > is to use a well known mutex name. A simple example is:
> >
>
> Thanks, that looks pretty good. We'd need to solve one more problem
> also, which is how to get the address of the existing process... any
> typical pattern for that? ;-)
>
> Havoc


Never needed to do that specific operation, but it seems that a simple
solution could be to use named shared memory. When a process grabs
the DBus mutex, it could write relevant address information to a well
known block of named shared memory. When you release the
mutex, you also release the shared memory block. If a process
fails to grab the mutex, it could read the required information from
shared memory.

DURING STARTUP, AFTER YOU CREATE THE MUTEX

    SECURITY_ATTRIBUTES sa;
    sa.nLength = sizeof( sa );
    sa.lpSecurityDescriptor = m_pMemSD;
    sa.bInheritHandle = TRUE;

    // Create shared virual memory in the page file.
    m_hSharedMem = CreateFileMapping( (HANDLE)0xFFFFFFFF, &sa,
PAGE_READWRITE,
                                          ZERO, nBytes, "DBusAddressInfo"
);
    if( m_hSharedMem == NULL )
    {
        // Unable to allocate shared memory.
        return( FALSE );
    }

    // Map shared memory into process address space.
    if( m_hSharedMem != NULL )
    {
        m_pSharedMem = MapViewOfFile( m_hSharedMem, FILE_MAP_WRITE, ZERO,
ZERO, ZERO );
        if( m_pSharedMem == NULL )
        {
            // Unable to map shared memory.
            ::CloseHandle( m_hSharedMem );
            m_hSharedMem = NULL;
           return( FALSE );
        }
    }
    // Write process information to shared memory.
    ...

DURING SHUTDOWN

    if( m_pSharedMem != NULL )
    {
        ::UnmapViewOfFile( m_pSharedMem );
        m_pSharedMem = NULL;
    }
    if( m_hNetDevMem != NULL )
    {
        ::CloseHandle( m_hSharedMem );
        m_hSharedMem = NULL;
    }


IF CAN'T GET MUTEX

    // Connect to the memory mapped file (actually the paging file).
    m_hSharedMem = OpenFileMapping(FILE_MAP_READ, FALSE, "DBusAddressInfo");

    if( m_hSharedMem == NULL )
    {
        // Unable to link to shared memory.
        // Process is no longer running.
        return( FALSE );
    }

    // Map shared memory into our address space.
    m_pSharedMem = MapViewOfFile( m_hSharedMem, FILE_MAP_READ,ZERO, ZERO,
ZERO );
    if( m_pSharedMem == NULL )
    {
        // Unable to map shared memory.
        CloseHandle( m_hSharedMem );
        m_hSharedMem = NULL;
        return( FALSE );
    }
    // Read process info from shared mem
    ....
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.freedesktop.org/archives/dbus/attachments/20061118/ea9a45ac/attachment.html


More information about the dbus mailing list