static gboolean adapter_removed(DBusConnection *conn, DBusMessage *message, void *user_data) { const char *path; dbus_message_get_args(message, NULL, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID); remove_adapter(conn, path); return TRUE; }
/** * Add adapter to list */ static void add_adapter(const char *path, DBusGProxy *proxy) { adapter_object *a; if (get_adapter(path)) remove_adapter(path); a = (adapter_object *) g_new(adapter_object, 1); a->path = g_strdup(path); a->proxy = proxy; llist_add(adapters(), a); }
static void wiiusb_hid_free(void *data) { wiiusb_hid_t *hid = (wiiusb_hid_t*)data; while (adapters.next) if (remove_adapter(hid, &adapters.next->device) == -1) RARCH_ERR("could not remove device %p\n", adapters.next->device); pad_connection_destroy(hid->slots); // wiiusb_hotplug_deregister_callback(hid->ctx, hid->hp); if (hid) free(hid); }
static int libusb_hid_hotplug_callback(struct libusb_context *ctx, struct libusb_device *dev, libusb_hotplug_event event, void *user_data) { libusb_hid_t *hid = (libusb_hid_t*)user_data; switch (event) { case LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED: add_adapter(hid, dev); break; case LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT: remove_adapter(hid, dev); break; default: RARCH_WARN("Unhandled event: %d\n", event); break; } return 0; }
void cxgb_offload_deactivate(struct adapter *adapter) { struct t3cdev *tdev = &adapter->tdev; struct t3c_data *t = T3C_DATA(tdev); printf("removing adapter %p\n", adapter); remove_adapter(adapter); if (TAILQ_EMPTY(&adapter_list)) { #if defined(CONFIG_CHELSIO_T3_MODULE) restore_arp_sans_t3core(); #endif } free_tid_maps(&t->tid_maps); T3C_DATA(tdev) = NULL; t3_free_l2t(L2DATA(tdev)); L2DATA(tdev) = NULL; mtx_destroy(&t->tid_release_lock); free(t, M_CXGB); }
static void libusb_hid_free(void *data) { libusb_hid_t *hid = (libusb_hid_t*)data; while(adapters.next) if (remove_adapter(hid, adapters.next->device) == -1) RARCH_ERR("could not remove device %p\n", adapters.next->device); if (hid->poll_thread) { hid->quit = 1; sthread_join(hid->poll_thread); } pad_connection_destroy(hid->slots); libusb_hotplug_deregister_callback(hid->ctx, hid->hp); libusb_exit(hid->ctx); free(hid); }
/** * Disconnects adapter signals */ static void disconnect_adapter(const char *path) { adapter_object *a = get_adapter(path); gboolean dirty; device_object *d; if (!a) return; DEBUG("Disconnecting adapter: %s", path); dbus_g_proxy_disconnect_signal(a->proxy, "DeviceCreated", G_CALLBACK(device_created), NULL); dbus_g_proxy_disconnect_signal(a->proxy, "DeviceRemoved", G_CALLBACK(device_removed), NULL); // Disconnect devices related to this adapter do { dirty = FALSE; LinkedNode *i = devices()->first; while (i) { d = i->element; if (strcmp(d->adapter, path) == 0) { disconnect_device_signals(d->path); dirty = TRUE; break; } i = i->next; } } while (dirty); remove_adapter(path); }