Skip to content

Commit 8f57c61

Browse files
fyin1wenlingz
authored andcommitted
dm: Add teardown callback for mevent in uart_core
To avoid the race issue for mevent in uart, we introduce the teardown callback to handle resource free case. Tracked-On: #1877 Signed-off-by: Yin Fengwei <fengwei.yin@intel.com> Acked-by: Yu Wang <yu1.wang@intel.com>
1 parent 72d1fa5 commit 8f57c61

File tree

1 file changed

+27
-16
lines changed

1 file changed

+27
-16
lines changed

devicemodel/hw/uart_core.c

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ struct uart_vdev {
119119
};
120120

121121
static void uart_drain(int fd, enum ev_type ev, void *arg);
122+
static void uart_deinit(struct uart_vdev *uart);
122123

123124
static void
124125
ttyclose(void)
@@ -266,12 +267,34 @@ rxfifo_numchars(struct uart_vdev *uart)
266267
return fifo->num;
267268
}
268269

270+
static void
271+
uart_mevent_teardown(void *param)
272+
{
273+
struct uart_vdev *uart = param;
274+
275+
uart->mev = 0;
276+
ttyclose();
277+
278+
if (uart->tty.fd_in == STDIN_FILENO) {
279+
stdio_in_use = false;
280+
} else {
281+
close(uart->tty.fd_in);
282+
}
283+
284+
uart->tty.fd_in = -1;
285+
uart->tty.fd_out = -1;
286+
uart->tty.opened = false;
287+
288+
uart_deinit(uart);
289+
}
290+
269291
static void
270292
uart_opentty(struct uart_vdev *uart)
271293
{
272294
ttyopen(&uart->tty);
273295
if (isatty(uart->tty.fd_in)) {
274-
uart->mev = mevent_add(uart->tty.fd_in, EVF_READ, uart_drain, uart, NULL, NULL);
296+
uart->mev = mevent_add(uart->tty.fd_in, EVF_READ,
297+
uart_drain, uart, uart_mevent_teardown, uart);
275298
assert(uart->mev != NULL);
276299
}
277300
}
@@ -284,11 +307,10 @@ uart_closetty(struct uart_vdev *uart)
284307
mevent_delete_close(uart->mev);
285308
else
286309
mevent_delete(uart->mev);
287-
288-
uart->mev = 0;
310+
/* uart deinit will be invoked in mevent teardown callback */
311+
} else {
312+
uart_mevent_teardown(uart);
289313
}
290-
291-
ttyclose();
292314
}
293315

294316
static uint8_t
@@ -718,7 +740,6 @@ uart_set_backend(uart_intr_func_t intr_assert, uart_intr_func_t intr_deassert,
718740
goto fail_tty_backend;
719741

720742
uart_opentty(uart);
721-
722743
return uart;
723744

724745
fail_tty_backend:
@@ -749,14 +770,4 @@ uart_release_backend(struct uart_vdev *uart, const char *opts)
749770
return;
750771

751772
uart_closetty(uart);
752-
if (strcmp("stdio", opts) == 0) {
753-
stdio_in_use = false;
754-
} else
755-
close(uart->tty.fd_in);
756-
757-
uart->tty.fd_in = -1;
758-
uart->tty.fd_out = -1;
759-
uart->tty.opened = false;
760-
761-
uart_deinit(uart);
762773
}

0 commit comments

Comments
 (0)