1/*
2 * PtrMemory.hpp
3 *
4 * Created on: Apr 15, 2015
5 * Author: Pietro Incardona
6 */
7
8#ifndef PTRMEMORY_HPP_
9#define PTRMEMORY_HPP_
10
11
12/**
13 * \brief This class give memory from a preallocated memory, memory destruction is not performed
14 *
15 * Useful to shape pieces of memory
16 *
17 * Usage:
18 *
19 * void * ptr = new int[1000]
20 *
21 * PtrMemory m = new PtrMemory(ptr,1000);
22 *
23 * m.allocate();
24 * int * ptr = m.getPointer();
25 * *ptr[999] = 1000;
26 * ....
27 *
28 * delete[] ptr;
29 *
30 */
31
32#include "config.h"
33#include "memory.hpp"
34#include <cstddef>
35#include <cstdint>
36#include <iostream>
37
38
39class PtrMemory : public memory
40{
41 //! Size of the pointed memory
42 size_t spm;
43
44 //! Pointed memory
45 void * dm;
46
47 //! Reference counter
48 long int ref_cnt;
49
50 //! copy from Pointer to Heap
51 bool copyFromPointer(const void * ptr, size_t sz);
52
53 //! Set alignment the memory will be aligned with this number
54 void setAlignment(size_t align);
55
56public:
57
58 //! copy from same Heap to Heap
59 bool copyDeviceToDevice(const PtrMemory & m);
60
61 //! flush the memory
62 virtual bool flush() {return true;};
63 //! allocate memory
64 virtual bool allocate(size_t sz);
65 //! destroy memory
66 virtual void destroy();
67 //! copy memory
68 virtual bool copy(const memory & m);
69 //! the the size of the allocated memory
70 virtual size_t size() const;
71 //! resize the memory allocated
72 virtual bool resize(size_t sz);
73 //! get a readable pointer with the data
74 virtual void * getPointer();
75
76 //! get a readable pointer with the data
77 virtual const void * getPointer() const;
78
79 //! get a readable pointer with the data
80 virtual void * getDevicePointer();
81
82
83 //! Do nothing
84 virtual void deviceToHost(){};
85
86 //! Do nothing
87 virtual void hostToDevice(){};
88
89 //! Do nothing
90 virtual void deviceToHost(size_t start, size_t stop) {};
91
92 //! Do nothing
93 virtual void hostToDevice(size_t start, size_t top) {};
94
95 /*! \brief fill memory with the selected byte
96 *
97 *
98 */
99 virtual void fill(unsigned char c);
100
101 //! Increment the reference counter
102 virtual void incRef()
103 {ref_cnt++;}
104
105 //! Decrement the reference counter
106 virtual void decRef()
107 {ref_cnt--;}
108
109 //! Return the reference counter
110 virtual long int ref()
111 {
112 return ref_cnt;
113 }
114
115 /*! \brief Return true if the device and the host pointer are the same
116 *
117 * \return true if they are the same
118 *
119 */
120 static bool isDeviceHostSame()
121 {
122 return true;
123 }
124
125 /*! \brief Allocated Memory is already initialized
126 *
127 * \return true
128 *
129 */
130 bool isInitialized()
131 {
132 return true;
133 }
134
135 // Default constructor
136 PtrMemory():spm(0),dm(NULL),ref_cnt(0)
137 {
138 };
139
140 //! Constructor, we choose a default alignment of 32 for avx
141 PtrMemory(void * ptr, size_t sz):spm(sz),dm(ptr),ref_cnt(0)
142 {
143 };
144
145 ~PtrMemory()
146 {
147 if(ref_cnt == 0)
148 destroy();
149 else
150 std::cerr << "Error: " << __FILE__ << " " << __LINE__ << " destroying a live object" << "\n";
151 };
152};
153
154
155#endif /* PTRMEMORY_HPP_ */
156