@@ -35,71 +35,17 @@ Shm_Mapping::Shm_Mapping(std::size_t nb_bits,
3535 mapping.nb_registers = static_cast <int >(nb_registers);
3636 mapping.nb_input_registers = static_cast <int >(nb_input_registers);
3737
38- // calculate shm object size
39- shm_data[DO].size = nb_bits;
40- shm_data[DI].size = nb_input_bits;
41- shm_data[AO].size = nb_registers * 2 ;
42- shm_data[AI].size = nb_input_registers * 2 ;
43-
44- // create shm object names
45- shm_data[DO].name = prefix + " DO" ;
46- shm_data[DI].name = prefix + " DI" ;
47- shm_data[AO].name = prefix + " AO" ;
48- shm_data[AI].name = prefix + " AI" ;
49-
50- // create and map shm objects
51- for (std::size_t i = 0 ; i < reg_index_t ::REG_COUNT; ++i) {
52- auto &shm = shm_data[i];
53-
54- int flags = O_RDWR | O_CREAT;
55- if (!force) flags |= O_EXCL;
56-
57- // create shm object
58- shm.fd = shm_open (shm.name .c_str (), flags, 0660 );
59- if (shm.fd < 0 ) {
60- throw std::system_error (
61- errno, std::generic_category (), " Failed to create shared memory '" + shm.name + ' \' ' );
62- }
63-
64- // set size of shm object
65- if (ftruncate (shm.fd , static_cast <__off_t >(shm.size ))) {
66- throw std::system_error (
67- errno, std::generic_category (), " Failed to resize shared memory '" + shm.name + ' \' ' );
68- }
69-
70- // map shm object
71- shm.addr = mmap (nullptr , shm.size , PROT_WRITE | PROT_READ, MAP_SHARED, shm.fd , 0 );
72- if (shm.addr == nullptr && shm.addr == MAP_FAILED) {
73- shm.addr = nullptr ;
74- throw std::system_error (errno, std::generic_category (), " Failed to map shared memory '" + shm.name + ' \' ' );
75- }
76- }
38+ // create shm objects
39+ shm_data[DO] = std::make_unique<cxxshm::SharedMemory>(prefix + " DO" , nb_bits, false , !force);
40+ shm_data[DI] = std::make_unique<cxxshm::SharedMemory>(prefix + " DI" , nb_input_bits, false , !force);
41+ shm_data[AO] = std::make_unique<cxxshm::SharedMemory>(prefix + " AO" , 2 * nb_registers, false , !force);
42+ shm_data[AI] = std::make_unique<cxxshm::SharedMemory>(prefix + " AI" , nb_input_registers, false , !force);
7743
7844 // set shm objects as modbus register storage
79- mapping.tab_bits = static_cast <uint8_t *>(shm_data[DO].addr );
80- mapping.tab_input_bits = static_cast <uint8_t *>(shm_data[DI].addr );
81- mapping.tab_registers = static_cast <uint16_t *>(shm_data[AO].addr );
82- mapping.tab_input_registers = static_cast <uint16_t *>(shm_data[AI].addr );
83- }
84-
85- Shm_Mapping::~Shm_Mapping () {
86- // unmap and delete shm objects
87- for (std::size_t i = 0 ; i < reg_index_t ::REG_COUNT; ++i) {
88- auto &shm = shm_data[i];
89- if (shm.addr ) {
90- if (munmap (shm.addr , shm.size )) { perror ((" Failed to unmap shared memory '" + shm.name + ' \' ' ).c_str ()); }
91- }
92-
93- if (shm.fd != -1 ) {
94- if (close (shm.fd )) {
95- perror ((" Failed to close shared memory file descriptor '" + shm.name + ' \' ' ).c_str ());
96- }
97-
98- if (shm_unlink (shm.name .c_str ())) {
99- perror ((" Failed to unlink shared memory '" + shm.name + ' \' ' ).c_str ());
100- }
101- }
102- }
45+ mapping.tab_bits = static_cast <uint8_t *>(shm_data[DO]->get_addr ());
46+ mapping.tab_input_bits = static_cast <uint8_t *>(shm_data[DI]->get_addr ());
47+ mapping.tab_registers = static_cast <uint16_t *>(shm_data[AO]->get_addr ());
48+ mapping.tab_input_registers = static_cast <uint16_t *>(shm_data[AI]->get_addr ());
10349}
10450
10551} // namespace shm
0 commit comments