#1211: Interprocess tests hang when run in parallel

#1080 boost::interprocess win32 global file mapping issue 

[SVN r38946]
This commit is contained in:
Ion Gaztañaga
2007-08-25 18:04:13 +00:00
parent 8fa662ef90
commit bfe5d57ef2

View File

@@ -22,8 +22,11 @@
# include <stddef.h>
# include <stdarg.h>
# include <boost/detail/interlocked.hpp>
# if !defined(__MINGW32__)
# pragma comment( lib, "advapi32.lib" )//auto-unlink security features
# endif
#else
# error "This file can only be included in Windows OS"
# error "This file can only be included in Windows OS"
#endif
//The structures used in Interprocess with the
@@ -109,6 +112,7 @@ static const unsigned long file_end = 2;
static const unsigned long lockfile_fail_immediately = 1;
static const unsigned long lockfile_exclusive_lock = 2;
static const unsigned long error_lock_violation = 33;
static const unsigned long security_descriptor_revision = 1;
} //namespace winapi {
} //namespace interprocess {
@@ -178,7 +182,28 @@ struct interprocess_memory_basic_information
unsigned long Type;
};
typedef struct _interprocess_acl
{
unsigned char AclRevision;
unsigned char Sbz1;
unsigned short AclSize;
unsigned short AceCount;
unsigned short Sbz2;
} interprocess_acl;
typedef struct _interprocess_security_descriptor
{
unsigned char Revision;
unsigned char Sbz1;
unsigned short Control;
void *Owner;
void *Group;
interprocess_acl *Sacl;
interprocess_acl *Dacl;
} interprocess_security_descriptor;
//Some windows API declarations
extern "C" __declspec(dllimport) unsigned long __stdcall GetCurrentProcessId();
extern "C" __declspec(dllimport) unsigned long __stdcall GetCurrentThreadId();
extern "C" __declspec(dllimport) void __stdcall Sleep(unsigned long);
extern "C" __declspec(dllimport) unsigned long __stdcall GetLastError();
@@ -223,7 +248,10 @@ extern "C" __declspec(dllimport) int __stdcall UnlockFile(void *hnd, unsigned lo
extern "C" __declspec(dllimport) int __stdcall LockFileEx(void *hnd, unsigned long flags, unsigned long reserved, unsigned long size_low, unsigned long size_high, interprocess_overlapped* overlapped);
extern "C" __declspec(dllimport) int __stdcall UnlockFileEx(void *hnd, unsigned long reserved, unsigned long size_low, unsigned long size_high, interprocess_overlapped* overlapped);
extern "C" __declspec(dllimport) int __stdcall WriteFile(void *hnd, const void *buffer, unsigned long bytes_to_write, unsigned long *bytes_written, interprocess_overlapped* overlapped);
extern "C" __declspec(dllimport) int __stdcall InitializeSecurityDescriptor
(void *pSecurityDescriptor, unsigned long dwRevision);
extern "C" __declspec(dllimport) int __stdcall SetSecurityDescriptorDacl
( void *pSecurityDescriptor, int bDaclPresent, interprocess_acl *pDacl, int bDaclDefaulted);
/*
extern "C" __declspec(dllimport) long __stdcall InterlockedIncrement( long volatile * );
extern "C" __declspec(dllimport) long __stdcall InterlockedDecrement( long volatile * );
@@ -266,6 +294,9 @@ static inline void sched_yield()
static inline unsigned long get_current_thread_id()
{ return GetCurrentThreadId(); }
static inline unsigned long get_current_process_id()
{ return GetCurrentProcessId(); }
static inline unsigned int close_handle(void* handle)
{ return CloseHandle(handle); }
@@ -313,7 +344,20 @@ static inline void *open_semaphore(const char *name)
{ return OpenSemaphoreA(semaphore_all_access, 1, name); }
static inline void * create_file_mapping (void * handle, unsigned long access, unsigned long high_size, unsigned long low_size, const char * name)
{ return CreateFileMappingA (handle, 0, access, high_size, low_size, name); }
{
interprocess_security_attributes sa;
interprocess_security_descriptor sd;
if(!InitializeSecurityDescriptor(&sd, security_descriptor_revision))
return 0;
if(!SetSecurityDescriptorDacl(&sd, true, 0, false))
return 0;
sa.lpSecurityDescriptor = &sd;
sa.nLength = sizeof(interprocess_security_attributes);
sa.bInheritHandle = false;
return CreateFileMappingA (handle, &sa, access, high_size, low_size, name);
//return CreateFileMappingA (handle, 0, access, high_size, low_size, name);
}
static inline void * open_file_mapping (unsigned long access, const char *name)
{ return OpenFileMappingA (access, 0, name); }