void* mono_shared_area (void) { int fd; int pid = getpid (); /* we should allow the user to configure the size */ int size = mono_pagesize (); char buf [128]; void *res; SAreaHeader *header; if (shared_area_disabled ()) { if (!malloced_shared_area) malloced_shared_area = malloc_shared_area (0); /* get the pid here */ return malloced_shared_area; } /* perform cleanup of segments left over from dead processes */ mono_shared_area_instances_helper (NULL, 0, TRUE); g_snprintf (buf, sizeof (buf), "/mono.%d", pid); fd = shm_open (buf, O_CREAT|O_EXCL|O_RDWR, S_IRUSR|S_IWUSR|S_IRGRP); if (fd == -1 && errno == EEXIST) { /* leftover */ shm_unlink (buf); fd = shm_open (buf, O_CREAT|O_EXCL|O_RDWR, S_IRUSR|S_IWUSR|S_IRGRP); } /* in case of failure we try to return a memory area anyway, * even if it means the data can't be read by other processes */ if (fd == -1) return malloc_shared_area (pid); if (ftruncate (fd, size) != 0) { shm_unlink (buf); close (fd); } BEGIN_CRITICAL_SECTION; res = mmap (NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); END_CRITICAL_SECTION; if (res == MAP_FAILED) { shm_unlink (buf); close (fd); return malloc_shared_area (pid); } /* we don't need the file descriptor anymore */ close (fd); header = (SAreaHeader *) res; header->size = size; header->pid = pid; header->stats_start = sizeof (SAreaHeader); header->stats_end = sizeof (SAreaHeader); mono_atexit (mono_shared_area_remove); return res; }
void* mono_shared_area (void) { if (!malloced_shared_area) malloced_shared_area = malloc_shared_area (getpid ()); /* get the pid here */ return malloced_shared_area; }
void* mono_shared_area (void) { return malloc_shared_area (getpid ()); }
void* mono_shared_area (void) { /* get the pid here */ return malloc_shared_area (0); }