Lines Matching full:client

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