mirror of
https://github.com/boostorg/interprocess.git
synced 2026-01-19 04:12:13 +00:00
#1211: Interprocess tests hang when run in parallel
#1080 boost::interprocess win32 global file mapping issue [SVN r38946]
This commit is contained in:
@@ -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); }
|
||||
|
||||
Reference in New Issue
Block a user