@@ -35,71 +35,17 @@ Shm_Mapping::Shm_Mapping(std::size_t nb_bits,
35
35
mapping.nb_registers = static_cast <int >(nb_registers);
36
36
mapping.nb_input_registers = static_cast <int >(nb_input_registers);
37
37
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);
77
43
78
44
// 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 ());
103
49
}
104
50
105
51
} // namespace shm
0 commit comments