On Tue, Oct 7, 2014 at 11:06 PM, Dan Williams <[email protected]> wrote:
> 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.
Looks good to me; I'd get it also in the mm-1-4 branch as well.
> ---
> src/mm-port-serial.c | 43 +++++++++++++++++++++++--------------------
> 1 file changed, 23 insertions(+), 20 deletions(-)
>
> diff --git a/src/mm-port-serial.c b/src/mm-port-serial.c
> index 9b74900..3af1b8e 100644
> --- a/src/mm-port-serial.c
> +++ b/src/mm-port-serial.c
> @@ -1270,33 +1270,31 @@ mm_port_serial_is_open (MMPortSerial *self)
> {
> g_return_val_if_fail (self != NULL, FALSE);
> g_return_val_if_fail (MM_IS_PORT_SERIAL (self), FALSE);
>
> 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)
> return;
>
> if (self->priv->connected_id) {
> g_signal_handler_disconnect (self, self->priv->connected_id);
> @@ -1398,43 +1396,48 @@ mm_port_serial_close (MMPortSerial *self)
> self->priv->cancellable_id);
> self->priv->cancellable_id = 0;
> }
>
> 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 */
> if (self->priv->forced_close)
> return;
>
> mm_dbg ("(%s) forced to close port", mm_port_get_device (MM_PORT
> (self)));
>
> /* Mark as having forced the close, so that we don't warn about incorrect
> * 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);
> + }
> }
>
>
> /*****************************************************************************/
> /* Reopen */
>
> typedef struct {
> MMPortSerial *self;
> --
> 1.9.3
>
>
--
Aleksander
https://aleksander.es
_______________________________________________
networkmanager-list mailing list
[email protected]
https://mail.gnome.org/mailman/listinfo/networkmanager-list