folly/experimental/hazptr: fix gcc 5 build
[folly.git] / folly / experimental / hazptr / memory_resource.h
1 /*
2  * Copyright 2016 Facebook, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #pragma once
17
18 ////////////////////////////////////////////////////////////////////////////////
19 /// Disclaimer: This is intended only as a partial stand-in for
20 /// std::pmr::memory_resource (C++17) as needed for developing a
21 /// hazptr prototype.
22 ////////////////////////////////////////////////////////////////////////////////
23 #include <cstddef>
24 #include <memory>
25
26 namespace folly {
27 namespace hazptr {
28
29 class memory_resource {
30  public:
31   virtual ~memory_resource() = default;
32   virtual void* allocate(
33       const size_t bytes,
34       const size_t alignment = alignof(std::max_align_t)) = 0;
35   virtual void deallocate(
36       void* p,
37       const size_t bytes,
38       const size_t alignment = alignof(std::max_align_t)) = 0;
39 };
40
41 memory_resource* get_default_resource();
42 void set_default_resource(memory_resource*);
43 memory_resource* new_delete_resource();
44
45 ////////////////////////////////////////////////////////////////////////////////
46 /// Implementation
47 ////////////////////////////////////////////////////////////////////////////////
48 #include <folly/experimental/hazptr/debug.h>
49
50 inline memory_resource** default_mr_ptr() {
51   static memory_resource* default_mr = new_delete_resource();
52   DEBUG_PRINT(&default_mr << " " << default_mr);
53   return &default_mr;
54 }
55
56 inline memory_resource* get_default_resource() {
57   DEBUG_PRINT("");
58   return *default_mr_ptr();
59 }
60
61 inline void set_default_resource(memory_resource* mr) {
62   DEBUG_PRINT("");
63   *default_mr_ptr() = mr;
64 }
65
66 inline memory_resource* new_delete_resource() {
67   class new_delete : public memory_resource {
68    public:
69     void* allocate(
70         const size_t bytes,
71         const size_t alignment = alignof(std::max_align_t)) {
72       (void)alignment;
73       void* p = static_cast<void*>(new char[bytes]);
74       DEBUG_PRINT(this << " " << p << " " << bytes);
75       return p;
76     }
77     void deallocate(
78         void* p,
79         const size_t bytes,
80         const size_t alignment = alignof(std::max_align_t)) {
81       (void)alignment;
82       (void)bytes;
83       DEBUG_PRINT(p << " " << bytes);
84       delete[] static_cast<char*>(p);
85     }
86   };
87   static new_delete mr;
88   return &mr;
89 }
90
91 } // namespace folly {
92 } // namespace hazptr {