int _mmap_segment_create(pmix_sm_seg_t *sm_seg, const char *file_name, size_t size) { int rc = PMIX_SUCCESS; void *seg_addr = MAP_FAILED; pid_t my_pid = getpid(); _segment_ds_reset(sm_seg); /* enough space is available, so create the segment */ if (-1 == (sm_seg->seg_id = open(file_name, O_CREAT | O_RDWR, 0600))) { pmix_output_verbose(2, pmix_globals.debug_output, "sys call open(2) fail\n"); rc = PMIX_ERROR; goto out; } /* size backing file - note the use of real_size here */ if (0 != ftruncate(sm_seg->seg_id, size)) { pmix_output_verbose(2, pmix_globals.debug_output, "sys call ftruncate(2) fail\n"); rc = PMIX_ERROR; goto out; } if (MAP_FAILED == (seg_addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, sm_seg->seg_id, 0))) { pmix_output_verbose(2, pmix_globals.debug_output, "sys call mmap(2) fail\n"); rc = PMIX_ERROR; goto out; } sm_seg->seg_cpid = my_pid; sm_seg->seg_size = size; sm_seg->seg_base_addr = (unsigned char *)seg_addr; (void)strncpy(sm_seg->seg_name, file_name, PMIX_PATH_MAX - 1); out: if (-1 != sm_seg->seg_id) { if (0 != close(sm_seg->seg_id)) { pmix_output_verbose(2, pmix_globals.debug_output, "sys call close(2) fail\n"); rc = PMIX_ERROR; } } /* an error occured, so invalidate the shmem object and munmap if needed */ if (PMIX_SUCCESS != rc) { if (MAP_FAILED != seg_addr) { munmap((void *)seg_addr, size); } _segment_ds_reset(sm_seg); } return rc; }
static int _mmap_segment_detach(pmix_pshmem_seg_t *sm_seg) { int rc = PMIX_SUCCESS; if (0 != munmap((void *)sm_seg->seg_base_addr, sm_seg->seg_size)) { pmix_output_verbose(2, pmix_globals.debug_output, "sys call munmap(2) fail\n"); rc = PMIX_ERROR; } /* reset the contents of the pmix_sm_seg_t associated with this * shared memory segment. */ _segment_ds_reset(sm_seg); return rc; }
static int _mmap_segment_create(pmix_pshmem_seg_t *sm_seg, const char *file_name, size_t size) { int rc = PMIX_SUCCESS; void *seg_addr = MAP_FAILED; pid_t my_pid = getpid(); _segment_ds_reset(sm_seg); /* enough space is available, so create the segment */ if (-1 == (sm_seg->seg_id = open(file_name, O_CREAT | O_RDWR, 0600))) { pmix_output_verbose(2, pmix_globals.debug_output, "sys call open(2) fail\n"); rc = PMIX_ERROR; goto out; } /* size backing file - note the use of real_size here */ #ifdef HAVE_POSIX_FALLOCATE if (0 != (rc = posix_fallocate(sm_seg->seg_id, 0, size))) { pmix_output_verbose(2, pmix_globals.debug_output, "sys call posix_fallocate(2) fail\n"); if (ENOSPC == rc) { rc = PMIX_ERR_OUT_OF_RESOURCE; goto out; } else if ((ENOTSUP != rc) #ifdef EOPNOTSUPP && (EOPNOTSUPP != rc) #endif ){ rc = PMIX_ERROR; goto out; } /* else: * Not supported by OS and/or filesystem. * Must fall-back to ftruncate(). */ } else { goto map_memory; } #endif if (0 != ftruncate(sm_seg->seg_id, size)) { pmix_output_verbose(2, pmix_globals.debug_output, "sys call ftruncate(2) fail\n"); rc = PMIX_ERROR; goto out; } else { rc = PMIX_SUCCESS; } #ifdef HAVE_POSIX_FALLOCATE map_memory: #endif if (MAP_FAILED == (seg_addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, sm_seg->seg_id, 0))) { pmix_output_verbose(2, pmix_globals.debug_output, "sys call mmap(2) fail\n"); rc = PMIX_ERROR; goto out; } sm_seg->seg_cpid = my_pid; sm_seg->seg_size = size; sm_seg->seg_base_addr = (unsigned char *)seg_addr; (void)strncpy(sm_seg->seg_name, file_name, PMIX_PATH_MAX - 1); out: if (-1 != sm_seg->seg_id) { if (0 != close(sm_seg->seg_id)) { pmix_output_verbose(2, pmix_globals.debug_output, "sys call close(2) fail\n"); rc = PMIX_ERROR; } } /* an error occured, so invalidate the shmem object and munmap if needed */ if (PMIX_SUCCESS != rc) { if (MAP_FAILED != seg_addr) { munmap((void *)seg_addr, size); } _segment_ds_reset(sm_seg); } return rc; }