Program Listing for File xallocator.h

Return to documentation for file (core/include/utils/blockAllocator/xallocator.h)

//==================================================================================
// BSD 2-Clause License
//
// Copyright (c) 2014-2022, NJIT, Duality Technologies Inc. and other contributors
//
// All rights reserved.
//
// Author TPOC: contact@openfhe.org
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this
//    list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
//    this list of conditions and the following disclaimer in the documentation
//    and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//==================================================================================

#ifndef _XALLOCATOR_H
#define _XALLOCATOR_H

#include <stddef.h>
#include "utils/inttypes.h"

// See
// http://www.codeproject.com/Articles/1084801/Replace-malloc-free-with-a-Fast-Fixed-Block-Memory

#ifdef __cplusplus
    // Define AUTOMATIC_XALLOCATOR_INIT_DESTROY to automatically call
    // xalloc_init() and xalloc_destroy() when using xallocator in C++
    // projects. On embedded systems that never exit, you can save 1-byte
    // of RAM storage per translation unit by undefining
    // AUTOMATIC_XALLOCATOR_INIT_DESTROY and calling xalloc_init()
    // manually before the OS starts.
    #define AUTOMATIC_XALLOCATOR_INIT_DESTROY
    #ifdef AUTOMATIC_XALLOCATOR_INIT_DESTROY
class XallocInitDestroy {
public:
    XallocInitDestroy();
    ~XallocInitDestroy();

private:
    static usint refCount;
};
    #endif  // AUTOMATIC_XALLOCATOR_INIT_DESTROY
#endif      // __cplusplus

#ifdef __cplusplus
extern "C" {
#endif

void xalloc_init();

void xalloc_destroy();

void* xmalloc(size_t size);

void xfree(void* ptr);

void* xrealloc(void* ptr, size_t size);

void xalloc_stats();

// Macro to overload new/delete with xalloc/xfree
#define XALLOCATOR                        \
public:                                   \
    void* operator new(size_t size) {     \
        return xmalloc(size);             \
    }                                     \
    void operator delete(void* pObject) { \
        xfree(pObject);                   \
    }

#ifdef __cplusplus
}
#endif

#endif