Lines Matching full:client

62 #define	debugf(client, fmt, args...)	printf("evdev cdev: "fmt"\n", ##args)
64 #define debugf(client, fmt, args...)
105 struct evdev_client *client;
112 /* Initialize client structure */
114 client = malloc(offsetof(struct evdev_client, ec_buffer) +
119 client->ec_buffer_size = buffer_size;
120 client->ec_buffer_head = 0;
121 client->ec_buffer_tail = 0;
122 client->ec_buffer_ready = 0;
124 client->ec_evdev = evdev;
125 mtx_init(&client->ec_buffer_mtx, "evclient", "evdev", MTX_DEF);
126 knlist_init_mtx(&client->ec_selp.si_note, &client->ec_buffer_mtx);
135 ret = evdev_register_client(evdev, client);
139 ret = devfs_set_cdevpriv(client, evdev_dtor);
141 client->ec_revoked = true;
144 debugf(client, "cannot register evdev client");
145 evdev_dtor(client);
154 struct evdev_client *client = (struct evdev_client *)data;
156 EVDEV_LIST_LOCK(client->ec_evdev);
157 if (!client->ec_revoked)
158 evdev_dispose_client(client->ec_evdev, client);
159 EVDEV_LIST_UNLOCK(client->ec_evdev);
161 if (client->ec_evdev->ev_lock_type != EV_LOCK_MTX)
163 knlist_clear(&client->ec_selp.si_note, 0);
164 seldrain(&client->ec_selp);
165 knlist_destroy(&client->ec_selp.si_note);
166 funsetown(&client->ec_sigio);
167 mtx_destroy(&client->ec_buffer_mtx);
168 free(client, M_EVDEV);
174 struct evdev_client *client;
186 ret = devfs_get_cdevpriv((void **)&client);
190 debugf(client, "read %zd bytes by thread %d", uio->uio_resid,
193 if (client->ec_revoked)
209 EVDEV_CLIENT_LOCKQ(client);
211 if (EVDEV_CLIENT_EMPTYQ(client)) {
216 client->ec_blocked = true;
217 ret = mtx_sleep(client, &client->ec_buffer_mtx,
219 if (ret == 0 && client->ec_revoked)
225 while (ret == 0 && !EVDEV_CLIENT_EMPTYQ(client) && remaining > 0) {
226 head = client->ec_buffer + client->ec_buffer_head;
238 client->ec_buffer_head =
239 (client->ec_buffer_head + 1) % client->ec_buffer_size;
242 EVDEV_CLIENT_UNLOCKQ(client);
244 EVDEV_CLIENT_LOCKQ(client);
247 EVDEV_CLIENT_UNLOCKQ(client);
256 struct evdev_client *client;
266 ret = devfs_get_cdevpriv((void **)&client);
270 debugf(client, "write %zd bytes by thread %d", uio->uio_resid,
273 if (client->ec_revoked || evdev == NULL)
284 debugf(client, "write size not multiple of input_event size");
308 struct evdev_client *client;
312 ret = devfs_get_cdevpriv((void **)&client);
316 debugf(client, "poll by thread %d", td->td_tid);
318 if (client->ec_revoked)
322 EVDEV_CLIENT_LOCKQ(client);
323 if (!EVDEV_CLIENT_EMPTYQ(client))
326 client->ec_selected = true;
327 selrecord(td, &client->ec_selp);
329 EVDEV_CLIENT_UNLOCKQ(client);
338 struct evdev_client *client;
341 ret = devfs_get_cdevpriv((void **)&client);
345 if (client->ec_revoked)
355 kn->kn_hook = (caddr_t)client;
357 knlist_add(&client->ec_selp.si_note, kn, 0);
364 struct evdev_client *client;
367 client = (struct evdev_client *)kn->kn_hook;
369 EVDEV_CLIENT_LOCKQ_ASSERT(client);
371 if (client->ec_revoked) {
375 kn->kn_data = EVDEV_CLIENT_SIZEQ(client) *
377 ret = !EVDEV_CLIENT_EMPTYQ(client);
385 struct evdev_client *client;
387 client = (struct evdev_client *)kn->kn_hook;
388 knlist_remove(&client->ec_selp.si_note, kn, 0);
396 struct evdev_client *client;
403 ret = devfs_get_cdevpriv((void **)&client);
407 if (client->ec_revoked || evdev == NULL)
430 return (fsetown(*(int *)data, &client->ec_sigio));
433 *(int *)data = fgetown(&client->ec_sigio);
441 client->ec_async = true;
443 client->ec_async = false;
448 EVDEV_CLIENT_LOCKQ(client);
450 EVDEV_CLIENT_SIZEQ(client) * sizeof(struct input_event);
451 EVDEV_CLIENT_UNLOCKQ(client);
456 debugf(client, "ioctl called: cmd=0x%08lx, data=%p", cmd, data);
465 debugf(client, "EVIOCGID: bus=%d vendor=0x%04x product=0x%04x",
544 ret = evdev_grab_client(evdev, client);
546 ret = evdev_release_client(evdev, client);
555 if (dev->si_drv1 != NULL && !client->ec_revoked) {
556 evdev_dispose_client(evdev, client);
557 evdev_revoke_client(client);
565 client->ec_clock_id = EV_CLOCK_REALTIME;
568 client->ec_clock_id = EV_CLOCK_MONOTONIC;
628 evdev_client_filter_queue(client, EV_KEY);
637 evdev_client_filter_queue(client, EV_LED);
646 evdev_client_filter_queue(client, EV_SND);
655 evdev_client_filter_queue(client, EV_SW);
663 debugf(client, "EVIOCGBIT(%d): data=%p, len=%d", type_num,
737 evdev_revoke_client(struct evdev_client *client)
740 EVDEV_LIST_LOCK_ASSERT(client->ec_evdev);
742 client->ec_revoked = true;
746 evdev_notify_event(struct evdev_client *client)
749 EVDEV_CLIENT_LOCKQ_ASSERT(client);
751 if (client->ec_blocked) {
752 client->ec_blocked = false;
753 wakeup(client);
755 if (client->ec_selected) {
756 client->ec_selected = false;
757 selwakeup(&client->ec_selp);
759 KNOTE_LOCKED(&client->ec_selp.si_note, 0);
761 if (client->ec_async && client->ec_sigio != NULL)
762 pgsigio(&client->ec_sigio, SIGIO, 0);
799 evdev_client_gettime(struct evdev_client *client, struct timeval *tv)
802 switch (client->ec_clock_id) {
820 evdev_client_push(struct evdev_client *client, uint16_t type, uint16_t code,
826 EVDEV_CLIENT_LOCKQ_ASSERT(client);
827 head = client->ec_buffer_head;
828 tail = client->ec_buffer_tail;
829 ready = client->ec_buffer_ready;
830 count = client->ec_buffer_size;
834 debugf(client, "client %p: buffer overflow", client);
837 client->ec_buffer[head] = (struct input_event) {
844 * report. The queue is empty but client has been already
850 client->ec_buffer_head = head;
851 client->ec_buffer_ready = head;
854 client->ec_buffer[tail].type = type;
855 client->ec_buffer[tail].code = code;
856 client->ec_buffer[tail].value = value;
857 client->ec_buffer_tail = (tail + 1) % count;
861 evdev_client_gettime(client, &time);
862 for (; ready != client->ec_buffer_tail;
864 client->ec_buffer[ready].time = time;
865 client->ec_buffer_ready = client->ec_buffer_tail;
870 evdev_client_dumpqueue(struct evdev_client *client)
875 head = client->ec_buffer_head;
876 tail = client->ec_buffer_tail;
877 ready = client->ec_buffer_ready;
878 size = client->ec_buffer_size;
880 printf("evdev client: %p\n", client);
887 event = &client->ec_buffer[i];
908 evdev_client_filter_queue(struct evdev_client *client, uint16_t type)
914 EVDEV_CLIENT_LOCKQ(client);
916 i = head = client->ec_buffer_head;
917 tail = client->ec_buffer_tail;
918 count = client->ec_buffer_size;
919 client->ec_buffer_ready = client->ec_buffer_tail;
921 while (i != client->ec_buffer_tail) {
922 event = &client->ec_buffer[i];
934 client->ec_buffer_ready = (tail + 1) % count;
938 memcpy(&client->ec_buffer[tail], event,
947 client->ec_buffer_head = i;
948 client->ec_buffer_tail = tail;
950 EVDEV_CLIENT_UNLOCKQ(client);