lw_timer lw_timer_new (lw_pump pump) { lw_timer ctx = calloc (sizeof (*ctx), 1); if (!ctx) return 0; ctx->pump = pump; ctx->timer_thread = lw_thread_new ("timer_thread", timer_thread); ctx->stop_event = lw_event_new (); #ifdef _lacewing_use_timerfd ctx->fd = timerfd_create (CLOCK_MONOTONIC, TFD_NONBLOCK); lw_pump_add (ctx->pump, ctx->fd, ctx, (lw_pump_callback) timer_tick, 0, lw_true); #endif return ctx; }
void lw_udp_host_filter (lw_udp ctx, lw_filter filter) { lw_udp_unhost (ctx); lw_error error = lw_error_new (); if ((ctx->fd = lwp_create_server_socket (filter, SOCK_DGRAM, IPPROTO_UDP, error)) == -1) { if (ctx->on_error) ctx->on_error (ctx, error); lw_error_delete (error); return; } lw_error_delete (error); ctx->filter = lw_filter_clone (filter); lw_pump_add (ctx->pump, ctx->fd, ctx, read_ready, 0, lw_true); }
void lw_fdstream_set_fd (lw_fdstream ctx, lw_fd fd, lw_pump_watch watch, lw_bool auto_close) { if (ctx->watch) { lw_pump_remove (lw_stream_pump ((lw_stream) ctx), ctx->watch); ctx->watch = 0; } if ( (ctx->flags & lwp_fdstream_flag_autoclose) && ctx->fd != -1) lw_stream_close ((lw_stream) ctx, lw_true); ctx->fd = fd; if (auto_close) ctx->flags |= lwp_fdstream_flag_autoclose; else ctx->flags &= ~ lwp_fdstream_flag_autoclose; if (ctx->fd == -1) return; fcntl (fd, F_SETFL, fcntl (fd, F_GETFL, 0) | O_NONBLOCK); #if HAVE_DECL_SO_NOSIGPIPE { int b = 1; setsockopt (fd, SOL_SOCKET, SO_NOSIGPIPE, (char *) &b, sizeof (b)); } #endif { int b = (ctx->flags & lwp_fdstream_flag_nagle) ? 0 : 1; setsockopt (fd, SOL_SOCKET, TCP_NODELAY, (char *) &b, sizeof (b)); } struct stat stat; fstat (fd, &stat); if (S_ISSOCK (stat.st_mode)) { ctx->flags |= lwp_fdstream_flag_is_socket; } else { ctx->flags &= ~ lwp_fdstream_flag_is_socket; if ((ctx->size = stat.st_size) > 0) return; /* Not a socket, and size is 0. Is it really just an empty file? */ if (S_ISREG (stat.st_mode)) return; } /* Assuming this is something we can watch for readiness. */ ctx->size = -1; lw_pump pump = lw_stream_pump ((lw_stream) ctx); if (watch) { /* Given an existing pump watch - change it to use our callbacks */ ctx->watch = watch; lw_pump_update_callbacks (pump, ctx->watch, ctx, read_ready, write_ready, lw_true); } else { ctx->watch = lw_pump_add (pump, fd, ctx, read_ready, write_ready, lw_true); } }