@@ -119,6 +119,7 @@ struct uart_vdev {
119
119
};
120
120
121
121
static void uart_drain (int fd , enum ev_type ev , void * arg );
122
+ static void uart_deinit (struct uart_vdev * uart );
122
123
123
124
static void
124
125
ttyclose (void )
@@ -266,12 +267,34 @@ rxfifo_numchars(struct uart_vdev *uart)
266
267
return fifo -> num ;
267
268
}
268
269
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
+
269
291
static void
270
292
uart_opentty (struct uart_vdev * uart )
271
293
{
272
294
ttyopen (& uart -> tty );
273
295
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 );
275
298
assert (uart -> mev != NULL );
276
299
}
277
300
}
@@ -284,11 +307,10 @@ uart_closetty(struct uart_vdev *uart)
284
307
mevent_delete_close (uart -> mev );
285
308
else
286
309
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 );
289
313
}
290
-
291
- ttyclose ();
292
314
}
293
315
294
316
static uint8_t
@@ -718,7 +740,6 @@ uart_set_backend(uart_intr_func_t intr_assert, uart_intr_func_t intr_deassert,
718
740
goto fail_tty_backend ;
719
741
720
742
uart_opentty (uart );
721
-
722
743
return uart ;
723
744
724
745
fail_tty_backend :
@@ -749,14 +770,4 @@ uart_release_backend(struct uart_vdev *uart, const char *opts)
749
770
return ;
750
771
751
772
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 );
762
773
}
0 commit comments