mirror of https://github.com/BOINC/boinc.git
- Client (Windows) change the way core/app shmem segs are created.
Old: get_shmem_seg_name() tries names of the form shm_boinc_N until it finds one for which creating succeeds. Then it detaches (deletes) the segment and records the name. Later, the segment is created again. This creates a race condition if two core clients are running on the same host. It's also kind of silly. New: get_shmem_seg_name() doesn't detach the segment, and we dont have to create it again later. svn path=/trunk/boinc/; revision=15172
This commit is contained in:
parent
b622f64e30
commit
db4164daba
|
@ -3839,3 +3839,20 @@ David May 9 2008
|
||||||
sched/
|
sched/
|
||||||
sched_send.C
|
sched_send.C
|
||||||
server_types.h
|
server_types.h
|
||||||
|
|
||||||
|
David May 11 2008
|
||||||
|
- Client (Windows) change the way core/app shmem segs are created.
|
||||||
|
Old: get_shmem_seg_name() tries names of the form shm_boinc_N
|
||||||
|
until it finds one for which creating succeeds.
|
||||||
|
Then it detaches (deletes) the segment and records the name.
|
||||||
|
Later, the segment is created again.
|
||||||
|
This creates a race condition if two core clients
|
||||||
|
are running on the same host.
|
||||||
|
It's also kind of silly.
|
||||||
|
New: get_shmem_seg_name() doesn't detach the segment,
|
||||||
|
and we dont have to create it again later.
|
||||||
|
|
||||||
|
client/
|
||||||
|
app_start.C
|
||||||
|
lib/
|
||||||
|
shmem.C
|
||||||
|
|
|
@ -79,8 +79,8 @@ using std::vector;
|
||||||
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
// Dynamically link to these functions at runtime, otherwise BOINC
|
// Dynamically link to these functions at runtime;
|
||||||
// cannot run on Win98
|
// otherwise BOINC cannot run on Win98
|
||||||
|
|
||||||
// CreateEnvironmentBlock
|
// CreateEnvironmentBlock
|
||||||
typedef BOOL (WINAPI *tCEB)(LPVOID *lpEnvironment, HANDLE hToken, BOOL bInherit);
|
typedef BOOL (WINAPI *tCEB)(LPVOID *lpEnvironment, HANDLE hToken, BOOL bInherit);
|
||||||
|
@ -102,28 +102,24 @@ static void debug_print_argv(char** argv) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// make a unique key for core/app shared memory segment
|
// Make a unique key for core/app shared memory segment.
|
||||||
|
// Windows: also create and attach to the segment.
|
||||||
//
|
//
|
||||||
int ACTIVE_TASK::get_shmem_seg_name() {
|
int ACTIVE_TASK::get_shmem_seg_name() {
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
int i = 0;
|
int i;
|
||||||
char szSharedMemoryName[256];
|
char seg_name[256];
|
||||||
HANDLE hSharedMemoryHandle = 0;
|
HANDLE h = 0;
|
||||||
|
|
||||||
for (i=0; i<1024; i++) {
|
for (i=0; i<1024; i++) {
|
||||||
sprintf(szSharedMemoryName, "%sboinc_%d", SHM_PREFIX, i);
|
sprintf(seg_name, "%sboinc_%d", SHM_PREFIX, i);
|
||||||
hSharedMemoryHandle = create_shmem(szSharedMemoryName, 1024, NULL, true);
|
hSharedMemoryHandle = create_shmem(
|
||||||
if (hSharedMemoryHandle) break;
|
seg_name, sizeof(SHARED_MEM), (void**)&app_client_shm.shm, false
|
||||||
|
);
|
||||||
|
if (h) break;
|
||||||
}
|
}
|
||||||
|
if (!h) return ERR_SHMGET;
|
||||||
if (!hSharedMemoryHandle) {
|
sprintf(shmem_seg_name, "boinc_%d", i);
|
||||||
return ERR_SHMGET;
|
|
||||||
}
|
|
||||||
detach_shmem(hSharedMemoryHandle, NULL);
|
|
||||||
|
|
||||||
sprintf(szSharedMemoryName, "boinc_%d", i);
|
|
||||||
strcpy(shmem_seg_name, szSharedMemoryName);
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
char init_data_path[256];
|
char init_data_path[256];
|
||||||
#ifndef __EMX__
|
#ifndef __EMX__
|
||||||
|
@ -492,19 +488,6 @@ int ACTIVE_TASK::start(bool first_time) {
|
||||||
//
|
//
|
||||||
startup_info.dwFlags = STARTF_FORCEOFFFEEDBACK;
|
startup_info.dwFlags = STARTF_FORCEOFFFEEDBACK;
|
||||||
|
|
||||||
// create shared mem segment if needed
|
|
||||||
//
|
|
||||||
if (!app_client_shm.shm) {
|
|
||||||
sprintf(buf, "%s%s", SHM_PREFIX, shmem_seg_name);
|
|
||||||
shm_handle = create_shmem(buf, sizeof(SHARED_MEM),
|
|
||||||
(void **)&app_client_shm.shm, false
|
|
||||||
);
|
|
||||||
if (shm_handle == NULL) {
|
|
||||||
strcpy(buf, "Can't create shared memory");
|
|
||||||
retval = ERR_SHMGET;
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
app_client_shm.reset_msgs();
|
app_client_shm.reset_msgs();
|
||||||
|
|
||||||
if (config.run_apps_manually) {
|
if (config.run_apps_manually) {
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
<?
|
<?
|
||||||
|
|
||||||
$project_news = array(
|
$project_news = array(
|
||||||
|
array("May 9, 2008",
|
||||||
|
"BOINC volunteer Werner Klein is
|
||||||
|
<a href=http://www.sternengucker.org/index.php/artikel/interview-seti-ist-heute-bereits-erfolgreich/>interviewed
|
||||||
|
in Sternengucker.org</a> (German)."
|
||||||
|
),
|
||||||
array("May 9, 2008",
|
array("May 9, 2008",
|
||||||
"The <a href=http://boincfaq.mundayweb.com/>BOINC FAQ Service</a>
|
"The <a href=http://boincfaq.mundayweb.com/>BOINC FAQ Service</a>
|
||||||
is now available in Spanish and French
|
is now available in Spanish and French
|
||||||
|
|
|
@ -243,6 +243,7 @@ language("French", array(
|
||||||
));
|
));
|
||||||
language("German", array(
|
language("German", array(
|
||||||
//site("http://www.boinc-gemeinschaft.de/", "BOINC Gemeinschaft"),
|
//site("http://www.boinc-gemeinschaft.de/", "BOINC Gemeinschaft"),
|
||||||
|
site("http://www.gridcommunity.de/index.php", "International Grid Community"),
|
||||||
site("http://www.swissteam.net/", "SwissTeam.net"),
|
site("http://www.swissteam.net/", "SwissTeam.net"),
|
||||||
site("http://www.unitedmacs.com/", "United Macs"),
|
site("http://www.unitedmacs.com/", "United Macs"),
|
||||||
site("http://www.rechenkraft.net/", "Rechenkraft"),
|
site("http://www.rechenkraft.net/", "Rechenkraft"),
|
||||||
|
|
34
lib/shmem.C
34
lib/shmem.C
|
@ -53,6 +53,7 @@ extern "C" int debug_printf(const char *fmt, ...);
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
|
|
||||||
// MAP_FILE isn't defined on most operating systems, and even then, it
|
// MAP_FILE isn't defined on most operating systems, and even then, it
|
||||||
// is often defined just for the sake of compatibility. On those that
|
// is often defined just for the sake of compatibility. On those that
|
||||||
// don't define it, we will....
|
// don't define it, we will....
|
||||||
|
@ -70,7 +71,9 @@ extern "C" int debug_printf(const char *fmt, ...);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
HANDLE create_shmem(LPCTSTR seg_name, int size, void** pp, bool disable_mapview) {
|
HANDLE create_shmem(
|
||||||
|
LPCTSTR seg_name, int size, void** pp, bool disable_mapview
|
||||||
|
) {
|
||||||
HANDLE hMap = NULL;
|
HANDLE hMap = NULL;
|
||||||
DWORD dwError = 0;
|
DWORD dwError = 0;
|
||||||
DWORD dwRes = 0;
|
DWORD dwRes = 0;
|
||||||
|
@ -83,9 +86,10 @@ HANDLE create_shmem(LPCTSTR seg_name, int size, void** pp, bool disable_mapview)
|
||||||
OSVERSIONINFO osvi;
|
OSVERSIONINFO osvi;
|
||||||
char global_seg_name[256];
|
char global_seg_name[256];
|
||||||
|
|
||||||
// Win9X doesn't like any reference to a security descriptor. So if we
|
// Win9X doesn't like any reference to a security descriptor.
|
||||||
// detect that we are running on the Win9X platform pass a NULL value
|
// So if we detect that we are running on the Win9X platform pass
|
||||||
// for it.
|
// a NULL value for it.
|
||||||
|
//
|
||||||
osvi.dwOSVersionInfoSize = sizeof(osvi);
|
osvi.dwOSVersionInfoSize = sizeof(osvi);
|
||||||
GetVersionEx(&osvi);
|
GetVersionEx(&osvi);
|
||||||
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {
|
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {
|
||||||
|
@ -98,8 +102,8 @@ HANDLE create_shmem(LPCTSTR seg_name, int size, void** pp, bool disable_mapview)
|
||||||
if(!AllocateAndInitializeSid(&SIDAuthWorld, 1,
|
if(!AllocateAndInitializeSid(&SIDAuthWorld, 1,
|
||||||
SECURITY_WORLD_RID,
|
SECURITY_WORLD_RID,
|
||||||
0, 0, 0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0, 0, 0,
|
||||||
&pEveryoneSID))
|
&pEveryoneSID)
|
||||||
{
|
) {
|
||||||
fprintf(stderr, "AllocateAndInitializeSid Error %u\n", GetLastError());
|
fprintf(stderr, "AllocateAndInitializeSid Error %u\n", GetLastError());
|
||||||
goto Cleanup;
|
goto Cleanup;
|
||||||
}
|
}
|
||||||
|
@ -124,15 +128,15 @@ HANDLE create_shmem(LPCTSTR seg_name, int size, void** pp, bool disable_mapview)
|
||||||
|
|
||||||
// Initialize a security descriptor.
|
// Initialize a security descriptor.
|
||||||
pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
|
pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
|
||||||
if (NULL == pSD)
|
if (NULL == pSD) {
|
||||||
{
|
|
||||||
fprintf(stderr, "LocalAlloc Error %u\n", GetLastError());
|
fprintf(stderr, "LocalAlloc Error %u\n", GetLastError());
|
||||||
goto Cleanup;
|
goto Cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION))
|
if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)) {
|
||||||
{
|
fprintf(stderr, "InitializeSecurityDescriptor Error %u\n",
|
||||||
fprintf(stderr, "InitializeSecurityDescriptor Error %u\n", GetLastError());
|
GetLastError()
|
||||||
|
);
|
||||||
goto Cleanup;
|
goto Cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,9 +144,11 @@ HANDLE create_shmem(LPCTSTR seg_name, int size, void** pp, bool disable_mapview)
|
||||||
if (!SetSecurityDescriptorDacl(pSD,
|
if (!SetSecurityDescriptorDacl(pSD,
|
||||||
TRUE, // bDaclPresent flag
|
TRUE, // bDaclPresent flag
|
||||||
pACL,
|
pACL,
|
||||||
FALSE)) // not a default DACL
|
FALSE) // not a default DACL
|
||||||
{
|
) {
|
||||||
fprintf(stderr, "SetSecurityDescriptorDacl Error %u\n", GetLastError());
|
fprintf(stderr,
|
||||||
|
"SetSecurityDescriptorDacl Error %u\n", GetLastError()
|
||||||
|
);
|
||||||
goto Cleanup;
|
goto Cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue