Lines Matching refs:ps
44 static zx_status_t pty_openat(pty_server_t* ps, zx_device_t** out, uint32_t id, uint32_t flags);
53 pty_server_t* ps = pc->srv; in pty_client_read() local
55 mtx_lock(&ps->lock); in pty_client_read()
62 device_state_set(ps->zxdev, DEV_STATE_WRITABLE); in pty_client_read()
64 mtx_unlock(&ps->lock); in pty_client_read()
77 pty_server_t* ps = pc->srv; in pty_client_write() local
81 mtx_lock(&ps->lock); in pty_client_write()
84 r = ps->recv(ps, buf, count, &length); in pty_client_write()
93 mtx_unlock(&ps->lock); in pty_client_write()
101 static void pty_make_active_locked(pty_server_t* ps, pty_client_t* pc) { in pty_make_active_locked() argument
103 if (ps->active != pc) { in pty_make_active_locked()
104 if (ps->active) { in pty_make_active_locked()
105 ps->active->flags &= (~PTY_CLI_ACTIVE); in pty_make_active_locked()
106 device_state_clr(ps->active->zxdev, DEV_STATE_WRITABLE); in pty_make_active_locked()
108 ps->active = pc; in pty_make_active_locked()
112 device_state_clr_set(ps->zxdev, DEV_STATE_WRITABLE | DEV_STATE_HANGUP, 0); in pty_make_active_locked()
114 device_state_clr_set(ps->zxdev, DEV_STATE_HANGUP, DEV_STATE_WRITABLE); in pty_make_active_locked()
140 pty_server_t* ps = pc->srv; in pty_client_ioctl() local
150 mtx_lock(&ps->lock); in pty_client_ioctl()
152 mtx_unlock(&ps->lock); in pty_client_ioctl()
160 mtx_lock(&ps->lock); in pty_client_ioctl()
161 wsz->width = ps->width; in pty_client_ioctl()
162 wsz->height = ps->height; in pty_client_ioctl()
163 mtx_unlock(&ps->lock); in pty_client_ioctl()
175 mtx_lock(&ps->lock); in pty_client_ioctl()
177 list_for_every_entry(&ps->clients, c, pty_client_t, node) { in pty_client_ioctl()
179 pty_make_active_locked(ps, c); in pty_client_ioctl()
180 mtx_unlock(&ps->lock); in pty_client_ioctl()
184 mtx_unlock(&ps->lock); in pty_client_ioctl()
194 mtx_lock(&ps->lock); in pty_client_ioctl()
195 uint32_t events = ps->events; in pty_client_ioctl()
196 ps->events = 0; in pty_client_ioctl()
197 if (ps->active == NULL) { in pty_client_ioctl()
202 mtx_unlock(&ps->lock); in pty_client_ioctl()
207 if (ps->ioctl != NULL) { in pty_client_ioctl()
208 return ps->ioctl(ps, op, in_buf, in_len, out_buf, out_len, out_actual); in pty_client_ioctl()
217 pty_server_t* ps = pc->srv; in pty_client_release() local
219 mtx_lock(&ps->lock); in pty_client_release()
224 int refcount = --ps->refcount; in pty_client_release()
226 if (ps->control == pc) { in pty_client_release()
227 ps->control = NULL; in pty_client_release()
229 if (ps->active == pc) { in pty_client_release()
231 if (ps->control) { in pty_client_release()
232 device_state_set(ps->control->zxdev, PTY_SIGNAL_EVENT | DEV_STATE_HANGUP); in pty_client_release()
234 ps->active = NULL; in pty_client_release()
237 if (list_is_empty(&ps->clients)) { in pty_client_release()
238 device_state_clr_set(ps->zxdev, DEV_STATE_WRITABLE, DEV_STATE_READABLE | DEV_STATE_HANGUP); in pty_client_release()
240 mtx_unlock(&ps->lock); in pty_client_release()
243 xprintf("pty srv %p release (from client)\n", ps); in pty_client_release()
244 if (ps->release) { in pty_client_release()
245 ps->release(ps); in pty_client_release()
247 free(ps); in pty_client_release()
257 pty_server_t* ps = pc->srv; in pty_client_openat() local
267 return pty_openat(ps, out, id, flags); in pty_client_openat()
282 static zx_status_t pty_openat(pty_server_t* ps, zx_device_t** out, uint32_t id, uint32_t flags) { in pty_openat() argument
295 mtx_lock(&ps->lock); in pty_openat()
298 list_for_every_entry(&ps->clients, c, pty_client_t, node) { in pty_openat()
300 mtx_unlock(&ps->lock); in pty_openat()
306 list_add_tail(&ps->clients, &pc->node); in pty_openat()
308 ps->refcount++; in pty_openat()
309 mtx_unlock(&ps->lock); in pty_openat()
311 pc->srv = ps; in pty_openat()
321 status = device_add(ps->zxdev, &args, &pc->zxdev); in pty_openat()
327 if (ps->active == NULL) { in pty_openat()
328 pty_make_active_locked(ps, pc); in pty_openat()
331 ps->control = pc; in pty_openat()
335 xprintf("pty cli %p (id=%u) created (srv %p)\n", pc, pc->id, ps); in pty_openat()
337 mtx_lock(&ps->lock); in pty_openat()
342 device_state_clr(ps->zxdev, DEV_STATE_READABLE | DEV_STATE_HANGUP); in pty_openat()
345 mtx_unlock(&ps->lock); in pty_openat()
354 void pty_server_resume_locked(pty_server_t* ps) { in pty_server_resume_locked() argument
355 if (ps->active) { in pty_server_resume_locked()
356 device_state_set(ps->active->zxdev, DEV_STATE_WRITABLE); in pty_server_resume_locked()
360 zx_status_t pty_server_send(pty_server_t* ps, const void* data, size_t len, bool atomic, size_t* ac… in pty_server_send() argument
363 mtx_lock(&ps->lock); in pty_server_send()
364 if (ps->active) { in pty_server_send()
365 pty_client_t* pc = ps->active; in pty_server_send()
387 ps->events |= evt; in pty_server_send()
389 if (ps->control) { in pty_server_send()
390 device_state_set(ps->control->zxdev, PTY_SIGNAL_EVENT); in pty_server_send()
399 device_state_clr(ps->zxdev, DEV_STATE_WRITABLE); in pty_server_send()
406 mtx_unlock(&ps->lock); in pty_server_send()
410 void pty_server_set_window_size(pty_server_t* ps, uint32_t w, uint32_t h) { in pty_server_set_window_size() argument
411 mtx_lock(&ps->lock); in pty_server_set_window_size()
412 ps->width = w; in pty_server_set_window_size()
413 ps->height = h; in pty_server_set_window_size()
415 mtx_unlock(&ps->lock); in pty_server_set_window_size()
419 pty_server_t* ps = ctx; in pty_server_openat() local
421 return pty_openat(ps, out, id, flags); in pty_server_openat()
425 pty_server_t* ps = ctx; in pty_server_release() local
427 mtx_lock(&ps->lock); in pty_server_release()
430 list_for_every_entry(&ps->clients, pc, pty_client_t, node) { in pty_server_release()
434 int32_t refcount = --ps->refcount; in pty_server_release()
435 mtx_unlock(&ps->lock); in pty_server_release()
438 xprintf("pty srv %p release (from server)\n", ps); in pty_server_release()
439 if (ps->release) { in pty_server_release()
440 ps->release(ps); in pty_server_release()
442 free(ps); in pty_server_release()
447 void pty_server_init(pty_server_t* ps) { in pty_server_init() argument
448 mtx_init(&ps->lock, mtx_plain); in pty_server_init()
449 ps->refcount = 1; in pty_server_init()
450 list_initialize(&ps->clients); in pty_server_init()
451 ps->active = NULL; in pty_server_init()
452 ps->control = NULL; in pty_server_init()
453 ps->events = 0; in pty_server_init()
454 ps->width = 0; in pty_server_init()
455 ps->height = 0; in pty_server_init()