2017
[folly.git] / folly / experimental / hazptr / memory_resource.h
1 /*
2  * Copyright 2017 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   /* library-local */ static memory_resource* default_mr =
52       new_delete_resource();
53   DEBUG_PRINT(&default_mr << " " << default_mr);
54   return &default_mr;
55 }
56
57 inline memory_resource* get_default_resource() {
58   DEBUG_PRINT("");
59   return *default_mr_ptr();
60 }
61
62 inline void set_default_resource(memory_resource* mr) {
63   DEBUG_PRINT("");
64   *default_mr_ptr() = mr;
65 }
66
67 inline memory_resource* new_delete_resource() {
68   class new_delete : public memory_resource {
69    public:
70     void* allocate(
71         const size_t bytes,
72         const size_t alignment = alignof(std::max_align_t)) {
73       (void)alignment;
74       void* p = static_cast<void*>(new char[bytes]);
75       DEBUG_PRINT(this << " " << p << " " << bytes);
76       return p;
77     }
78     void deallocate(
79         void* p,
80         const size_t bytes,
81         const size_t alignment = alignof(std::max_align_t)) {
82       (void)alignment;
83       (void)bytes;
84       DEBUG_PRINT(p << " " << bytes);
85       delete[] static_cast<char*>(p);
86     }
87   };
88   static new_delete mr;
89   return &mr;
90 }
91
92 } // namespace folly {
93 } // namespace hazptr {