File: memory_manager.h

package info (click to toggle)
memkind 1.14.0-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 8,508 kB
  • sloc: ansic: 72,572; cpp: 39,493; sh: 4,594; perl: 4,250; xml: 2,044; python: 1,753; makefile: 1,393; csh: 7
file content (59 lines) | stat: -rw-r--r-- 1,214 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// SPDX-License-Identifier: BSD-2-Clause
/* Copyright (C) 2017 - 2021 Intel Corporation. */

#pragma once
#include <memkind.h>
#include <new>

class MemoryManager
{
private:
    memkind_t kind;
    size_t memory_size;
    void *memory_pointer;

    void move(MemoryManager &&other)
    {
        kind = other.kind;
        memory_size = other.memory_size;
        if (memory_pointer)
            memkind_free(kind, memory_pointer);
        memory_pointer = std::move(other.memory_pointer);
        other.memory_pointer = nullptr;
    }

public:
    MemoryManager(memkind_t kind, size_t size)
        : kind(kind),
          memory_size(size),
          memory_pointer(memkind_malloc(kind, size))
    {
        if (!memory_pointer) {
            throw std::bad_alloc();
        }
    }

    size_t size()
    {
        return memory_size;
    }

    MemoryManager(const MemoryManager &) = delete;

    MemoryManager(MemoryManager &&other)
    {
        move(std::move(other));
    }

    MemoryManager &operator=(MemoryManager &&other)
    {
        move(std::move(other));
        return *this;
    }

    ~MemoryManager()
    {
        if (memory_pointer)
            memkind_free(kind, memory_pointer);
    }
};