diff --git a/src/device.c b/src/device.c
index 78a925c..cde2db3 100644
--- a/src/device.c
+++ b/src/device.c
GSList *attios;
GSList *attios_offline;
guint attachid; /* Attrib server attach */
+ guint auto_id; /* Auto connect source id */
gboolean connected;
if (device->discov_timer)
g_source_remove(device->discov_timer);
+ if (device->auto_id)
+ g_source_remove(device->auto_id);
+
DBG("%p", device);
g_free(device->authr);
attio->dcfunc(attio->user_data);
}
+static void att_connect_dispatched(gpointer user_data)
+{
+ struct btd_device *device = user_data;
+
+ device->auto_id = 0;
+}
+
static void attrib_disconnected(gpointer user_data)
{
struct btd_device *device = user_data;
device->browse = NULL;
browse_request_free(req, TRUE);
} else if (device->auto_connect)
- g_idle_add(att_connect, device);
+ device->auto_id = g_idle_add_full(
+ G_PRIORITY_DEFAULT_IDLE,
+ att_connect, device,
+ att_connect_dispatched);
return;
}
device->auto_connect = enable;
+ if (device->auto_id != 0)
+ return;
+
if (device->attrib) {
DBG("Already connected");
return;
if (device->attios == NULL && device->attios_offline == NULL)
return;
- g_idle_add(att_connect, device);
+ device->auto_id = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,
+ att_connect, device,
+ att_connect_dispatched);
}
void device_set_type(struct btd_device *device, device_type_t type)
attio);
g_idle_add(notify_attios, device);
} else {
- g_idle_add(att_connect, device);
+ device->auto_id = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,
+ att_connect, device,
+ att_connect_dispatched);
+
device->attios = g_slist_append(device->attios, attio);
}