Lines Matching refs:client
62 #define debugf(client, fmt, args...) printf("evdev cdev: "fmt"\n", ##args) argument
64 #define debugf(client, fmt, args...) argument
106 struct evdev_client *client; in evdev_open() local
115 client = malloc(offsetof(struct evdev_client, ec_buffer) + in evdev_open()
120 client->ec_buffer_size = buffer_size; in evdev_open()
121 client->ec_buffer_head = 0; in evdev_open()
122 client->ec_buffer_tail = 0; in evdev_open()
123 client->ec_buffer_ready = 0; in evdev_open()
125 client->ec_evdev = evdev; in evdev_open()
126 mtx_init(&client->ec_buffer_mtx, "evclient", "evdev", MTX_DEF); in evdev_open()
127 knlist_init_mtx(&client->ec_selp.si_note, &client->ec_buffer_mtx); in evdev_open()
136 ret = evdev_register_client(evdev, client); in evdev_open()
140 ret = devfs_set_cdevpriv(client, evdev_dtor); in evdev_open()
142 client->ec_revoked = true; in evdev_open()
145 debugf(client, "cannot register evdev client"); in evdev_open()
146 evdev_dtor(client); in evdev_open()
155 struct evdev_client *client = (struct evdev_client *)data; in evdev_dtor() local
157 EVDEV_LIST_LOCK(client->ec_evdev); in evdev_dtor()
158 if (!client->ec_revoked) in evdev_dtor()
159 evdev_dispose_client(client->ec_evdev, client); in evdev_dtor()
160 EVDEV_LIST_UNLOCK(client->ec_evdev); in evdev_dtor()
162 if (client->ec_evdev->ev_lock_type != EV_LOCK_MTX) in evdev_dtor()
164 knlist_clear(&client->ec_selp.si_note, 0); in evdev_dtor()
165 seldrain(&client->ec_selp); in evdev_dtor()
166 knlist_destroy(&client->ec_selp.si_note); in evdev_dtor()
167 funsetown(&client->ec_sigio); in evdev_dtor()
168 mtx_destroy(&client->ec_buffer_mtx); in evdev_dtor()
169 free(client, M_EVDEV); in evdev_dtor()
175 struct evdev_client *client; in evdev_read() local
187 ret = devfs_get_cdevpriv((void **)&client); in evdev_read()
191 debugf(client, "read %zd bytes by thread %d", uio->uio_resid, in evdev_read()
194 if (client->ec_revoked) in evdev_read()
210 EVDEV_CLIENT_LOCKQ(client); in evdev_read()
212 if (EVDEV_CLIENT_EMPTYQ(client)) { in evdev_read()
217 client->ec_blocked = true; in evdev_read()
218 ret = mtx_sleep(client, &client->ec_buffer_mtx, in evdev_read()
220 if (ret == 0 && client->ec_revoked) in evdev_read()
226 while (ret == 0 && !EVDEV_CLIENT_EMPTYQ(client) && remaining > 0) { in evdev_read()
227 head = client->ec_buffer + client->ec_buffer_head; in evdev_read()
239 client->ec_buffer_head = in evdev_read()
240 (client->ec_buffer_head + 1) % client->ec_buffer_size; in evdev_read()
243 EVDEV_CLIENT_UNLOCKQ(client); in evdev_read()
245 EVDEV_CLIENT_LOCKQ(client); in evdev_read()
248 EVDEV_CLIENT_UNLOCKQ(client); in evdev_read()
257 struct evdev_client *client; in evdev_write() local
267 ret = devfs_get_cdevpriv((void **)&client); in evdev_write()
271 debugf(client, "write %zd bytes by thread %d", uio->uio_resid, in evdev_write()
274 if (client->ec_revoked || evdev == NULL) in evdev_write()
285 debugf(client, "write size not multiple of input_event size"); in evdev_write()
309 struct evdev_client *client; in evdev_poll() local
313 ret = devfs_get_cdevpriv((void **)&client); in evdev_poll()
317 debugf(client, "poll by thread %d", td->td_tid); in evdev_poll()
319 if (client->ec_revoked) in evdev_poll()
323 EVDEV_CLIENT_LOCKQ(client); in evdev_poll()
324 if (!EVDEV_CLIENT_EMPTYQ(client)) in evdev_poll()
327 client->ec_selected = true; in evdev_poll()
328 selrecord(td, &client->ec_selp); in evdev_poll()
330 EVDEV_CLIENT_UNLOCKQ(client); in evdev_poll()
339 struct evdev_client *client; in evdev_kqfilter() local
342 ret = devfs_get_cdevpriv((void **)&client); in evdev_kqfilter()
346 if (client->ec_revoked) in evdev_kqfilter()
356 kn->kn_hook = (caddr_t)client; in evdev_kqfilter()
358 knlist_add(&client->ec_selp.si_note, kn, 0); in evdev_kqfilter()
365 struct evdev_client *client; in evdev_kqread() local
368 client = (struct evdev_client *)kn->kn_hook; in evdev_kqread()
370 EVDEV_CLIENT_LOCKQ_ASSERT(client); in evdev_kqread()
372 if (client->ec_revoked) { in evdev_kqread()
376 kn->kn_data = EVDEV_CLIENT_SIZEQ(client) * in evdev_kqread()
378 ret = !EVDEV_CLIENT_EMPTYQ(client); in evdev_kqread()
386 struct evdev_client *client; in evdev_kqdetach() local
388 client = (struct evdev_client *)kn->kn_hook; in evdev_kqdetach()
389 knlist_remove(&client->ec_selp.si_note, kn, 0); in evdev_kqdetach()
397 struct evdev_client *client; in evdev_ioctl() local
404 ret = devfs_get_cdevpriv((void **)&client); in evdev_ioctl()
408 if (client->ec_revoked || evdev == NULL) in evdev_ioctl()
431 return (fsetown(*(int *)data, &client->ec_sigio)); in evdev_ioctl()
434 *(int *)data = fgetown(&client->ec_sigio); in evdev_ioctl()
442 client->ec_async = true; in evdev_ioctl()
444 client->ec_async = false; in evdev_ioctl()
449 EVDEV_CLIENT_LOCKQ(client); in evdev_ioctl()
451 EVDEV_CLIENT_SIZEQ(client) * sizeof(struct input_event); in evdev_ioctl()
452 EVDEV_CLIENT_UNLOCKQ(client); in evdev_ioctl()
457 debugf(client, "ioctl called: cmd=0x%08lx, data=%p", cmd, data); in evdev_ioctl()
466 debugf(client, "EVIOCGID: bus=%d vendor=0x%04x product=0x%04x", in evdev_ioctl()
545 ret = evdev_grab_client(evdev, client); in evdev_ioctl()
547 ret = evdev_release_client(evdev, client); in evdev_ioctl()
556 if (dev->si_drv1 != NULL && !client->ec_revoked) { in evdev_ioctl()
557 evdev_dispose_client(evdev, client); in evdev_ioctl()
558 evdev_revoke_client(client); in evdev_ioctl()
566 client->ec_clock_id = EV_CLOCK_REALTIME; in evdev_ioctl()
569 client->ec_clock_id = EV_CLOCK_MONOTONIC; in evdev_ioctl()
629 evdev_client_filter_queue(client, EV_KEY); in evdev_ioctl()
638 evdev_client_filter_queue(client, EV_LED); in evdev_ioctl()
647 evdev_client_filter_queue(client, EV_SND); in evdev_ioctl()
656 evdev_client_filter_queue(client, EV_SW); in evdev_ioctl()
664 debugf(client, "EVIOCGBIT(%d): data=%p, len=%d", type_num, in evdev_ioctl()
738 evdev_revoke_client(struct evdev_client *client) in evdev_revoke_client() argument
741 EVDEV_LIST_LOCK_ASSERT(client->ec_evdev); in evdev_revoke_client()
743 client->ec_revoked = true; in evdev_revoke_client()
747 evdev_notify_event(struct evdev_client *client) in evdev_notify_event() argument
750 EVDEV_CLIENT_LOCKQ_ASSERT(client); in evdev_notify_event()
752 if (client->ec_blocked) { in evdev_notify_event()
753 client->ec_blocked = false; in evdev_notify_event()
754 wakeup(client); in evdev_notify_event()
756 if (client->ec_selected) { in evdev_notify_event()
757 client->ec_selected = false; in evdev_notify_event()
758 selwakeup(&client->ec_selp); in evdev_notify_event()
760 KNOTE_LOCKED(&client->ec_selp.si_note, 0); in evdev_notify_event()
762 if (client->ec_async && client->ec_sigio != NULL) in evdev_notify_event()
763 pgsigio(&client->ec_sigio, SIGIO, 0); in evdev_notify_event()
800 evdev_client_gettime(struct evdev_client *client, struct timeval *tv) in evdev_client_gettime() argument
803 switch (client->ec_clock_id) { in evdev_client_gettime()
821 evdev_client_push(struct evdev_client *client, uint16_t type, uint16_t code, in evdev_client_push() argument
827 EVDEV_CLIENT_LOCKQ_ASSERT(client); in evdev_client_push()
828 head = client->ec_buffer_head; in evdev_client_push()
829 tail = client->ec_buffer_tail; in evdev_client_push()
830 ready = client->ec_buffer_ready; in evdev_client_push()
831 count = client->ec_buffer_size; in evdev_client_push()
835 debugf(client, "client %p: buffer overflow", client); in evdev_client_push()
838 client->ec_buffer[head] = (struct input_event) { in evdev_client_push()
851 client->ec_buffer_head = head; in evdev_client_push()
852 client->ec_buffer_ready = head; in evdev_client_push()
855 client->ec_buffer[tail].type = type; in evdev_client_push()
856 client->ec_buffer[tail].code = code; in evdev_client_push()
857 client->ec_buffer[tail].value = value; in evdev_client_push()
858 client->ec_buffer_tail = (tail + 1) % count; in evdev_client_push()
862 evdev_client_gettime(client, &time); in evdev_client_push()
863 for (; ready != client->ec_buffer_tail; in evdev_client_push()
865 client->ec_buffer[ready].time = time; in evdev_client_push()
866 client->ec_buffer_ready = client->ec_buffer_tail; in evdev_client_push()
871 evdev_client_dumpqueue(struct evdev_client *client) in evdev_client_dumpqueue() argument
876 head = client->ec_buffer_head; in evdev_client_dumpqueue()
877 tail = client->ec_buffer_tail; in evdev_client_dumpqueue()
878 ready = client->ec_buffer_ready; in evdev_client_dumpqueue()
879 size = client->ec_buffer_size; in evdev_client_dumpqueue()
881 printf("evdev client: %p\n", client); in evdev_client_dumpqueue()
888 event = &client->ec_buffer[i]; in evdev_client_dumpqueue()
909 evdev_client_filter_queue(struct evdev_client *client, uint16_t type) in evdev_client_filter_queue() argument
915 EVDEV_CLIENT_LOCKQ(client); in evdev_client_filter_queue()
917 i = head = client->ec_buffer_head; in evdev_client_filter_queue()
918 tail = client->ec_buffer_tail; in evdev_client_filter_queue()
919 count = client->ec_buffer_size; in evdev_client_filter_queue()
920 client->ec_buffer_ready = client->ec_buffer_tail; in evdev_client_filter_queue()
922 while (i != client->ec_buffer_tail) { in evdev_client_filter_queue()
923 event = &client->ec_buffer[i]; in evdev_client_filter_queue()
935 client->ec_buffer_ready = (tail + 1) % count; in evdev_client_filter_queue()
939 memcpy(&client->ec_buffer[tail], event, in evdev_client_filter_queue()
948 client->ec_buffer_head = i; in evdev_client_filter_queue()
949 client->ec_buffer_tail = tail; in evdev_client_filter_queue()
951 EVDEV_CLIENT_UNLOCKQ(client); in evdev_client_filter_queue()