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