YugabyteDB (2.13.0.0-b42, bfc6a6643e7399ac8a0e81d06a3ee6d6571b33ab)

Coverage Report

Created: 2022-03-09 17:30

/Users/deen/code/yugabyte-db/src/yb/util/shared_mem.h
Line
Count
Source
1
// Copyright (c) YugaByte, Inc.
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
4
// in compliance with the License.  You may obtain a copy of the License at
5
//
6
// http://www.apache.org/licenses/LICENSE-2.0
7
//
8
// Unless required by applicable law or agreed to in writing, software distributed under the License
9
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
10
// or implied.  See the License for the specific language governing permissions and limitations
11
// under the License.
12
//
13
14
#ifndef YB_UTIL_SHARED_MEM_H
15
#define YB_UTIL_SHARED_MEM_H
16
17
#include <sys/mman.h>
18
19
#include <glog/logging.h>
20
21
#include "yb/util/result.h"
22
23
namespace yb {
24
25
class SharedMemorySegment {
26
 public:
27
  // Represents a mode of access to shared memory.
28
  enum AccessMode {
29
    kReadOnly = PROT_READ,
30
    kReadWrite = PROT_READ | PROT_WRITE,
31
  };
32
33
  // Creates a new anonymous shared memory segment with the given size.
34
  static Result<SharedMemorySegment> Create(size_t segment_size);
35
36
  // Opens an existing shared memory segment pointed to by a file descriptor.
37
  static Result<SharedMemorySegment> Open(
38
      int fd,
39
      AccessMode access_mode,
40
      size_t segment_size);
41
42
  SharedMemorySegment(SharedMemorySegment&& other);
43
44
  SharedMemorySegment(const SharedMemorySegment& other) = delete;
45
46
  ~SharedMemorySegment();
47
48
  // Returns the address of the start of the shared memory segment.
49
  void* GetAddress() const;
50
51
  // Returns the file descriptor of the shared memory segment.
52
  int GetFd() const;
53
54
 private:
55
  SharedMemorySegment(void* base_address, int fd, size_t segment_size);
56
57
  // The address of the start of the shared memory segment.
58
  void* base_address_;
59
60
  // The file descriptor of the shared memory segment.
61
  int fd_;
62
63
  // The size, in bytes, of the shared memory segment.
64
  size_t segment_size_;
65
};
66
67
// Utility wrapper for sharing object of specified type.
68
template <class Object>
69
class SharedMemoryObject {
70
 public:
71
  SharedMemoryObject(SharedMemoryObject&& rhs)
72
28.0k
      : segment_(std::move(rhs.segment_)), owned_(rhs.owned_) {
73
28.0k
    rhs.owned_ = false;
74
28.0k
  }
_ZN2yb18SharedMemoryObjectINS_4util4DataEEC2EOS3_
Line
Count
Source
72
12
      : segment_(std::move(rhs.segment_)), owned_(rhs.owned_) {
73
12
    rhs.owned_ = false;
74
12
  }
_ZN2yb18SharedMemoryObjectINS_7tserver17TServerSharedDataEEC2EOS3_
Line
Count
Source
72
28.0k
      : segment_(std::move(rhs.segment_)), owned_(rhs.owned_) {
73
28.0k
    rhs.owned_ = false;
74
28.0k
  }
75
76
29.9k
  ~SharedMemoryObject() {
77
29.9k
    if (owned_) {
78
207
      get()->~Object();
79
207
    }
80
29.9k
  }
_ZN2yb18SharedMemoryObjectINS_4util4DataEED2Ev
Line
Count
Source
76
18
  ~SharedMemoryObject() {
77
18
    if (owned_) {
78
3
      get()->~Object();
79
3
    }
80
18
  }
_ZN2yb18SharedMemoryObjectINS_7tserver17TServerSharedDataEED2Ev
Line
Count
Source
76
29.9k
  ~SharedMemoryObject() {
77
29.9k
    if (owned_) {
78
204
      get()->~Object();
79
204
    }
80
29.9k
  }
81
82
  // See SharedMemorySegment::GetFd
83
910
  int GetFd() const {
84
910
    return segment_.GetFd();
85
910
  }
_ZNK2yb18SharedMemoryObjectINS_4util4DataEE5GetFdEv
Line
Count
Source
83
3
  int GetFd() const {
84
3
    return segment_.GetFd();
85
3
  }
_ZNK2yb18SharedMemoryObjectINS_7tserver17TServerSharedDataEE5GetFdEv
Line
Count
Source
83
907
  int GetFd() const {
84
907
    return segment_.GetFd();
85
907
  }
86
87
183k
  Object* get() const {
88
183k
    return static_cast<Object*>(segment_.GetAddress());
89
183k
  }
_ZNK2yb18SharedMemoryObjectINS_4util4DataEE3getEv
Line
Count
Source
87
15
  Object* get() const {
88
15
    return static_cast<Object*>(segment_.GetAddress());
89
15
  }
_ZNK2yb18SharedMemoryObjectINS_7tserver17TServerSharedDataEE3getEv
Line
Count
Source
87
183k
  Object* get() const {
88
183k
    return static_cast<Object*>(segment_.GetAddress());
89
183k
  }
90
91
12
  Object* operator->() const {
92
12
    return get();
93
12
  }
94
95
183k
  Object& operator*() const {
96
183k
    return *get();
97
183k
  }
98
99
  template <class... Args>
100
11.5k
  static Result<SharedMemoryObject> Create(Args&&... args) {
101
11.5k
    return SharedMemoryObject(
102
11.5k
       VERIFY_RESULT(SharedMemorySegment::Create(sizeof(Object))),
103
11.5k
       std::forward<Args>(args)...);
104
11.5k
  }
_ZN2yb18SharedMemoryObjectINS_4util4DataEE6CreateIJEEENS_6ResultIS3_EEDpOT_
Line
Count
Source
100
3
  static Result<SharedMemoryObject> Create(Args&&... args) {
101
3
    return SharedMemoryObject(
102
3
       VERIFY_RESULT(SharedMemorySegment::Create(sizeof(Object))),
103
3
       std::forward<Args>(args)...);
104
3
  }
_ZN2yb18SharedMemoryObjectINS_7tserver17TServerSharedDataEE6CreateIJEEENS_6ResultIS3_EEDpOT_
Line
Count
Source
100
11.5k
  static Result<SharedMemoryObject> Create(Args&&... args) {
101
11.5k
    return SharedMemoryObject(
102
11.5k
       VERIFY_RESULT(SharedMemorySegment::Create(sizeof(Object))),
103
11.5k
       std::forward<Args>(args)...);
104
11.5k
  }
105
106
1.65k
  static Result<SharedMemoryObject> OpenReadOnly(int fd) {
107
1.65k
    return SharedMemoryObject(VERIFY_RESULT(SharedMemorySegment::Open(
108
1.65k
        fd, SharedMemorySegment::AccessMode::kReadOnly, sizeof(Object))), NotOwnedTag());
109
1.65k
  }
_ZN2yb18SharedMemoryObjectINS_4util4DataEE12OpenReadOnlyEi
Line
Count
Source
106
4
  static Result<SharedMemoryObject> OpenReadOnly(int fd) {
107
3
    return SharedMemoryObject(VERIFY_RESULT(SharedMemorySegment::Open(
108
3
        fd, SharedMemorySegment::AccessMode::kReadOnly, sizeof(Object))), NotOwnedTag());
109
4
  }
_ZN2yb18SharedMemoryObjectINS_7tserver17TServerSharedDataEE12OpenReadOnlyEi
Line
Count
Source
106
1.65k
  static Result<SharedMemoryObject> OpenReadOnly(int fd) {
107
1.65k
    return SharedMemoryObject(VERIFY_RESULT(SharedMemorySegment::Open(
108
1.65k
        fd, SharedMemorySegment::AccessMode::kReadOnly, sizeof(Object))), NotOwnedTag());
109
1.65k
  }
110
111
  static Result<SharedMemoryObject> OpenReadWrite(int fd) {
112
    return SharedMemoryObject(VERIFY_RESULT(SharedMemorySegment::Open(
113
        fd, SharedMemorySegment::AccessMode::kReadWrite, sizeof(Object))), NotOwnedTag());
114
  }
115
116
 private:
117
  template <class... Args>
118
  explicit SharedMemoryObject(SharedMemorySegment&& segment, Args&&... args)
119
11.5k
      : segment_(std::move(segment)), owned_(true) {
120
11.5k
    new (DCHECK_NOTNULL(segment_.GetAddress())) Object(std::forward<Args>(args)...);
121
11.5k
  }
_ZN2yb18SharedMemoryObjectINS_4util4DataEEC2IJEEEONS_19SharedMemorySegmentEDpOT_
Line
Count
Source
119
3
      : segment_(std::move(segment)), owned_(true) {
120
3
    new (DCHECK_NOTNULL(segment_.GetAddress())) Object(std::forward<Args>(args)...);
121
3
  }
_ZN2yb18SharedMemoryObjectINS_7tserver17TServerSharedDataEEC2IJEEEONS_19SharedMemorySegmentEDpOT_
Line
Count
Source
119
11.5k
      : segment_(std::move(segment)), owned_(true) {
120
11.5k
    new (DCHECK_NOTNULL(segment_.GetAddress())) Object(std::forward<Args>(args)...);
121
11.5k
  }
122
123
  class NotOwnedTag {};
124
125
  explicit SharedMemoryObject(SharedMemorySegment&& segment, NotOwnedTag tag)
126
1.65k
      : segment_(std::move(segment)), owned_(false) {
127
1.65k
  }
_ZN2yb18SharedMemoryObjectINS_4util4DataEEC2EONS_19SharedMemorySegmentENS3_11NotOwnedTagE
Line
Count
Source
126
3
      : segment_(std::move(segment)), owned_(false) {
127
3
  }
_ZN2yb18SharedMemoryObjectINS_7tserver17TServerSharedDataEEC2EONS_19SharedMemorySegmentENS3_11NotOwnedTagE
Line
Count
Source
126
1.65k
      : segment_(std::move(segment)), owned_(false) {
127
1.65k
  }
128
129
  SharedMemorySegment segment_;
130
  bool owned_;
131
};
132
133
}  // namespace yb
134
135
#endif // YB_UTIL_SHARED_MEM_H