Esempio n. 1
0
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;
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
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);
   }
}