55
66#include " license.hpp"
77
8+ #include " cxxshm.hpp"
89#include < csignal>
910#include < cxxopts.hpp>
1011#include < fcntl.h>
1112#include < filesystem>
1213#include < iostream>
14+ #include < memory>
1315#include < random>
1416#include < sys/mman.h>
1517#include < sys/stat.h>
@@ -81,6 +83,7 @@ int main(int argc, char **argv) {
8183 std::cout << std::endl;
8284 std::cout << " This application uses the following libraries:" << std::endl;
8385 std::cout << " - cxxopts by jarro2783 (https://github.com/jarro2783/cxxopts)" << std::endl;
86+ std::cout << " - cxxshm (https://github.com/NikolasK-source/cxxshm)" << std::endl;
8487 exit (EX_OK );
8588 }
8689
@@ -152,34 +155,20 @@ int main(int argc, char **argv) {
152155 }
153156 }
154157
155- if (signal (SIGINT , sig_term_handler) || signal (SIGTERM , sig_term_handler)) {
158+ if (signal (SIGINT , sig_term_handler) == SIG_ERR || signal (SIGTERM , sig_term_handler) == SIG_ERR ) {
156159 perror (" signal" );
157160 exit (EX_OSERR );
158161 }
159162
160- // open shared memory
161- int fd = shm_open (shm_name.c_str (), O_RDWR , 0660 );
162- if (fd < 0 ) {
163- perror ((" failed to open shared memory '" + shm_name + ' \' ' ).c_str ());
164- exit (EX_OSERR );
165- }
166-
167- // determine size of shared memory
168- struct stat shm_stats {};
169- if (fstat (fd, &shm_stats)) {
170- perror (" fstat" );
171- close (fd);
172- exit (EX_OSERR );
163+ std::unique_ptr<cxxshm::SharedMemory> shm;
164+ try {
165+ shm = std::make_unique<cxxshm::SharedMemory>(shm_name);
166+ } catch (std::exception &e) {
167+ std::cerr << e.what () << std::endl;
168+ return EX_OSERR ;
173169 }
174- const auto SIZE = static_cast <std::size_t >(shm_stats.st_size );
175170
176- // map shared memory
177- void *data = mmap (nullptr , SIZE , PROT_WRITE , MAP_SHARED , fd, 0 );
178- if (data == MAP_FAILED || data == nullptr ) {
179- perror (" mmap" );
180- if (close (fd)) { perror (" close" ); }
181- exit (EX_OSERR );
182- }
171+ const auto SIZE = shm->get_size ();
183172
184173 std::cerr << " Opened shared memory '" << shm_name << " '. Size: " << SIZE << (SIZE != 1 ? " bytes" : " byte" ) << ' .'
185174 << std::endl;
@@ -196,7 +185,7 @@ int main(int argc, char **argv) {
196185 switch (alignment) {
197186 case BYTE :
198187 while (!terminate) {
199- random_data<uint8_t >(data , shm_elements, bitmask);
188+ random_data<uint8_t >(shm-> get_addr () , shm_elements, bitmask);
200189 nanosleep (&sleep_time, nullptr );
201190
202191 if (interval_counter) {
@@ -206,7 +195,7 @@ int main(int argc, char **argv) {
206195 break ;
207196 case WORD :
208197 while (!terminate) {
209- random_data<uint16_t >(data , shm_elements, bitmask);
198+ random_data<uint16_t >(shm-> get_addr () , shm_elements, bitmask);
210199 nanosleep (&sleep_time, nullptr );
211200
212201 if (interval_counter) {
@@ -216,7 +205,7 @@ int main(int argc, char **argv) {
216205 break ;
217206 case DWORD :
218207 while (!terminate) {
219- random_data<uint32_t >(data , shm_elements, bitmask);
208+ random_data<uint32_t >(shm-> get_addr () , shm_elements, bitmask);
220209 nanosleep (&sleep_time, nullptr );
221210
222211 if (interval_counter) {
@@ -226,7 +215,7 @@ int main(int argc, char **argv) {
226215 break ;
227216 case QWORD :
228217 while (!terminate) {
229- random_data<uint64_t >(data , shm_elements, bitmask);
218+ random_data<uint64_t >(shm-> get_addr () , shm_elements, bitmask);
230219 nanosleep (&sleep_time, nullptr );
231220
232221 if (interval_counter) {
@@ -236,9 +225,5 @@ int main(int argc, char **argv) {
236225 break ;
237226 }
238227
239- // clean
240- if (munmap (data, SIZE )) { perror (" munmap" ); }
241- if (close (fd)) { perror (" close" ); }
242-
243228 std::cerr << " Terminating..." << std::endl;
244229}
0 commit comments