Lines Matching refs:lsp
34 struct lws_spawn_piped *lsp = lws_container_of(sul, in lws_spawn_timeout() local
39 lws_spawn_piped_kill_child_process(lsp); in lws_spawn_timeout()
45 struct lws_spawn_piped *lsp = lws_container_of(sul, in lws_spawn_sul_reap() local
49 __func__, lsp->reap_retry_budget); in lws_spawn_sul_reap()
50 if (!lws_spawn_reap(lsp) && !lsp->pipes_alive) { in lws_spawn_sul_reap()
51 if (--lsp->reap_retry_budget) { in lws_spawn_sul_reap()
52 lws_sul_schedule(lsp->info.vh->context, lsp->info.tsi, in lws_spawn_sul_reap()
53 &lsp->sul_reap, lws_spawn_sul_reap, in lws_spawn_sul_reap()
57 __func__, lsp); in lws_spawn_sul_reap()
58 lsp->reap_retry_budget = 20; in lws_spawn_sul_reap()
59 lws_spawn_piped_kill_child_process(lsp); in lws_spawn_sul_reap()
113 struct lws_spawn_piped *lsp = *_lsp; in lws_spawn_piped_destroy() local
117 if (!lsp) in lws_spawn_piped_destroy()
121 if (lsp->pipe_fds[n][!!(n == 0)]) { in lws_spawn_piped_destroy()
122 CloseHandle(lsp->pipe_fds[n][n == 0]); in lws_spawn_piped_destroy()
123 lsp->pipe_fds[n][n == 0] = NULL; in lws_spawn_piped_destroy()
127 if (lsp->stdwsi[n]) { in lws_spawn_piped_destroy()
129 wsi = lsp->stdwsi[n]; in lws_spawn_piped_destroy()
130 lsp->stdwsi[n]->desc.filefd = NULL; in lws_spawn_piped_destroy()
131 lsp->stdwsi[n] = NULL; in lws_spawn_piped_destroy()
137 lws_dll2_remove(&lsp->dll); in lws_spawn_piped_destroy()
139 lws_sul_cancel(&lsp->sul); in lws_spawn_piped_destroy()
140 lws_sul_cancel(&lsp->sul_reap); in lws_spawn_piped_destroy()
141 lws_sul_cancel(&lsp->sul_poll); in lws_spawn_piped_destroy()
149 lws_spawn_reap(struct lws_spawn_piped *lsp) in lws_spawn_reap() argument
152 void *opaque = lsp->info.opaque; in lws_spawn_reap()
153 lsp_cb_t cb = lsp->info.reap_cb; in lws_spawn_reap()
158 if (!lsp->child_pid) in lws_spawn_reap()
161 if (!GetExitCodeProcess(lsp->child_pid, &ex)) { in lws_spawn_reap()
174 if (!lsp->reaped) { in lws_spawn_reap()
175 lsp->reaped = lws_now_usecs(); in lws_spawn_reap()
182 lws_sul_schedule(lsp->info.vh->context, lsp->info.tsi, in lws_spawn_reap()
183 &lsp->sul, lws_spawn_timeout, in lws_spawn_reap()
194 if (!lsp->ungraceful && lsp->pipes_alive) { in lws_spawn_reap()
201 lws_sul_cancel(&lsp->sul); in lws_spawn_reap()
210 lsp->child_pid = NULL; in lws_spawn_reap()
214 if (lsp->info.plsp) in lws_spawn_reap()
215 lws_spawn_piped_destroy(lsp->info.plsp); in lws_spawn_reap()
229 lws_spawn_piped_kill_child_process(struct lws_spawn_piped *lsp) in lws_spawn_piped_kill_child_process() argument
231 if (!lsp->child_pid) in lws_spawn_piped_kill_child_process()
234 lsp->ungraceful = 1; /* don't wait for flushing, just kill it */ in lws_spawn_piped_kill_child_process()
236 if (lws_spawn_reap(lsp)) in lws_spawn_piped_kill_child_process()
241 TerminateProcess(lsp->child_pid, 252); in lws_spawn_piped_kill_child_process()
242 lws_spawn_reap(lsp); in lws_spawn_piped_kill_child_process()
252 struct lws_spawn_piped *lsp = lws_container_of(sul, in windows_pipe_poll_hack() local
263 lws_sul_schedule(lsp->context, 0, &lsp->sul_poll, in windows_pipe_poll_hack()
266 wsi = lsp->stdwsi[LWS_STDOUT]; in windows_pipe_poll_hack()
267 wsi1 = lsp->stdwsi[LWS_STDERR]; in windows_pipe_poll_hack()
268 if (wsi && lsp->pipe_fds[LWS_STDOUT][0] != NULL) { in windows_pipe_poll_hack()
269 if (!PeekNamedPipe(lsp->pipe_fds[LWS_STDOUT][0], &c, 1, &br, in windows_pipe_poll_hack()
273 CloseHandle(lsp->stdwsi[LWS_STDOUT]->desc.filefd); in windows_pipe_poll_hack()
274 lsp->pipe_fds[LWS_STDOUT][0] = NULL; in windows_pipe_poll_hack()
275 lsp->stdwsi[LWS_STDOUT]->desc.filefd = NULL; in windows_pipe_poll_hack()
276 lsp->stdwsi[LWS_STDOUT] = NULL; in windows_pipe_poll_hack()
279 if (lsp->stdwsi[LWS_STDIN]) { in windows_pipe_poll_hack()
282 CloseHandle(lsp->stdwsi[LWS_STDIN]->desc.filefd); in windows_pipe_poll_hack()
283 wsi = lsp->stdwsi[LWS_STDIN]; in windows_pipe_poll_hack()
284 lsp->stdwsi[LWS_STDIN]->desc.filefd = NULL; in windows_pipe_poll_hack()
285 lsp->stdwsi[LWS_STDIN] = NULL; in windows_pipe_poll_hack()
286 lsp->pipe_fds[LWS_STDIN][1] = NULL; in windows_pipe_poll_hack()
307 if (wsi1 && lsp->pipe_fds[LWS_STDERR][0]) { in windows_pipe_poll_hack()
308 if (!PeekNamedPipe(lsp->pipe_fds[LWS_STDERR][0], &c, 1, &br, in windows_pipe_poll_hack()
317 lsp->stdwsi[LWS_STDERR]->desc.filefd = NULL; in windows_pipe_poll_hack()
318 lsp->stdwsi[LWS_STDERR] = NULL; in windows_pipe_poll_hack()
319 lsp->pipe_fds[LWS_STDERR][0] = NULL; in windows_pipe_poll_hack()
344 struct lws_spawn_piped *lsp; in lws_spawn_piped() local
360 lsp = lws_zalloc(sizeof(*lsp), __func__); in lws_spawn_piped()
361 if (!lsp) { in lws_spawn_piped()
367 lsp->info = *i; in lws_spawn_piped()
368 lsp->context = context; in lws_spawn_piped()
369 lsp->reap_retry_budget = 20; in lws_spawn_piped()
376 lsp->pipe_fds[n][0] = NULL; in lws_spawn_piped()
377 lsp->pipe_fds[n][1] = NULL; in lws_spawn_piped()
390 if (!CreatePipe(&lsp->pipe_fds[n][0], &lsp->pipe_fds[n][1], in lws_spawn_piped()
396 SetNamedPipeHandleState(lsp->pipe_fds[1][0], &waitmode, NULL, NULL); in lws_spawn_piped()
397 SetNamedPipeHandleState(lsp->pipe_fds[2][0], &waitmode, NULL, NULL); in lws_spawn_piped()
401 if (!SetHandleInformation(&lsp->pipe_fds[n][!n], in lws_spawn_piped()
411 lsp->stdwsi[n] = lws_create_basic_wsi(i->vh->context, i->tsi, in lws_spawn_piped()
413 if (!lsp->stdwsi[n]) { in lws_spawn_piped()
419 &lsp->stdwsi[n]->lc, "nspawn-stdwsi-%d", n); in lws_spawn_piped()
421 lsp->stdwsi[n]->lsp_channel = n; in lws_spawn_piped()
422 lws_vhost_bind_wsi(i->vh, lsp->stdwsi[n]); in lws_spawn_piped()
423 lsp->stdwsi[n]->a.protocol = pcol; in lws_spawn_piped()
424 lsp->stdwsi[n]->a.opaque_user_data = i->opaque; in lws_spawn_piped()
426 lsp->stdwsi[n]->desc.filefd = lsp->pipe_fds[n][!n]; in lws_spawn_piped()
427 lsp->stdwsi[n]->file_desc = 1; in lws_spawn_piped()
430 __func__, lsp->stdwsi[n], n, in lws_spawn_piped()
431 lsp->pipe_fds[n][!!(n == 0)], in lws_spawn_piped()
432 lsp->pipe_fds[n][!(n == 0)]); in lws_spawn_piped()
438 lsp->stdwsi[n]->desc.filefd = lsp->pipe_fds[n][!!(n == 0)]; in lws_spawn_piped()
439 if (fcntl(lsp->pipe_fds[n][!!(n == 0)], F_SETFL, O_NONBLOCK) < 0) { in lws_spawn_piped()
448 lsp->stdwsi[n]->parent = i->opt_parent; in lws_spawn_piped()
449 lsp->stdwsi[n]->sibling_list = i->opt_parent->child_list; in lws_spawn_piped()
450 i->opt_parent->child_list = lsp->stdwsi[n]; in lws_spawn_piped()
454 lsp->stdwsi[LWS_STDIN]->desc.sockfd, in lws_spawn_piped()
455 lsp->stdwsi[LWS_STDOUT]->desc.sockfd, in lws_spawn_piped()
456 lsp->stdwsi[LWS_STDERR]->desc.sockfd); in lws_spawn_piped()
465 lws_sul_schedule(context, 0, &lsp->sul_poll, windows_pipe_poll_hack, in lws_spawn_piped()
491 si.hStdInput = lsp->pipe_fds[LWS_STDIN][0]; in lws_spawn_piped()
492 si.hStdOutput = lsp->pipe_fds[LWS_STDOUT][1]; in lws_spawn_piped()
493 si.hStdError = lsp->pipe_fds[LWS_STDERR][1]; in lws_spawn_piped()
503 lsp->child_pid = pi.hProcess; in lws_spawn_piped()
505 lwsl_notice("%s: lsp %p spawned PID %d\n", __func__, lsp, lsp->child_pid); in lws_spawn_piped()
507 lws_sul_schedule(context, i->tsi, &lsp->sul, lws_spawn_timeout, in lws_spawn_piped()
514 CloseHandle(lsp->pipe_fds[n][n != 0]); in lws_spawn_piped()
516 lsp->pipes_alive = 3; in lws_spawn_piped()
517 lsp->created = lws_now_usecs(); in lws_spawn_piped()
520 lws_dll2_add_head(&lsp->dll, i->owner); in lws_spawn_piped()
523 lws_sul_schedule(context, i->tsi, &lsp->sul, in lws_spawn_piped()
526 return lsp; in lws_spawn_piped()
530 lws_sul_cancel(&lsp->sul_poll); in lws_spawn_piped()
533 __remove_wsi_socket_from_fds(lsp->stdwsi[n]); in lws_spawn_piped()
536 if (lsp->stdwsi[n]) in lws_spawn_piped()
537 __lws_free_wsi(lsp->stdwsi[n]); in lws_spawn_piped()
541 if (lsp->pipe_fds[n][0] >= 0) in lws_spawn_piped()
542 CloseHandle(lsp->pipe_fds[n][0]); in lws_spawn_piped()
543 if (lsp->pipe_fds[n][1] >= 0) in lws_spawn_piped()
544 CloseHandle(lsp->pipe_fds[n][1]); in lws_spawn_piped()
547 lws_free(lsp); in lws_spawn_piped()
555 lws_spawn_stdwsi_closed(struct lws_spawn_piped *lsp, struct lws *wsi) in lws_spawn_stdwsi_closed() argument
559 assert(lsp); in lws_spawn_stdwsi_closed()
560 lsp->pipes_alive--; in lws_spawn_stdwsi_closed()
561 lwsl_debug("%s: pipes alive %d\n", __func__, lsp->pipes_alive); in lws_spawn_stdwsi_closed()
562 if (!lsp->pipes_alive) in lws_spawn_stdwsi_closed()
563 lws_sul_schedule(lsp->info.vh->context, lsp->info.tsi, in lws_spawn_stdwsi_closed()
564 &lsp->sul_reap, lws_spawn_sul_reap, 1); in lws_spawn_stdwsi_closed()
567 if (lsp->stdwsi[n] == wsi) in lws_spawn_stdwsi_closed()
568 lsp->stdwsi[n] = NULL; in lws_spawn_stdwsi_closed()