-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmemory.cpp
More file actions
66 lines (54 loc) · 1.23 KB
/
memory.cpp
File metadata and controls
66 lines (54 loc) · 1.23 KB
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
60
61
62
63
64
65
66
// Copyright 2015 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
#ifdef _WIN32
#include <malloc.h>
#else
#include <sys/mman.h>
#include <cstdlib>
#endif
#include "logging.h"
#include "memory.h"
namespace prt {
void* alignedAlloc(size_t size, size_t alignment)
{
void* ptr;
if (alignment == 0)
alignment = size < pageSize ? cacheLineSize : pageSize;
#if defined(_MSC_VER)
ptr = _aligned_malloc(size, alignment);
#elif defined(__INTEL_COMPILER)
ptr = _mm_malloc(size, alignment);
#else
if (posix_memalign(&ptr, max(alignment, sizeof(void*)), size) != 0) {
ptr = 0;
}
#endif
if (ptr == 0)
LogError() << "alignedAlloc failed (size=" << size << ", alignment=" << alignment << ")";
return ptr;
}
void alignedFree(void* ptr)
{
#if defined(_MSC_VER)
_aligned_free(ptr);
#elif defined(__INTEL_COMPILER)
_mm_free(ptr);
#else
free(ptr);
#endif
}
Stream& operator >>(Stream& ism, Memory& mem)
{
size_t size;
ism >> size;
mem.alloc(size);
ism.readFull(mem.getData(), size);
return ism;
}
Stream& operator <<(Stream& osm, const Memory& mem)
{
osm << mem.getSize();
osm.write(mem.getData(), mem.getSize());
return osm;
}
} // namespace prt