Пример #1
0
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;
}
Пример #2
0
/**
 * 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);
}
Пример #3
0
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);
}
Пример #4
0
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;
}
Пример #5
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);
}
Пример #6
0
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);
}
Пример #7
0
/**
 * 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);
}