📄 mpid_nem_alloc.c
字号:
MPIU_Snprintf (*handle, MAX_INT_STR_LEN, "%d", shmid); MPIU_CHKPMEM_COMMIT(); fn_exit: MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_ALLOCATE_SHARED_MEMORY); return mpi_errno; fn_fail: /* --BEGIN ERROR HANDLING-- */ shmctl (shmid, IPC_RMID, &ds); /* try to remove region */ MPIU_CHKPMEM_REAP(); goto fn_exit; /* --END ERROR HANDLING-- */}/* MPID_nem_attach_shared_memory attaches to shared memory previously allocated by MPID_nem_allocate_shared_memory *//* MPID_nem_attach_shared_memory (char **buf_p, const int length, const char const handle[]) triggers a warning */#undef FUNCNAME#define FUNCNAME MPID_nem_attach_shared_memory#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)intMPID_nem_attach_shared_memory (char **buf_p, const int length, const char handle[]){ int mpi_errno = MPI_SUCCESS; void *buf; int shmid; struct shmid_ds ds; char *endptr; MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_ATTACH_SHARED_MEMORY); MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_ATTACH_SHARED_MEMORY); shmid = strtoll (handle, &endptr, 10); MPIU_ERR_CHKANDJUMP2 (endptr == handle || *endptr != '\0', mpi_errno, MPI_ERR_OTHER, "**attach_shar_mem", "**attach_shar_mem %s %s", "strtoll", strerror (errno)); buf = 0; buf = shmat (shmid, buf, 0); MPIU_ERR_CHKANDJUMP2 ((MPI_Aint)buf == -1, mpi_errno, MPI_ERR_OTHER, "**attach_shar_mem", "**attach_shar_mem %s %s", "shmat", strerror (errno)); *buf_p = buf; fn_exit: MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_ATTACH_SHARED_MEMORY); return mpi_errno; fn_fail: /* --BEGIN ERROR HANDLING-- */ shmctl (shmid, IPC_RMID, &ds); /* try to remove region */ goto fn_exit; /* --END ERROR HANDLING-- */}/* MPID_nem_remove_shared_memory removes the OS descriptor associated with the handle. Once all processes detatch from the region the OS resource will be destroyed. */#undef FUNCNAME#define FUNCNAME MPID_nem_remove_shared_memory#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)intMPID_nem_remove_shared_memory (const char const handle[]){ int mpi_errno = MPI_SUCCESS; int ret; int shmid; struct shmid_ds ds; MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_REMOVE_SHARED_MEMORY); MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_REMOVE_SHARED_MEMORY); shmid = atoi (handle); ret = shmctl (shmid, IPC_RMID, &ds); MPIU_ERR_CHKANDJUMP2 (ret == -1, mpi_errno, MPI_ERR_OTHER, "**remove_shar_mem", "**remove_shar_mem %s %s", "shmctl", strerror (errno)); fn_exit: MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_REMOVE_SHARED_MEMORY); return mpi_errno; fn_fail: /* --BEGIN ERROR HANDLING-- */ shmctl (shmid, IPC_RMID, &ds); /* try to remove region */ goto fn_exit; /* --END ERROR HANDLING-- */}/* MPID_nem_detach_shared_memory detaches the shared memory region from this process */#undef FUNCNAME#define FUNCNAME MPID_nem_detach_shared_memory#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)intMPID_nem_detach_shared_memory (const char *buf_p, const int length){ int mpi_errno = MPI_SUCCESS; int ret; MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_DETACH_SHARED_MEMORY); MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_DETACH_SHARED_MEMORY); ret = shmdt (buf_p); /* I'm ignoring the return code here to work around an bug with gm-1 when a sysv shared memory region is registered. -db */ /* MPIU_ERR_CHKANDJUMP2 (ret == -1, mpi_errno, MPI_ERR_OTHER, "**detach_shar_mem", "**detach_shar_mem %s %s", "shmdt", strerror (errno));*/ fn_exit: MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_DETACH_SHARED_MEMORY); return mpi_errno; fn_fail: goto fn_exit;}#else /* HAVE_SYSV_SHARED_MEM *//* Using memory mapped files */#define MAX_INT_STR_LEN 12 /* chars needed to store largest integer including /0 *//* MPID_nem_allocate_shared_memory allocates a shared mem region of size "length" and attaches to it. "handle" points to a string descriptor for the region to be passed in to MPID_nem_attach_shared_memory. "handle" is dynamically allocated and should be freed by the caller.*/#undef FUNCNAME#define FUNCNAME MPID_nem_allocate_shared_memory#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)intMPID_nem_allocate_shared_memory (char **buf_p, const int length, char *handle[]){ int mpi_errno = MPI_SUCCESS; int fd; int ret; const char dev_fname[] = "/dev/shm/nemesis_shar_tmpXXXXXX"; const char tmp_fname[] = "/tmp/nemesis_shar_tmpXXXXXX"; MPIU_CHKPMEM_DECL(2); MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_ALLOCATE_SHARED_MEMORY); MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_ALLOCATE_SHARED_MEMORY); /* create a file */ /* use /dev/shm if it's there, otherwise put file in /tmp */ MPIU_CHKPMEM_MALLOC (*handle, char *, sizeof (dev_fname), mpi_errno, "shared memory handle"); memcpy (*handle, dev_fname, sizeof (dev_fname)); fd = mkstemp (*handle); if (fd == -1) { /* creating in /dev/shm failed, fall back to /tmp. If that doesn't work, give up. */ MPIU_Free (*handle); MPIU_CHKPMEM_MALLOC (*handle, char *, sizeof (tmp_fname), mpi_errno, "shared memory handle"); memcpy (*handle, tmp_fname, sizeof (tmp_fname)); fd = mkstemp (*handle); MPIU_ERR_CHKANDJUMP2 (fd == -1, mpi_errno, MPI_ERR_OTHER, "**alloc_shar_mem", "**alloc_shar_mem %s %s", "mkstmp", strerror (errno)); } /* set file to "length" bytes */ ret = lseek (fd, length-1, SEEK_SET); MPIU_ERR_CHKANDSTMT2 (ret == -1, mpi_errno, MPI_ERR_OTHER, goto fn_close_fail, "**alloc_shar_mem", "**alloc_shar_mem %s %s", "lseek", strerror (errno)); do { ret = write (fd, "", 1); } while ((ret == -1 && errno == EINTR) || ret == 0); MPIU_ERR_CHKANDSTMT2 (ret == -1, mpi_errno, MPI_ERR_OTHER, goto fn_close_fail, "**alloc_shar_mem", "**alloc_shar_mem %s %s", "lseek", strerror (errno)); /* mmap the file */ *buf_p = mmap (NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); MPIU_ERR_CHKANDSTMT2 (*buf_p == MAP_FAILED, mpi_errno, MPI_ERR_OTHER, goto fn_close_fail, "**alloc_shar_mem", "**alloc_shar_mem %s %s", "mmap", strerror (errno)); /* close the file */ do { ret = close (fd); } while (ret == -1 && errno == EINTR); MPIU_ERR_CHKANDSTMT2 (ret == -1, mpi_errno, MPI_ERR_OTHER, goto fn_close_fail, "**alloc_shar_mem", "**alloc_shar_mem %s %s", "close", strerror (errno)); MPIU_CHKPMEM_COMMIT(); fn_exit: MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_ALLOCATE_SHARED_MEMORY); return mpi_errno; fn_close_fail: close (fd); unlink (*handle); fn_fail: /* --BEGIN ERROR HANDLING-- */ MPIU_CHKPMEM_REAP(); goto fn_exit; /* --END ERROR HANDLING-- */}/* MPID_nem_attach_shared_memory attaches to shared memory previously allocated by MPID_nem_allocate_shared_memory *//* MPID_nem_attach_shared_memory (char **buf_p, const int length, const char const handle[]) make a warning */#undef FUNCNAME#define FUNCNAME MPID_nem_attach_shared_memory#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)intMPID_nem_attach_shared_memory (char **buf_p, const int length, const char handle[]){ int mpi_errno = MPI_SUCCESS; int ret; int fd; MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_ATTACH_SHARED_MEMORY); MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_ATTACH_SHARED_MEMORY); fd = open (handle, O_RDWR); MPIU_ERR_CHKANDJUMP2 (fd == -1, mpi_errno, MPI_ERR_OTHER, "**attach_shar_mem", "**attach_shar_mem %s %s", "open", strerror (errno)); /* mmap the file */ *buf_p = mmap (NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); MPIU_ERR_CHKANDSTMT2 (*buf_p == MAP_FAILED, mpi_errno, MPI_ERR_OTHER, goto fn_close_fail, "**attach_shar_mem", "**attach_shar_mem %s %s", "open", strerror (errno)); /* close the file */ do { ret = close (fd); } while (ret == -1 && errno == EINTR); MPIU_ERR_CHKANDSTMT2 (ret == -1, mpi_errno, MPI_ERR_OTHER, goto fn_close_fail, "**attach_shar_mem", "**attach_shar_mem %s %s", "close", strerror (errno)); fn_exit: MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_ATTACH_SHARED_MEMORY); return mpi_errno; fn_close_fail: close (fd); fn_fail: /* --BEGIN ERROR HANDLING-- */ unlink (handle); goto fn_exit; /* --END ERROR HANDLING-- */}/* MPID_nem_remove_shared_memory removes the OS descriptor associated with the handle. Once all processes detatch from the region the OS resource will be destroyed. */#undef FUNCNAME#define FUNCNAME MPID_nem_remove_shared_memory#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)intMPID_nem_remove_shared_memory (const char handle[]){ int mpi_errno = MPI_SUCCESS; int ret; MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_REMOVE_SHARED_MEMORY); MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_REMOVE_SHARED_MEMORY); ret = unlink (handle); MPIU_ERR_CHKANDJUMP2 (ret == -1, mpi_errno, MPI_ERR_OTHER, "**remove_shar_mem", "**remove_shar_mem %s %s", "unlink", strerror (errno)); fn_exit: MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_REMOVE_SHARED_MEMORY); return mpi_errno; fn_fail: goto fn_exit;}/* MPID_nem_detach_shared_memory detaches the shared memory region from this process */#undef FUNCNAME#define FUNCNAME MPID_nem_detach_shared_memory#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)intMPID_nem_detach_shared_memory (const char *buf_p, const int length){ int mpi_errno = MPI_SUCCESS; int ret; MPIDI_STATE_DECL(MPID_STATE_MPID_NEM_DETACH_SHARED_MEMORY); MPIDI_FUNC_ENTER(MPID_STATE_MPID_NEM_DETACH_SHARED_MEMORY); ret = munmap ((void *)buf_p, length); MPIU_ERR_CHKANDJUMP2 (ret == -1, mpi_errno, MPI_ERR_OTHER, "**detach_shar_mem", "**detach_shar_mem %s %s", "munmap", strerror (errno)); fn_exit: MPIDI_FUNC_EXIT(MPID_STATE_MPID_NEM_DETACH_SHARED_MEMORY); return mpi_errno; fn_fail: goto fn_exit;}#endif /* HAVE_SYSV_SHARED_MEM */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -