Lines Matching refs:client
64 #define debugf(client, fmt, args...) printf("evdev cdev: "fmt"\n", ##args) argument
66 #define debugf(client, fmt, args...) argument
107 struct evdev_client *client; in evdev_open() local
116 client = malloc(offsetof(struct evdev_client, ec_buffer) + in evdev_open()
121 client->ec_buffer_size = buffer_size; in evdev_open()
122 client->ec_buffer_head = 0; in evdev_open()
123 client->ec_buffer_tail = 0; in evdev_open()
124 client->ec_buffer_ready = 0; in evdev_open()
126 client->ec_evdev = evdev; in evdev_open()
127 mtx_init(&client->ec_buffer_mtx, "evclient", "evdev", MTX_DEF); in evdev_open()
128 knlist_init_mtx(&client->ec_selp.si_note, &client->ec_buffer_mtx); in evdev_open()
137 ret = evdev_register_client(evdev, client); in evdev_open()
141 ret = devfs_set_cdevpriv(client, evdev_dtor); in evdev_open()
143 client->ec_revoked = true; in evdev_open()
146 debugf(client, "cannot register evdev client"); in evdev_open()
147 evdev_dtor(client); in evdev_open()
156 struct evdev_client *client = (struct evdev_client *)data; in evdev_dtor() local
158 EVDEV_LIST_LOCK(client->ec_evdev); in evdev_dtor()
159 if (!client->ec_revoked) in evdev_dtor()
160 evdev_dispose_client(client->ec_evdev, client); in evdev_dtor()
161 EVDEV_LIST_UNLOCK(client->ec_evdev); in evdev_dtor()
163 if (client->ec_evdev->ev_lock_type != EV_LOCK_MTX) in evdev_dtor()
165 knlist_clear(&client->ec_selp.si_note, 0); in evdev_dtor()
166 seldrain(&client->ec_selp); in evdev_dtor()
167 knlist_destroy(&client->ec_selp.si_note); in evdev_dtor()
168 funsetown(&client->ec_sigio); in evdev_dtor()
169 mtx_destroy(&client->ec_buffer_mtx); in evdev_dtor()
170 free(client, M_EVDEV); in evdev_dtor()
176 struct evdev_client *client; in evdev_read() local
188 ret = devfs_get_cdevpriv((void **)&client); in evdev_read()
192 debugf(client, "read %zd bytes by thread %d", uio->uio_resid, in evdev_read()
195 if (client->ec_revoked) in evdev_read()
211 EVDEV_CLIENT_LOCKQ(client); in evdev_read()
213 if (EVDEV_CLIENT_EMPTYQ(client)) { in evdev_read()
218 client->ec_blocked = true; in evdev_read()
219 ret = mtx_sleep(client, &client->ec_buffer_mtx, in evdev_read()
221 if (ret == 0 && client->ec_revoked) in evdev_read()
227 while (ret == 0 && !EVDEV_CLIENT_EMPTYQ(client) && remaining > 0) { in evdev_read()
228 head = client->ec_buffer + client->ec_buffer_head; in evdev_read()
240 client->ec_buffer_head = in evdev_read()
241 (client->ec_buffer_head + 1) % client->ec_buffer_size; in evdev_read()
244 EVDEV_CLIENT_UNLOCKQ(client); in evdev_read()
246 EVDEV_CLIENT_LOCKQ(client); in evdev_read()
249 EVDEV_CLIENT_UNLOCKQ(client); in evdev_read()
258 struct evdev_client *client; in evdev_write() local
268 ret = devfs_get_cdevpriv((void **)&client); in evdev_write()
272 debugf(client, "write %zd bytes by thread %d", uio->uio_resid, in evdev_write()
275 if (client->ec_revoked || evdev == NULL) in evdev_write()
286 debugf(client, "write size not multiple of input_event size"); in evdev_write()
310 struct evdev_client *client; in evdev_poll() local
314 ret = devfs_get_cdevpriv((void **)&client); in evdev_poll()
318 debugf(client, "poll by thread %d", td->td_tid); in evdev_poll()
320 if (client->ec_revoked) in evdev_poll()
324 EVDEV_CLIENT_LOCKQ(client); in evdev_poll()
325 if (!EVDEV_CLIENT_EMPTYQ(client)) in evdev_poll()
328 client->ec_selected = true; in evdev_poll()
329 selrecord(td, &client->ec_selp); in evdev_poll()
331 EVDEV_CLIENT_UNLOCKQ(client); in evdev_poll()
340 struct evdev_client *client; in evdev_kqfilter() local
343 ret = devfs_get_cdevpriv((void **)&client); in evdev_kqfilter()
347 if (client->ec_revoked) in evdev_kqfilter()
357 kn->kn_hook = (caddr_t)client; in evdev_kqfilter()
359 knlist_add(&client->ec_selp.si_note, kn, 0); in evdev_kqfilter()
366 struct evdev_client *client; in evdev_kqread() local
369 client = (struct evdev_client *)kn->kn_hook; in evdev_kqread()
371 EVDEV_CLIENT_LOCKQ_ASSERT(client); in evdev_kqread()
373 if (client->ec_revoked) { in evdev_kqread()
377 kn->kn_data = EVDEV_CLIENT_SIZEQ(client) * in evdev_kqread()
379 ret = !EVDEV_CLIENT_EMPTYQ(client); in evdev_kqread()
387 struct evdev_client *client; in evdev_kqdetach() local
389 client = (struct evdev_client *)kn->kn_hook; in evdev_kqdetach()
390 knlist_remove(&client->ec_selp.si_note, kn, 0); in evdev_kqdetach()
398 struct evdev_client *client; in evdev_ioctl() local
405 ret = devfs_get_cdevpriv((void **)&client); in evdev_ioctl()
409 if (client->ec_revoked || evdev == NULL) in evdev_ioctl()
432 return (fsetown(*(int *)data, &client->ec_sigio)); in evdev_ioctl()
435 *(int *)data = fgetown(&client->ec_sigio); in evdev_ioctl()
443 client->ec_async = true; in evdev_ioctl()
445 client->ec_async = false; in evdev_ioctl()
450 EVDEV_CLIENT_LOCKQ(client); in evdev_ioctl()
452 EVDEV_CLIENT_SIZEQ(client) * sizeof(struct input_event); in evdev_ioctl()
453 EVDEV_CLIENT_UNLOCKQ(client); in evdev_ioctl()
458 debugf(client, "ioctl called: cmd=0x%08lx, data=%p", cmd, data); in evdev_ioctl()
467 debugf(client, "EVIOCGID: bus=%d vendor=0x%04x product=0x%04x", in evdev_ioctl()
546 ret = evdev_grab_client(evdev, client); in evdev_ioctl()
548 ret = evdev_release_client(evdev, client); in evdev_ioctl()
557 if (dev->si_drv1 != NULL && !client->ec_revoked) { in evdev_ioctl()
558 evdev_dispose_client(evdev, client); in evdev_ioctl()
559 evdev_revoke_client(client); in evdev_ioctl()
567 client->ec_clock_id = EV_CLOCK_REALTIME; in evdev_ioctl()
570 client->ec_clock_id = EV_CLOCK_MONOTONIC; in evdev_ioctl()
630 evdev_client_filter_queue(client, EV_KEY); in evdev_ioctl()
639 evdev_client_filter_queue(client, EV_LED); in evdev_ioctl()
648 evdev_client_filter_queue(client, EV_SND); in evdev_ioctl()
657 evdev_client_filter_queue(client, EV_SW); in evdev_ioctl()
665 debugf(client, "EVIOCGBIT(%d): data=%p, len=%d", type_num, in evdev_ioctl()
739 evdev_revoke_client(struct evdev_client *client) in evdev_revoke_client() argument
742 EVDEV_LIST_LOCK_ASSERT(client->ec_evdev); in evdev_revoke_client()
744 client->ec_revoked = true; in evdev_revoke_client()
748 evdev_notify_event(struct evdev_client *client) in evdev_notify_event() argument
751 EVDEV_CLIENT_LOCKQ_ASSERT(client); in evdev_notify_event()
753 if (client->ec_blocked) { in evdev_notify_event()
754 client->ec_blocked = false; in evdev_notify_event()
755 wakeup(client); in evdev_notify_event()
757 if (client->ec_selected) { in evdev_notify_event()
758 client->ec_selected = false; in evdev_notify_event()
759 selwakeup(&client->ec_selp); in evdev_notify_event()
761 KNOTE_LOCKED(&client->ec_selp.si_note, 0); in evdev_notify_event()
763 if (client->ec_async && client->ec_sigio != NULL) in evdev_notify_event()
764 pgsigio(&client->ec_sigio, SIGIO, 0); in evdev_notify_event()
801 evdev_client_gettime(struct evdev_client *client, struct timeval *tv) in evdev_client_gettime() argument
804 switch (client->ec_clock_id) { in evdev_client_gettime()
822 evdev_client_push(struct evdev_client *client, uint16_t type, uint16_t code, in evdev_client_push() argument
828 EVDEV_CLIENT_LOCKQ_ASSERT(client); in evdev_client_push()
829 head = client->ec_buffer_head; in evdev_client_push()
830 tail = client->ec_buffer_tail; in evdev_client_push()
831 ready = client->ec_buffer_ready; in evdev_client_push()
832 count = client->ec_buffer_size; in evdev_client_push()
836 debugf(client, "client %p: buffer overflow", client); in evdev_client_push()
839 client->ec_buffer[head] = (struct input_event) { in evdev_client_push()
852 client->ec_buffer_head = head; in evdev_client_push()
853 client->ec_buffer_ready = head; in evdev_client_push()
856 client->ec_buffer[tail].type = type; in evdev_client_push()
857 client->ec_buffer[tail].code = code; in evdev_client_push()
858 client->ec_buffer[tail].value = value; in evdev_client_push()
859 client->ec_buffer_tail = (tail + 1) % count; in evdev_client_push()
863 evdev_client_gettime(client, &time); in evdev_client_push()
864 for (; ready != client->ec_buffer_tail; in evdev_client_push()
866 client->ec_buffer[ready].time = time; in evdev_client_push()
867 client->ec_buffer_ready = client->ec_buffer_tail; in evdev_client_push()
872 evdev_client_dumpqueue(struct evdev_client *client) in evdev_client_dumpqueue() argument
877 head = client->ec_buffer_head; in evdev_client_dumpqueue()
878 tail = client->ec_buffer_tail; in evdev_client_dumpqueue()
879 ready = client->ec_buffer_ready; in evdev_client_dumpqueue()
880 size = client->ec_buffer_size; in evdev_client_dumpqueue()
882 printf("evdev client: %p\n", client); in evdev_client_dumpqueue()
889 event = &client->ec_buffer[i]; in evdev_client_dumpqueue()
910 evdev_client_filter_queue(struct evdev_client *client, uint16_t type) in evdev_client_filter_queue() argument
916 EVDEV_CLIENT_LOCKQ(client); in evdev_client_filter_queue()
918 i = head = client->ec_buffer_head; in evdev_client_filter_queue()
919 tail = client->ec_buffer_tail; in evdev_client_filter_queue()
920 count = client->ec_buffer_size; in evdev_client_filter_queue()
921 client->ec_buffer_ready = client->ec_buffer_tail; in evdev_client_filter_queue()
923 while (i != client->ec_buffer_tail) { in evdev_client_filter_queue()
924 event = &client->ec_buffer[i]; in evdev_client_filter_queue()
936 client->ec_buffer_ready = (tail + 1) % count; in evdev_client_filter_queue()
940 memcpy(&client->ec_buffer[tail], event, in evdev_client_filter_queue()
949 client->ec_buffer_head = i; in evdev_client_filter_queue()
950 client->ec_buffer_tail = tail; in evdev_client_filter_queue()
952 EVDEV_CLIENT_UNLOCKQ(client); in evdev_client_filter_queue()