<br><br><div><span class="gmail_quote">On 11/17/06, <b class="gmail_sendername">Havoc Pennington</b> &lt;<a href="mailto:hp@redhat.com">hp@redhat.com</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br><br>Timothy Vismor wrote:<br>&gt;<br>&gt; A common way to guarantee a unique instance of a Windows application<br>&gt; is to use a well known mutex name. A simple example is:<br>&gt;<br><br>Thanks, that looks pretty good. We'd need to solve one more problem
<br>also, which is how to get the address of the existing process... any<br>typical pattern for that? ;-)<br><br>Havoc</blockquote><div><br>Never needed to do that specific operation, but it seems that a simple <br>solution could be to use named shared memory. When a process grabs
<br> the DBus mutex, it could write relevant address information to a well <br>known block of named shared memory. When you release the<br>mutex, you also release the shared memory block. If a process<br>fails to grab the mutex, it could read the required information from
<br>shared memory.<br><br>DURING STARTUP, AFTER YOU CREATE THE MUTEX<br>&nbsp; &nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; SECURITY_ATTRIBUTES sa;
<br>&nbsp;&nbsp;&nbsp; sa.nLength = sizeof( sa );
<br>&nbsp;&nbsp;&nbsp; sa.lpSecurityDescriptor = m_pMemSD;
<br>&nbsp;&nbsp;&nbsp; sa.bInheritHandle = TRUE;<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; // Create shared virual memory in the page file.
<br>&nbsp;&nbsp;&nbsp; m_hSharedMem = CreateFileMapping( (HANDLE)0xFFFFFFFF, &amp;sa, PAGE_READWRITE,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ZERO, nBytes, &quot;DBusAddressInfo&quot; );&nbsp;
<br>&nbsp;&nbsp;&nbsp; if( m_hSharedMem == NULL )
<br>&nbsp;&nbsp;&nbsp; {
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Unable to allocate shared memory.
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return( FALSE );
<br>&nbsp;&nbsp;&nbsp; }
<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; // Map shared memory into process address space.
<br>&nbsp;&nbsp;&nbsp; if( m_hSharedMem != NULL )
<br>&nbsp;&nbsp;&nbsp; {&nbsp;
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_pSharedMem = MapViewOfFile( m_hSharedMem, FILE_MAP_WRITE, ZERO, ZERO, ZERO );
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if( m_pSharedMem == NULL )
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Unable to map shared memory.
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ::CloseHandle( m_hSharedMem );&nbsp;
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_hSharedMem = NULL;
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; return( FALSE );
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }
<br>&nbsp;&nbsp;&nbsp; }
<br>&nbsp;&nbsp;&nbsp; // Write process information to shared memory.<br>&nbsp;&nbsp;&nbsp; ...<br><br>DURING SHUTDOWN<br><br>&nbsp;&nbsp;&nbsp; if( m_pSharedMem != NULL )
<br>&nbsp;&nbsp;&nbsp; {
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ::UnmapViewOfFile( m_pSharedMem );
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_pSharedMem = NULL;
<br>&nbsp;&nbsp;&nbsp; }
<br>&nbsp;&nbsp;&nbsp; if( m_hNetDevMem != NULL )
<br>&nbsp;&nbsp;&nbsp; {
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ::CloseHandle( m_hSharedMem );
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_hSharedMem = NULL;
<br>&nbsp;&nbsp;&nbsp; }
<br><br><br>IF CAN'T GET MUTEX<br><br>&nbsp;&nbsp;&nbsp; // Connect to the memory mapped file (actually the paging file).
<br>&nbsp;&nbsp;&nbsp; m_hSharedMem = OpenFileMapping(FILE_MAP_READ, FALSE, &quot;DBusAddressInfo&quot;);
<br>&nbsp;&nbsp;&nbsp; if( m_hSharedMem == NULL )
<br>&nbsp;&nbsp;&nbsp; {
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Unable to link to shared memory.
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Process is no longer running.
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return( FALSE );
<br>&nbsp;&nbsp;&nbsp; }
<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; // Map shared memory into our address space.
<br>&nbsp;&nbsp;&nbsp; m_pSharedMem = MapViewOfFile( m_hSharedMem, FILE_MAP_READ,ZERO, ZERO, ZERO );
<br>&nbsp;&nbsp;&nbsp; if( m_pSharedMem == NULL )
<br>&nbsp;&nbsp;&nbsp; {
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Unable to map shared memory.
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; CloseHandle( m_hSharedMem );&nbsp;
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; m_hSharedMem = NULL;
<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return( FALSE );
<br>&nbsp;&nbsp;&nbsp; }
<br>&nbsp;&nbsp;&nbsp; // Read process info from shared mem<br>&nbsp;&nbsp;&nbsp; ....<br><br></div></div>