#ifdef HAVE_SYS_MMAN_H
#include <sys/mman.h>
#elif defined(WIN32)
-#include <Windows.h>
-#include <Memoryapi.h>
+#include <windows.h>
+#include <memoryapi.h>
#endif
#include <unistd.h>
void
shared_memory_set_env (pid_t pid)
{
-#define bufsize 20
- char buffer[bufsize];
-
- snprintf (buffer, bufsize, "%d", pid);
-#ifdef HAVE_SETENV
- setenv (ENV_PPID, buffer, 1);
+#if defined(HAVE_SETENV)
+ char val[20];
+ snprintf (val, 20, "%d", pid);
+ setenv (ENV_PPID, val, 1);
+#elif defined(WIN32)
+ char val[20];
+ snprintf (val, 20, "%d", pid);
+ SetEnvironmentVariable (ENV_PPID, val);
#else
- SetEnvironmentVariable (ENV_PPID, buffer);
+ char buffer[28];
+ int res;
+
+ /* HP-UX / Legacy Fallback using putenv */
+ res = snprintf (buffer, 28, "%s=%d", "ENV_PPID", (int)pid);
+ if (res != -1)
+ putenv (buffer);
#endif
-#undef bufsize
}
char *
asm volatile ("" ::: "memory");
}
-#define NAME_MAX 255
+#define SHM_NAME_MAX 255
/* Initialize the memory with one page, the shared metadata of the
shared memory is stored at the beginning. */
void
shared_memory_init (shared_memory_act *mem, size_t size)
{
- char shm_name[NAME_MAX];
+ char shm_name[SHM_NAME_MAX];
const char *env_val = getenv (ENV_PPID), *base = getenv (ENV_BASE);
pid_t ppid = getpid ();
void *base_ptr;
int n = sscanf (env_val, "%d", &ppid);
assert (n == 1);
}
- snprintf (shm_name, NAME_MAX, "/gfor-shm-%d", ppid);
+ snprintf (shm_name, SHM_NAME_MAX, "/gfor-shm-%d", ppid);
if (base)
{
int n = sscanf (base, "%p", &base_ptr);
}
if (this_image.image_num == -1)
{
- char shm_name[NAME_MAX];
+ char shm_name[SHM_NAME_MAX];
- snprintf (shm_name, NAME_MAX, "/gfor-shm-%s", shared_memory_get_env ());
+ snprintf (shm_name, SHM_NAME_MAX, "/gfor-shm-%s", shared_memory_get_env ());
/* Only the supervisor is to delete the shm-file. */
res = shm_unlink (shm_name);
if (res == -1)
CloseHandle (mem->shm_fd);
#endif
}
-#undef NAME_MAX
+#undef SHM_NAME_MAX
#if !defined(_SC_PAGE_SIZE) && defined(WIN32)
#include <windows.h>
#endif
-
+#if defined(__hpux__)
+#include <sys/mpctl.h>
+#endif
#define GFORTRAN_ENV_NUM_IMAGES "GFORTRAN_NUM_IMAGES"
#define GFORTRAN_ENV_SHARED_MEMORY_SIZE "GFORTRAN_SHARED_MEMORY_SIZE"
#define GFORTRAN_ENV_IMAGE_NUM "GFORTRAN_IMAGE_NUM"
char *num_images_char;
int nimages;
num_images_char = getenv (GFORTRAN_ENV_NUM_IMAGES);
+
+ /* It is expected that the user has set the GFORTRAN_NUM_IMAGES
+ environment variable. If not, we fall back to the number of cores. */
if (!num_images_char)
#ifdef _SC_NPROCESSORS_ONLN
return sysconf (_SC_NPROCESSORS_ONLN);
#elif defined(WIN32)
num_images_char = getenv ("NUMBER_OF_PROCESSORS");
+#elif defined (__hpux__)
+ return mpctl (MPC_GETNUMSPUS, 0, 0);
#else
#error "Unsupported system: No known way to get number of cores!"
#endif