📄 ch3_shm_memory.c
字号:
if (ret_val == -1) {#ifdef EIDRM if (errno != EIDRM)#endif mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**shmctl", "**shmctl %d %d", p->id, ret_val); MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_UNLINK_MEM); return mpi_errno; } MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_UNLINK_MEM); return mpi_errno;}#undef FUNCNAME#define FUNCNAME MPIDI_CH3I_SHM_Release_mem#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPIDI_CH3I_SHM_Release_mem(MPIDI_CH3I_Shmem_block_request_result *p){ MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3I_SHM_RELEASE_MEM); MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3I_SHM_RELEASE_MEM); shmdt(p->addr); MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_RELEASE_MEM); return MPI_SUCCESS;}/* END OF SVSY_SHM */#elif defined(USE_WINDOWS_SHM)#undef FUNCNAME#define FUNCNAME MPIDI_CH3I_SHM_Get_mem#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)/* MPIDI_CH3I_SHM_Get_mem - allocate and get the address and size of a shared memory block */int MPIDI_CH3I_SHM_Get_mem(int size, MPIDI_CH3I_Shmem_block_request_result *pOutput){ int mpi_errno = MPI_SUCCESS; MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM); MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM); if (size == 0 || size > MPIDU_MAX_SHM_BLOCK_SIZE ) { mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**arg", 0); MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM); return mpi_errno; } /* Create the shared memory object */ generate_shm_string(pOutput->key); pOutput->id = CreateFileMapping( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, size, pOutput->key); if (pOutput->id == NULL) { pOutput->error = GetLastError(); mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**CreateFileMapping", "**CreateFileMapping %d", pOutput->error); /*"Error in CreateFileMapping, %d", pOutput->error);*/ MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM); return mpi_errno; } pOutput->addr = NULL; pOutput->addr = MapViewOfFileEx( pOutput->id, FILE_MAP_WRITE, 0, 0, size, NULL ); if (pOutput->addr == NULL) { pOutput->error = GetLastError(); mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**MapViewOfFileEx", "**MapViewOfFileEx %d", pOutput->error); MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM); return mpi_errno; } pOutput->size = size; pOutput->error = MPI_SUCCESS; MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM); return MPI_SUCCESS;}#undef FUNCNAME#define FUNCNAME MPIDI_CH3I_SHM_Attach_to_mem#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)/* MPIDI_CH3I_SHM_Attach_to_mem - attach to an existing shmem queue*/int MPIDI_CH3I_SHM_Attach_to_mem(MPIDI_CH3I_Shmem_block_request_result *pInput, MPIDI_CH3I_Shmem_block_request_result *pOutput){ int mpi_errno; MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3I_SHM_ATTACH_TO_MEM); MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3I_SHM_ATTACH_TO_MEM); /* Create the shared memory object */ MPIU_DBG_PRINTF(("MPIDI_CH3I_SHM_Attach_to_mem: Creating file mapping of size %d named %s\n", pInput->size, pInput->key)); pOutput->id = CreateFileMapping( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, pInput->size, pInput->key); if (pOutput->id == NULL) { pOutput->error = GetLastError(); mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**CreateFileMapping", "**CreateFileMapping %d", pOutput->error); /*"Error in CreateFileMapping, %d", pOutput->error);*/ MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_ATTACH_TO_MEM); return mpi_errno; } pOutput->addr = NULL; pOutput->addr = MapViewOfFileEx( pOutput->id, FILE_MAP_WRITE, 0, 0, pInput->size, NULL ); if (pOutput->addr == NULL) { pOutput->error = GetLastError(); mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**MapViewOfFileEx", "**MapViewOfFileEx %d", pOutput->error); MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_ATTACH_TO_MEM); return mpi_errno; } pOutput->error = MPI_SUCCESS; MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_ATTACH_TO_MEM); return MPI_SUCCESS;}#undef FUNCNAME#define FUNCNAME MPIDI_CH3I_SHM_Unlink_mem#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPIDI_CH3I_SHM_Unlink_mem(MPIDI_CH3I_Shmem_block_request_result *p){ int mpi_errno = MPI_SUCCESS; MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3I_SHM_UNLINK_MEM); MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3I_SHM_UNLINK_MEM); /* Windows requires no special handling */ MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_UNLINK_MEM); return mpi_errno;}/*@ MPIDI_CH3I_SHM_Release_mem - Notes:@*/#undef FUNCNAME#define FUNCNAME MPIDI_CH3I_SHM_Release_mem#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPIDI_CH3I_SHM_Release_mem(MPIDI_CH3I_Shmem_block_request_result *p){ MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3I_SHM_RELEASE_MEM); MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3I_SHM_RELEASE_MEM); UnmapViewOfFile(p->addr); CloseHandle(p->id); MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_RELEASE_MEM); return MPI_SUCCESS;}/* END OF WINDOWS_SHM */#else#error No shared memory subsystem defined#endif/* FIXME: What is this routine for? Why does this routine duplicate so much of the code in the MPIDI_CH3I_SHM_Get_mem function (but not exactly; e.g., is there a reason that this routine and the Get_mem version use slightly different arguments to the shm_open routine and take different action on failure? */#undef FUNCNAME#define FUNCNAME MPIDI_CH3I_SHM_Get_mem_named#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)/*@ MPIDI_CH3I_SHM_Get_mem_named - allocate and get the address and size of a shared memory block Parameters:+ int size - size- MPIDI_CH3I_Shmem_block_request_result* pOutput - output@*/int MPIDI_CH3I_SHM_Get_mem_named(int size, MPIDI_CH3I_Shmem_block_request_result *pOutput){ int mpi_errno = MPI_SUCCESS;#if defined (USE_POSIX_SHM)#elif defined (USE_SYSV_SHM) int i; FILE *fout; int shmflag;#endif MPIDI_STATE_DECL(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM_NAMED); MPIDI_FUNC_ENTER(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM_NAMED); if (size == 0 || size > MPIDU_MAX_SHM_BLOCK_SIZE ) { mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**arg", 0); MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM_NAMED); return mpi_errno; } /* Create the shared memory object */#ifdef USE_POSIX_SHM /*printf("[%d] creating a named shm object: '%s'\n", MPIR_Process.comm_world->rank, pOutput->name);*/ pOutput->id = shm_open(pOutput->name, O_RDWR | O_CREAT, 0600); if (pOutput->id == -1) { pOutput->error = errno; mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**shm_open", "**shm_open %s %d", pOutput->name, pOutput->error); MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM_NAMED); return mpi_errno; } if (ftruncate(pOutput->id, size) == -1) { pOutput->error = errno; mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**ftruncate", "**ftruncate %s %d %d", pOutput->name, size, pOutput->error); MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM_NAMED); return mpi_errno; }#elif defined (USE_SYSV_SHM) /* Insert code here to convert the name into a key */ fout = fopen(pOutput->name, "a+"); pOutput->key = ftok(pOutput->name, 12345); fclose(fout); if (pOutput->key == -1) { pOutput->error = errno; mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**ftok", "**ftok %s %d %d", pOutput->name, 12345, pOutput->error); MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM_NAMED); return mpi_errno; } shmflag = IPC_CREAT;#ifdef HAVE_SHM_RW shmflag |= SHM_R | SHM_W;#endif pOutput->id = shmget(pOutput->key, size, shmflag ); if (pOutput->id == -1) { pOutput->error = errno; mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**shmget", "**shmget %d", pOutput->error); MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM_NAMED); return mpi_errno; }#elif defined (USE_WINDOWS_SHM) pOutput->id = CreateFileMapping( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, size, pOutput->name); if (pOutput->id == NULL) { pOutput->error = GetLastError(); mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**CreateFileMapping", "**CreateFileMapping %d", pOutput->error); /*"Error in CreateFileMapping, %d", pOutput->error);*/ MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM_NAMED); return mpi_errno; }#else#error No shared memory subsystem defined#endif /*printf("[%d] mmapping the shared memory object\n", MPIR_Process.comm_world->rank);fflush(stdout);*/ pOutput->addr = NULL;#ifdef USE_POSIX_SHM pOutput->addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED /* | MAP_NORESERVE*/, pOutput->id, 0); if (pOutput->addr == MAP_FAILED) { mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**mmap", "**mmap %d", errno); pOutput->addr = NULL; MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM_NAMED); return mpi_errno; } #elif defined (USE_SYSV_SHM) pOutput->addr = shmat(pOutput->id, NULL, SHM_RND); if (pOutput->addr == (void*)-1) { pOutput->error = errno; pOutput->addr = NULL; mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**shmat", "**shmat %d", pOutput->error); /*"Error from shmat %d", pOutput->error);*/ MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM_NAMED); return mpi_errno; }#elif defined(USE_WINDOWS_SHM) pOutput->addr = MapViewOfFileEx( pOutput->id, FILE_MAP_WRITE, 0, 0, size, NULL ); if (pOutput->addr == NULL) { pOutput->error = GetLastError(); mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**MapViewOfFileEx", "**MapViewOfFileEx %d", pOutput->error); MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM_NAMED); return mpi_errno; }#else#error No shared memory subsystem defined#endif pOutput->size = size; pOutput->error = MPI_SUCCESS; MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_SHM_GET_MEM_NAMED); return MPI_SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -