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

📄 opal_memory_basic.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 "ompi_config.h"#include <stdlib.h>#include <stdio.h>#include <sys/mman.h>#include <assert.h>#include "ompi/constants.h"#include "opal/runtime/opal.h"#include "opal/memoryhooks/memory.h"/*  * The counter variable is volatile to avoid (wrong) compiler optimisations,  * which can lead to wrong code. */volatile int counter = 0;const int bigsize = 100 * 1024 * 1024;static voidalloc_callback(void *buf, size_t length, void *cbdata, bool extra){    counter++;}static voidrelease_callback(void *buf, size_t length, void *cbdata, bool extra){    printf("\trelease callback with %lx, %d\n", (unsigned long) buf, (int) length);    counter--;}static intfree_only_test(void){    /* BWB - finish me! */    printf("test not written yet - skipping\n");    return 77;}static intalloc_free_test(void){    void *foo, *bar;    int retval;    retval = opal_mem_hooks_register_release(release_callback, NULL);    retval |= opal_mem_hooks_register_alloc(alloc_callback, NULL);    if (retval != OMPI_SUCCESS) {        printf("handler registration failed\n");        return retval;    }    /* make some big malloc that should always trip a release on free */    printf("  - malloc big buffer\n");    counter = 0;    foo = malloc(bigsize);    assert(counter >= 1);    printf("  - free of big buffer\n");    counter = 1;    free(foo);    assert(counter == 0);    /* check mmap / munmap */    printf("  - mmap of buffer\n");    counter = 0;    bar = mmap(NULL, 4096, PROT_READ, MAP_ANON, -1, 0);    if (opal_mem_hooks_support_level() & OPAL_MEMORY_MMAP_SUPPORT) {        assert(counter >= 1);    }    printf("  - munmap of buffer\n");    /* mmap might call malloc internally, so do this or we might       appear to leak memory */    counter = 1;    munmap(NULL, 0);    assert(counter == 0);    retval = opal_mem_hooks_unregister_release(release_callback);    retval |= opal_mem_hooks_unregister_alloc(alloc_callback);    return OPAL_SUCCESS;}intmain(int argc, char *argv[]){    int ret;    int support;    opal_init();    /* this printf needs to be here for the test to work! */    printf("running malloc hooks test\n");    support = opal_mem_hooks_support_level();    if (0 == support) {        printf("no memory registration supported.  skipping test.\n");        ret = 77;    } else if ((OPAL_MEMORY_FREE_SUPPORT|OPAL_MEMORY_MALLOC_SUPPORT) ==               ((OPAL_MEMORY_FREE_SUPPORT|OPAL_MEMORY_MALLOC_SUPPORT) & support)) {        ret = alloc_free_test();    } else if (OPAL_MEMORY_FREE_SUPPORT & support) {        ret  = free_only_test();    } else {        printf("Odd support response: %d\n", support);        ret = 1;    }    opal_finalize();    return ret;}

⌨️ 快捷键说明

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