ARCS6 AR6-REV.24062600
読み取り中…
検索中…
一致する文字列を見つけられません
SharedMemory.hh
[詳解]
1
8//
9// Copyright (C) 2011-2024 Yokokura, Yuki
10// This program is free software;
11// you can redistribute it and/or modify it under the terms of the FreeBSD License.
12// For details, see the License.txt file.
13
14#ifndef SHAREDMEMORY
15#define SHAREDMEMORY
16
17#include <sys/types.h>
18#include <sys/mman.h>
19#include <sys/stat.h>
20#include <unistd.h>
21#include <fcntl.h>
22#include <cassert>
23#include <cstdint>
24#include <cstring>
25#include <array>
26#include <string>
27
28// ARCS組込み用マクロ
29#ifdef ARCS_IN
30 // ARCSに組み込まれる場合
31 #include "ARCSassert.hh"
32 #include "ARCSeventlog.hh"
33#else
34 // ARCSに組み込まれない場合
35 #define arcs_assert(a) (assert(a))
36 #define PassedLog()
37 #define EventLog(a)
38 #define EventLogVar(a)
39#endif
40
41namespace ARCS { // ARCS名前空間
42
44enum class ShMemSide {
45 SHM_HOST,
47};
48
50enum class ShMemMode {
54};
55
61template <typename T, size_t S, ShMemSide W, ShMemMode M>
63 public:
66 : ShMem(nullptr), ShMemName()
67 {
68 // 何もしない
69 }
70
72 SharedMemory(const std::string Name)
73 : ShMem(nullptr), ShMemName(Name)
74 {
75 Create(Name); // 共有メモリを生成
76 }
77
81 : ShMem(nullptr), ShMemName(r.ShMemName)
82 {
83
84 }
85
88 Release(); // 共有メモリを解放
89 }
90
92 void Create(const std::string Name){
93 ShMemName = Name; // /dev/shmファイル名
94 mode_t OpenMode; // /dev/shmファイルのモード
95 int MmapMode; // 共有メモリマッピングのモード
96
97 // モード設定のチェック: ホスト側で尚且つリードオンリーはできない
98 if constexpr( W == ShMemSide::SHM_HOST && M == ShMemMode::SHM_RDONLY ) assert(false);
99
100 // /dev/shmファイルのモード設定
101 if constexpr(W == ShMemSide::SHM_HOST){
102 OpenMode = O_CREAT | O_TRUNC;
103 }else if constexpr(W == ShMemSide::SHM_CLIENT){
104 OpenMode = static_cast<mode_t>(0);
105 }else{
106 assert(false); // ここには来ない
107 }
108
109 // /dev/shmファイルと共有メモリマッピングのモード設定
110 if constexpr (M == ShMemMode::SHM_RDONLY){
111 OpenMode |= O_RDONLY;
112 MmapMode = PROT_READ;
113 }else if constexpr(M == ShMemMode::SHM_WRONLY){
114 OpenMode |= O_RDWR; // ← RDWRにしておかないとMAP_FAILEDが起きる
115 MmapMode = PROT_WRITE;
116 }else if constexpr(M == ShMemMode::SHM_RDWR){
117 OpenMode |= O_RDWR;
118 MmapMode = PROT_READ | PROT_WRITE;
119 }else{
120 assert(false); // ここには来ない
121 }
122
123 // POSIX共有メモリファイルの生成
124 int fd = shm_open(ShMemName.c_str(), OpenMode, S_IRUSR | S_IWUSR);
125 assert(fd != -1);
126
127 // POSIX共有メモリファイルのサイズ指定
128 if constexpr(W == ShMemSide::SHM_HOST){
129 ftruncate(fd, sizeof(T)*S); // ホスト側のときのみ実行
130 }
131
132 // POSIX共有メモリのマッピング
133 ShMem = static_cast<T*>( mmap(nullptr, sizeof(T)*S, MmapMode, MAP_SHARED, fd, 0) );
134 assert(ShMem != MAP_FAILED);
135
136 // メモリの初期化
137 if constexpr(M == ShMemMode::SHM_WRONLY || M == ShMemMode::SHM_RDWR){
138 // 書き込みできるモードのときはゼロ埋め
139 memset(ShMem, 0, sizeof(T)*S);
140 }
141 }
142
144 void Release(void){
145 // 共有メモリを解放
146 int res = munmap(ShMem, sizeof(T)*S);
147 assert(res != -1);
148
149 // ホスト側の場合にはファイルを削除
150 if constexpr(W == ShMemSide::SHM_HOST){
151 int fd = shm_unlink(ShMemName.c_str());
152 assert(fd != -1);
153 }
154 }
155
157 void DispAddress(void){
158 printf("ShMem Addr = 0x%zu\n", (size_t)&ShMem);
159 }
160
163 T Read(const size_t i) const{
164 return ShMem[i];
165 }
166
170 void Write(const size_t i, const T val){
171 ShMem[i] = val;
172 }
173
174 private:
175 SharedMemory(const SharedMemory&) = delete;
176 const SharedMemory& operator=(const SharedMemory&) = delete;
177 T* ShMem; // 共有メモリの実体
178 std::string ShMemName; // 共有メモリの名前
179};
180}
181
182#endif
183
ARCS イベントログクラス
ARCS用ASSERTクラス
ShMemMode
共有メモリのモード設定
Definition SharedMemory.hh:50
@ SHM_WRONLY
書き込みのみモード
@ SHM_RDWR
読み書き両方モード
@ SHM_RDONLY
読み込みのみモード
ShMemSide
共有メモリのホスト側/クライアント側モード設定
Definition SharedMemory.hh:44
@ SHM_HOST
ホスト側モード
@ SHM_CLIENT
クライアント側モード
共有メモリクラス
Definition SharedMemory.hh:62
void Create(const std::string Name)
共有メモリを生成する関数
Definition SharedMemory.hh:92
SharedMemory(void)
空コンストラクタ
Definition SharedMemory.hh:65
void Release(void)
共有メモリを解放する関数
Definition SharedMemory.hh:144
T Read(const size_t i) const
メモリから読み込む関数
Definition SharedMemory.hh:163
SharedMemory(const std::string Name)
コンストラクタ
Definition SharedMemory.hh:72
void DispAddress(void)
先頭アドレスを表示する関数
Definition SharedMemory.hh:157
SharedMemory(SharedMemory &&r)
ムーブコンストラクタ
Definition SharedMemory.hh:80
void Write(const size_t i, const T val)
メモリに書き込む関数
Definition SharedMemory.hh:170
~SharedMemory()
デストラクタ
Definition SharedMemory.hh:87