Lines Matching refs:client
51 #define debugf(client, fmt, args...) printf("evdev cdev: "fmt"\n", ##args) argument
53 #define debugf(client, fmt, args...) argument
93 struct evdev_client *client; in evdev_open() local
102 client = malloc(offsetof(struct evdev_client, ec_buffer) + in evdev_open()
107 client->ec_buffer_size = buffer_size; in evdev_open()
108 client->ec_buffer_head = 0; in evdev_open()
109 client->ec_buffer_tail = 0; in evdev_open()
110 client->ec_buffer_ready = 0; in evdev_open()
112 client->ec_evdev = evdev; in evdev_open()
113 mtx_init(&client->ec_buffer_mtx, "evclient", "evdev", MTX_DEF); in evdev_open()
114 knlist_init_mtx(&client->ec_selp.si_note, &client->ec_buffer_mtx); in evdev_open()
121 ret = evdev_register_client(evdev, client); in evdev_open()
124 evdev_revoke_client(client); in evdev_open()
132 ret = devfs_set_cdevpriv(client, evdev_dtor); in evdev_open()
135 debugf(client, "cannot register evdev client"); in evdev_open()
136 evdev_dtor(client); in evdev_open()
145 struct evdev_client *client = (struct evdev_client *)data; in evdev_dtor() local
147 EVDEV_LOCK(client->ec_evdev); in evdev_dtor()
148 if (!client->ec_revoked) in evdev_dtor()
149 evdev_dispose_client(client->ec_evdev, client); in evdev_dtor()
150 EVDEV_UNLOCK(client->ec_evdev); in evdev_dtor()
152 knlist_clear(&client->ec_selp.si_note, 0); in evdev_dtor()
153 seldrain(&client->ec_selp); in evdev_dtor()
154 knlist_destroy(&client->ec_selp.si_note); in evdev_dtor()
155 funsetown(&client->ec_sigio); in evdev_dtor()
156 mtx_destroy(&client->ec_buffer_mtx); in evdev_dtor()
157 free(client, M_EVDEV); in evdev_dtor()
163 struct evdev_client *client; in evdev_read() local
168 ret = devfs_get_cdevpriv((void **)&client); in evdev_read()
172 debugf(client, "read %zd bytes by thread %d", uio->uio_resid, in evdev_read()
175 if (client->ec_revoked) in evdev_read()
184 EVDEV_CLIENT_LOCKQ(client); in evdev_read()
186 if (EVDEV_CLIENT_EMPTYQ(client)) { in evdev_read()
191 client->ec_blocked = true; in evdev_read()
192 ret = mtx_sleep(client, &client->ec_buffer_mtx, in evdev_read()
198 while (ret == 0 && !EVDEV_CLIENT_EMPTYQ(client) && remaining > 0) { in evdev_read()
199 memcpy(&event, &client->ec_buffer[client->ec_buffer_head], in evdev_read()
201 client->ec_buffer_head = in evdev_read()
202 (client->ec_buffer_head + 1) % client->ec_buffer_size; in evdev_read()
205 EVDEV_CLIENT_UNLOCKQ(client); in evdev_read()
207 EVDEV_CLIENT_LOCKQ(client); in evdev_read()
210 EVDEV_CLIENT_UNLOCKQ(client); in evdev_read()
219 struct evdev_client *client; in evdev_write() local
223 ret = devfs_get_cdevpriv((void **)&client); in evdev_write()
227 debugf(client, "write %zd bytes by thread %d", uio->uio_resid, in evdev_write()
230 if (client->ec_revoked || evdev == NULL) in evdev_write()
234 debugf(client, "write size not multiple of input_event size"); in evdev_write()
251 struct evdev_client *client; in evdev_poll() local
255 ret = devfs_get_cdevpriv((void **)&client); in evdev_poll()
259 debugf(client, "poll by thread %d", td->td_tid); in evdev_poll()
261 if (client->ec_revoked) in evdev_poll()
265 EVDEV_CLIENT_LOCKQ(client); in evdev_poll()
266 if (!EVDEV_CLIENT_EMPTYQ(client)) in evdev_poll()
269 client->ec_selected = true; in evdev_poll()
270 selrecord(td, &client->ec_selp); in evdev_poll()
272 EVDEV_CLIENT_UNLOCKQ(client); in evdev_poll()
281 struct evdev_client *client; in evdev_kqfilter() local
284 ret = devfs_get_cdevpriv((void **)&client); in evdev_kqfilter()
288 if (client->ec_revoked) in evdev_kqfilter()
298 kn->kn_hook = (caddr_t)client; in evdev_kqfilter()
300 knlist_add(&client->ec_selp.si_note, kn, 0); in evdev_kqfilter()
307 struct evdev_client *client; in evdev_kqread() local
310 client = (struct evdev_client *)kn->kn_hook; in evdev_kqread()
312 EVDEV_CLIENT_LOCKQ_ASSERT(client); in evdev_kqread()
314 if (client->ec_revoked) { in evdev_kqread()
318 kn->kn_data = EVDEV_CLIENT_SIZEQ(client) * in evdev_kqread()
320 ret = !EVDEV_CLIENT_EMPTYQ(client); in evdev_kqread()
328 struct evdev_client *client; in evdev_kqdetach() local
330 client = (struct evdev_client *)kn->kn_hook; in evdev_kqdetach()
331 knlist_remove(&client->ec_selp.si_note, kn, 0); in evdev_kqdetach()
339 struct evdev_client *client; in evdev_ioctl() local
345 ret = devfs_get_cdevpriv((void **)&client); in evdev_ioctl()
349 if (client->ec_revoked || evdev == NULL) in evdev_ioctl()
368 return (fsetown(*(int *)data, &client->ec_sigio)); in evdev_ioctl()
371 *(int *)data = fgetown(&client->ec_sigio); in evdev_ioctl()
379 client->ec_async = true; in evdev_ioctl()
381 client->ec_async = false; in evdev_ioctl()
386 EVDEV_CLIENT_LOCKQ(client); in evdev_ioctl()
388 EVDEV_CLIENT_SIZEQ(client) * sizeof(struct input_event); in evdev_ioctl()
389 EVDEV_CLIENT_UNLOCKQ(client); in evdev_ioctl()
394 debugf(client, "ioctl called: cmd=0x%08lx, data=%p", cmd, data); in evdev_ioctl()
403 debugf(client, "EVIOCGID: bus=%d vendor=0x%04x product=0x%04x", in evdev_ioctl()
482 ret = evdev_grab_client(evdev, client); in evdev_ioctl()
484 ret = evdev_release_client(evdev, client); in evdev_ioctl()
493 if (dev->si_drv1 != NULL && !client->ec_revoked) { in evdev_ioctl()
494 evdev_dispose_client(evdev, client); in evdev_ioctl()
495 evdev_revoke_client(client); in evdev_ioctl()
503 client->ec_clock_id = EV_CLOCK_REALTIME; in evdev_ioctl()
506 client->ec_clock_id = EV_CLOCK_MONOTONIC; in evdev_ioctl()
557 evdev_client_filter_queue(client, EV_KEY); in evdev_ioctl()
565 evdev_client_filter_queue(client, EV_LED); in evdev_ioctl()
573 evdev_client_filter_queue(client, EV_SND); in evdev_ioctl()
581 evdev_client_filter_queue(client, EV_SW); in evdev_ioctl()
588 debugf(client, "EVIOCGBIT(%d): data=%p, len=%d", type_num, in evdev_ioctl()
659 evdev_revoke_client(struct evdev_client *client) in evdev_revoke_client() argument
662 EVDEV_LOCK_ASSERT(client->ec_evdev); in evdev_revoke_client()
664 client->ec_revoked = true; in evdev_revoke_client()
668 evdev_notify_event(struct evdev_client *client) in evdev_notify_event() argument
671 EVDEV_CLIENT_LOCKQ_ASSERT(client); in evdev_notify_event()
673 if (client->ec_blocked) { in evdev_notify_event()
674 client->ec_blocked = false; in evdev_notify_event()
675 wakeup(client); in evdev_notify_event()
677 if (client->ec_selected) { in evdev_notify_event()
678 client->ec_selected = false; in evdev_notify_event()
679 selwakeup(&client->ec_selp); in evdev_notify_event()
681 KNOTE_LOCKED(&client->ec_selp.si_note, 0); in evdev_notify_event()
683 if (client->ec_async && client->ec_sigio != NULL) in evdev_notify_event()
684 pgsigio(&client->ec_sigio, SIGIO, 0); in evdev_notify_event()
721 evdev_client_gettime(struct evdev_client *client, struct timeval *tv) in evdev_client_gettime() argument
724 switch (client->ec_clock_id) { in evdev_client_gettime()
742 evdev_client_push(struct evdev_client *client, uint16_t type, uint16_t code, in evdev_client_push() argument
748 EVDEV_CLIENT_LOCKQ_ASSERT(client); in evdev_client_push()
749 head = client->ec_buffer_head; in evdev_client_push()
750 tail = client->ec_buffer_tail; in evdev_client_push()
751 ready = client->ec_buffer_ready; in evdev_client_push()
752 count = client->ec_buffer_size; in evdev_client_push()
756 debugf(client, "client %p: buffer overflow", client); in evdev_client_push()
759 client->ec_buffer[head] = (struct input_event) { in evdev_client_push()
772 client->ec_buffer_head = head; in evdev_client_push()
773 client->ec_buffer_ready = head; in evdev_client_push()
776 client->ec_buffer[tail].type = type; in evdev_client_push()
777 client->ec_buffer[tail].code = code; in evdev_client_push()
778 client->ec_buffer[tail].value = value; in evdev_client_push()
779 client->ec_buffer_tail = (tail + 1) % count; in evdev_client_push()
783 evdev_client_gettime(client, &time); in evdev_client_push()
784 for (; ready != client->ec_buffer_tail; in evdev_client_push()
786 client->ec_buffer[ready].time = time; in evdev_client_push()
787 client->ec_buffer_ready = client->ec_buffer_tail; in evdev_client_push()
792 evdev_client_dumpqueue(struct evdev_client *client) in evdev_client_dumpqueue() argument
797 head = client->ec_buffer_head; in evdev_client_dumpqueue()
798 tail = client->ec_buffer_tail; in evdev_client_dumpqueue()
799 ready = client->ec_buffer_ready; in evdev_client_dumpqueue()
800 size = client->ec_buffer_size; in evdev_client_dumpqueue()
802 printf("evdev client: %p\n", client); in evdev_client_dumpqueue()
809 event = &client->ec_buffer[i]; in evdev_client_dumpqueue()
830 evdev_client_filter_queue(struct evdev_client *client, uint16_t type) in evdev_client_filter_queue() argument
836 EVDEV_CLIENT_LOCKQ(client); in evdev_client_filter_queue()
838 i = head = client->ec_buffer_head; in evdev_client_filter_queue()
839 tail = client->ec_buffer_tail; in evdev_client_filter_queue()
840 count = client->ec_buffer_size; in evdev_client_filter_queue()
841 client->ec_buffer_ready = client->ec_buffer_tail; in evdev_client_filter_queue()
843 while (i != client->ec_buffer_tail) { in evdev_client_filter_queue()
844 event = &client->ec_buffer[i]; in evdev_client_filter_queue()
856 client->ec_buffer_ready = (tail + 1) % count; in evdev_client_filter_queue()
860 memcpy(&client->ec_buffer[tail], event, in evdev_client_filter_queue()
869 client->ec_buffer_head = i; in evdev_client_filter_queue()
870 client->ec_buffer_tail = tail; in evdev_client_filter_queue()
872 EVDEV_CLIENT_UNLOCKQ(client); in evdev_client_filter_queue()