⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpid_nem_alloc.c

📁 fortran并行计算包
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -