serial: fix cleanup of flash function (rh #591728)

The flash function could be called when the port was closed, and since
the flash function would only be canceled when the port was open,
it could trigger after the port object was destroyed.
This commit is contained in:
Dan Williams
2010-05-26 11:43:06 -07:00
parent 6c3ae7d8fd
commit d5b8019d66
3 changed files with 14 additions and 4 deletions

View File

@@ -44,6 +44,7 @@ mm_serial_error_get_type (void)
ENUM_ENTRY (MM_SERIAL_ERROR_RESPONSE_TIMEOUT, "SerialResponseTimeout"), ENUM_ENTRY (MM_SERIAL_ERROR_RESPONSE_TIMEOUT, "SerialResponseTimeout"),
ENUM_ENTRY (MM_SERIAL_ERROR_OPEN_FAILED_NO_DEVICE, "SerialOpenFailedNoDevice"), ENUM_ENTRY (MM_SERIAL_ERROR_OPEN_FAILED_NO_DEVICE, "SerialOpenFailedNoDevice"),
ENUM_ENTRY (MM_SERIAL_ERROR_FLASH_FAILED, "SerialFlashFailed"), ENUM_ENTRY (MM_SERIAL_ERROR_FLASH_FAILED, "SerialFlashFailed"),
ENUM_ENTRY (MM_SERIAL_ERROR_NOT_OPEN, "SerialNotOpen"),
{ 0, 0, 0 } { 0, 0, 0 }
}; };

View File

@@ -25,6 +25,7 @@ enum {
MM_SERIAL_ERROR_RESPONSE_TIMEOUT = 2, MM_SERIAL_ERROR_RESPONSE_TIMEOUT = 2,
MM_SERIAL_ERROR_OPEN_FAILED_NO_DEVICE = 3, MM_SERIAL_ERROR_OPEN_FAILED_NO_DEVICE = 3,
MM_SERIAL_ERROR_FLASH_FAILED = 4, MM_SERIAL_ERROR_FLASH_FAILED = 4,
MM_SERIAL_ERROR_NOT_OPEN = 5,
}; };
#define MM_SERIAL_ERROR (mm_serial_error_quark ()) #define MM_SERIAL_ERROR (mm_serial_error_quark ())

View File

@@ -814,10 +814,7 @@ mm_serial_port_close (MMSerialPort *self)
priv->channel = NULL; priv->channel = NULL;
} }
if (priv->flash_id > 0) { mm_serial_port_flash_cancel (self);
g_source_remove (priv->flash_id);
priv->flash_id = 0;
}
tcsetattr (priv->fd, TCSANOW, &priv->old_t); tcsetattr (priv->fd, TCSANOW, &priv->old_t);
close (priv->fd); close (priv->fd);
@@ -1032,6 +1029,15 @@ mm_serial_port_flash (MMSerialPort *self,
priv = MM_SERIAL_PORT_GET_PRIVATE (self); priv = MM_SERIAL_PORT_GET_PRIVATE (self);
if (!mm_serial_port_is_open (self)) {
error = g_error_new_literal (MM_SERIAL_ERROR,
MM_SERIAL_ERROR_NOT_OPEN,
"The serial port is not open.");
callback (self, error, user_data);
g_error_free (error);
return FALSE;
}
if (priv->flash_id > 0) { if (priv->flash_id > 0) {
error = g_error_new_literal (MM_MODEM_ERROR, error = g_error_new_literal (MM_MODEM_ERROR,
MM_MODEM_ERROR_OPERATION_IN_PROGRESS, MM_MODEM_ERROR_OPERATION_IN_PROGRESS,
@@ -1215,6 +1221,8 @@ dispose (GObject *object)
if (mm_serial_port_is_open (MM_SERIAL_PORT (object))) if (mm_serial_port_is_open (MM_SERIAL_PORT (object)))
mm_serial_port_close_force (MM_SERIAL_PORT (object)); mm_serial_port_close_force (MM_SERIAL_PORT (object));
mm_serial_port_flash_cancel (MM_SERIAL_PORT (object));
G_OBJECT_CLASS (mm_serial_port_parent_class)->dispose (object); G_OBJECT_CLASS (mm_serial_port_parent_class)->dispose (object);
} }