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

📄 opal_ptmalloc2_munmap.c

📁 MPI stands for the Message Passing Interface. Written by the MPI Forum (a large committee comprising
💻 C
字号:
/* * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana *                         University Research and Technology *                         Corporation.  All rights reserved. * Copyright (c) 2004-2005 The University of Tennessee and The University *                         of Tennessee Research Foundation.  All rights *                         reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,  *                         University of Stuttgart.  All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. *                         All rights reserved. * $COPYRIGHT$ *  * Additional copyrights may follow *  * $HEADER$ */#include "opal_config.h"#include <sys/types.h>#include <stdlib.h>#include <sys/mman.h>#if defined(HAVE___MUNMAP)/* here so we only include others if we absolutely have to */#elif defined(HAVE_SYSCALL)#include <syscall.h>#include <unistd.h>#endif#if defined(HAVE_DLSYM)#ifndef __USE_GNU#define __USE_GNU#endif#include <dlfcn.h>#endif#include "opal/memoryhooks/memory_internal.h"/* * munmap is always intercepted */int opal_mem_free_ptmalloc2_munmap(void *start, size_t length, int from_alloc);#if defined(HAVE___MUNMAP)int  __munmap(void* addr, size_t len);#endif/* intercept munmap, as the user can give back memory that way as well. */int munmap(void* addr, size_t len){    return opal_mem_free_ptmalloc2_munmap(addr, len, 0);}/* three ways to call munmap.  Prefered is to just call syscall, so   that we can intercept both munmap and __munmap.  If that isn't   possible, try calling __munmap from munmap and let __munmap go.  If   that doesn't work, try dlsym */intopal_mem_free_ptmalloc2_munmap(void *start, size_t length, int from_alloc){#if !defined(HAVE___MUNMAP) && !(defined(HAVE_SYSCALL) && defined(__NR_munmap)) && defined(HAVE_DLSYM)    static int (*realmunmap)(void*, size_t);#endif    opal_mem_hooks_release_hook(start, length, from_alloc);#if defined(HAVE___MUNMAP)    return __munmap(start, length);#elif defined(HAVE_SYSCALL) && defined(__NR_munmap)    return syscall(__NR_munmap, start, length);#elif defined(HAVE_DLSYM)    if (NULL == realmunmap) {        union {             int (*munmap_fp)(void*, size_t);            void *munmap_p;        } tmp;        tmp.munmap_p = dlsym(RTLD_NEXT, "munmap");        realmunmap = tmp.munmap_fp;    }    return realmunmap(start, length);#else    #error "Can not determine how to call munmap"#endif}/* * mmap is only intercepted if we have a chance of finding it (ie, a * syscall or weak symbol) */void*  opal_mem_free_ptmalloc2_mmap(void *start, size_t length,                                     int prot, int flags,                                     int fd, off_t offset,                                    int from_alloc);#if defined(HAVE___MMAP)void* __mmap(void *start, size_t length, int prot, int flags,              int fd, off_t offset);void* mmap(void *start, size_t length, int prot, int flags,      int fd, off_t offset){    return opal_mem_free_ptmalloc2_mmap(start, length, prot, flags,                                        fd, offset, 0);}#endif /* defined(HAVE___MMAP) */ void*  opal_mem_free_ptmalloc2_mmap(void *start, size_t length,                                     int prot, int flags,                                     int fd, off_t offset,                                     int from_alloc){    void *tmp;#if defined(HAVE___MMAP)    tmp = __mmap(start, length, prot, flags, fd, offset);#else    tmp = mmap(start, length, prot, flags, fd, offset);#endif    opal_mem_hooks_alloc_hook(tmp, length, from_alloc);    return tmp;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -