Skip to content

Commit a8fe08c

Browse files
committed
Fix event callback on shutdown (closes #2869)
1 parent ce30ff8 commit a8fe08c

File tree

2 files changed

+20
-0
lines changed

2 files changed

+20
-0
lines changed

src/r_api.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,9 +209,11 @@ void r_free_cfg(r_cfg_t *cfg)
209209
if (cfg->dev) {
210210
sdr_deactivate(cfg->dev);
211211
sdr_close(cfg->dev);
212+
cfg->dev = NULL;
212213
}
213214

214215
free(cfg->gain_str);
216+
cfg->gain_str = NULL;
215217

216218
for (void **iter = cfg->demod->dumper.elems; iter && *iter; ++iter) {
217219
file_info_t const *dumper = *iter;
@@ -224,8 +226,10 @@ void r_free_cfg(r_cfg_t *cfg)
224226

225227
if (cfg->demod->am_analyze)
226228
am_analyze_free(cfg->demod->am_analyze);
229+
cfg->demod->am_analyze = NULL;
227230

228231
pulse_detect_free(cfg->demod->pulse_detect);
232+
cfg->demod->pulse_detect = NULL;
229233

230234
list_free_elems(&cfg->raw_handler, (list_elem_free_fn)raw_output_free);
231235

@@ -238,11 +242,14 @@ void r_free_cfg(r_cfg_t *cfg)
238242
list_free_elems(&cfg->in_files, NULL);
239243

240244
free(cfg->demod);
245+
cfg->demod = NULL;
241246

242247
free(cfg->devices);
248+
cfg->devices = NULL;
243249

244250
mg_mgr_free(cfg->mgr);
245251
free(cfg->mgr);
252+
cfg->mgr = NULL;
246253

247254
//free(cfg);
248255
}

src/rtl_433.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,11 @@ static void sdr_callback(unsigned char *iq_buf, uint32_t len, void *ctx)
394394
char time_str[LOCAL_TIME_BUFLEN];
395395
unsigned long n_samples;
396396

397+
if (!demod) {
398+
// might happen when the demod closed and we get a last data frame
399+
return; // ignore the data
400+
}
401+
397402
// do this here and not in sdr_handler so realtime replay can use rtl_tcp output
398403
for (void **iter = cfg->raw_handler.elems; iter && *iter; ++iter) {
399404
raw_output_t *output = *iter;
@@ -1367,6 +1372,7 @@ static void sighandler(int signum)
13671372
}
13681373
#endif
13691374

1375+
// NOTE: this handler might be called while already in `r_free_cfg()`.
13701376
static void sdr_handler(struct mg_connection *nc, int ev_type, void *ev_data)
13711377
{
13721378
//fprintf(stderr, "%s: %d, %d, %p, %p\n", __func__, nc->sock, ev_type, nc->user_data, ev_data);
@@ -1441,6 +1447,13 @@ static void acquire_callback(sdr_event_t *ev, void *ctx)
14411447
static int start_sdr(r_cfg_t *cfg)
14421448
{
14431449
int r;
1450+
if (cfg->dev) {
1451+
r = sdr_close(cfg->dev);
1452+
cfg->dev = NULL;
1453+
if (r < 0) {
1454+
print_logf(LOG_ERROR, "Input", "Closing SDR failed (%d)", r);
1455+
}
1456+
}
14441457
r = sdr_open(&cfg->dev, cfg->dev_query, cfg->verbosity);
14451458
if (r < 0) {
14461459
return -1; // exit(2);

0 commit comments

Comments
 (0)