diff options
author | Dan Williams <dcbw@redhat.com> | 2014-10-07 15:53:53 -0500 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2014-10-07 16:01:54 -0500 |
commit | 41b7e7b048e67a0b329c820c81beccf42bf0957e (patch) | |
tree | c330a18bc14728da5f274c6cb0c6c6ce318fa402 | |
parent | 1e5ec7e1b147fc6dd2227d7ebf7510a96eb0503e (diff) |
port-serial: fix forced closing after b28230411
b28230411 moved up the self->priv->forced_close = TRUE, which
caused mm_port_serial_close() to just return without actually
closing the port and cleaning up.
Also, cancel the reopen separately from closing the port since
the two operations are actually independent of each other.
-rw-r--r-- | src/mm-port-serial.c | 43 |
1 files changed, 23 insertions, 20 deletions
diff --git a/src/mm-port-serial.c b/src/mm-port-serial.c index 9b749004..3af1b8e2 100644 --- a/src/mm-port-serial.c +++ b/src/mm-port-serial.c @@ -1274,25 +1274,23 @@ mm_port_serial_is_open (MMPortSerial *self) return !!self->priv->open_count; } -void -mm_port_serial_close (MMPortSerial *self) +static void +_close_internal (MMPortSerial *self, gboolean force) { const char *device; int i; g_return_if_fail (MM_IS_PORT_SERIAL (self)); - /* If we forced closing the port, open_count will be 0 already. - * Just return without issuing any warning */ - if (self->priv->forced_close) - return; - - g_return_if_fail (self->priv->open_count > 0); + if (force) + self->priv->open_count = 0; + else { + g_return_if_fail (self->priv->open_count > 0); + self->priv->open_count--; + } device = mm_port_get_device (MM_PORT (self)); - self->priv->open_count--; - mm_dbg ("(%s) device open count is %d (close)", device, self->priv->open_count); if (self->priv->open_count > 0) @@ -1402,10 +1400,18 @@ mm_port_serial_close (MMPortSerial *self) g_clear_object (&self->priv->cancellable); } +void +mm_port_serial_close (MMPortSerial *self) +{ + g_return_if_fail (MM_IS_PORT_SERIAL (self)); + + if (!self->priv->forced_close) + _close_internal (self, FALSE); +} + static void port_serial_close_force (MMPortSerial *self) { - g_return_if_fail (self != NULL); g_return_if_fail (MM_IS_PORT_SERIAL (self)); /* If already forced to close, return */ @@ -1418,19 +1424,16 @@ port_serial_close_force (MMPortSerial *self) * open counts */ self->priv->forced_close = TRUE; - /* If already closed, done */ - if (!self->priv->open_count && !self->priv->reopen_ctx) - return; - /* Cancel port reopening if one is running */ port_serial_reopen_cancel (self); - /* Force the port to close */ - self->priv->open_count = 1; - mm_port_serial_close (self); + /* If already closed, done */ + if (self->priv->open_count > 0) { + _close_internal (self, TRUE); - /* Notify about the forced close status */ - g_signal_emit (self, signals[FORCED_CLOSE], 0); + /* Notify about the forced close status */ + g_signal_emit (self, signals[FORCED_CLOSE], 0); + } } /*****************************************************************************/ |