@@ -141,22 +141,11 @@ static modbus_t *create_ctx(const char *url)
141
141
}
142
142
}
143
143
144
- static void destroy_ctx (modbus_t * ctx )
145
- {
146
- modbus_close (ctx );
147
- modbus_free (ctx );
148
- }
149
-
150
144
static void on_disconnected (struct l_io * io , void * user_data )
151
145
{
152
- modbus_close (modbus_ctx );
153
-
154
146
if (disconn_cb )
155
147
disconn_cb (user_data );
156
148
157
- l_io_destroy (modbus_io );
158
- modbus_io = NULL ;
159
-
160
149
if (connect_to )
161
150
l_timeout_modify (connect_to , RECONNECT_TIMEOUT );
162
151
}
@@ -165,20 +154,44 @@ static void attempt_connect(struct l_timeout *to, void *user_data)
165
154
{
166
155
l_debug ("Trying to connect to Modbus" );
167
156
157
+ /* Check and close if a connection is already up */
158
+ if (modbus_get_socket (modbus_ctx ) != -1 )
159
+ modbus_close (modbus_ctx );
160
+
161
+ /* Check and destroy if an IO is already allocated */
162
+ if (modbus_io ) {
163
+ l_io_destroy (modbus_io );
164
+ modbus_io = NULL ;
165
+ }
166
+
168
167
if (modbus_connect (modbus_ctx ) < 0 ) {
169
168
l_error ("error connecting to Modbus: %s" ,
170
169
modbus_strerror (errno ));
171
- l_timeout_modify (to , RECONNECT_TIMEOUT );
172
- return ;
170
+ goto retry ;
173
171
}
174
172
175
173
modbus_io = l_io_new (modbus_get_socket (modbus_ctx ));
174
+ if (!modbus_io )
175
+ goto connection_close ;
176
+
176
177
if (!l_io_set_disconnect_handler (modbus_io , on_disconnected , NULL ,
177
- NULL ))
178
+ NULL )) {
178
179
l_error ("Couldn't set Modbus disconnect handler" );
180
+ goto io_destroy ;
181
+ }
179
182
180
183
if (conn_cb )
181
184
conn_cb (user_data );
185
+
186
+ return ;
187
+
188
+ io_destroy :
189
+ l_io_destroy (modbus_io );
190
+ modbus_io = NULL ;
191
+ connection_close :
192
+ modbus_close (modbus_ctx );
193
+ retry :
194
+ l_timeout_modify (to , RECONNECT_TIMEOUT );
182
195
}
183
196
184
197
int iface_modbus_read_data (int reg_addr , int bit_offset , knot_value_type * out )
@@ -257,5 +270,8 @@ void iface_modbus_stop(void)
257
270
connect_to = NULL ;
258
271
259
272
l_io_destroy (modbus_io );
260
- destroy_ctx (modbus_ctx );
273
+ modbus_io = NULL ;
274
+
275
+ modbus_close (modbus_ctx );
276
+ modbus_free (modbus_ctx );
261
277
}
0 commit comments