示例#1
0
lw_error lw_addr_resolve (lw_addr ctx)
{
   if (ctx->resolver_thread)
      lw_thread_join (ctx->resolver_thread);

   return ctx->error;
}
示例#2
0
void lwp_addr_cleanup (lw_addr ctx)
{
   if (ctx->resolver_thread)
   {
      lw_thread_join (ctx->resolver_thread);
      lw_thread_delete (ctx->resolver_thread);
   }

   free (ctx->hostname_to_free);

   lw_error_delete (ctx->error);

   if (ctx->info_list)
   {
      #ifdef _WIN32
         fn_freeaddrinfo freeaddrinfo = compat_freeaddrinfo ();
      #endif

      freeaddrinfo (ctx->info_list);
   }

   if (ctx->info_to_free)
   {
      free (ctx->info_to_free->ai_addr);
      free (ctx->info_to_free);
   }
}
示例#3
0
void lw_timer_stop (lw_timer ctx)
{
   if (!lw_timer_started (ctx))
      return;

   /* TODO: What if a tick has been posted and this gets destructed? */

   #ifndef _lacewing_use_timerfd

      lw_event_signal (ctx->stop_event);
      lw_thread_join (ctx->timer_thread);
      lw_event_unsignal (ctx->stop_event);

    #endif

    #ifdef USE_KQUEUE

      if (ctx->pump->def == &def_eventpump)
      {
         struct kevent event;

         EV_SET (&event, (uintptr_t) ctx, EVFILT_TIMER, EV_DELETE, 0, 0, ctx);

         if (kevent (((lw_eventpump) ctx->pump)->queue,
                        &event, 1, 0, 0, 0) == -1)
         {
            lwp_trace ("Timer: Failed to remove timer from kqueue: %s",
                            strerror (errno));

            return;
         }
      }
      else
      {
         /* TODO */
      }

    #else
        #ifdef _lacewing_use_timerfd
           struct itimerspec spec = {};
           timerfd_settime (ctx->fd, 0, &spec, 0);
        #endif
    #endif

   ctx->started = lw_false;
   lw_pump_remove_user (ctx->pump);
}
示例#4
0
void lwp_addr_init (lw_addr ctx, const char * hostname,
                    const char * service, long hints)
{
   char * it;

   memset (ctx, 0, sizeof (*ctx));

   ctx->resolver_thread = lw_thread_new ("resolver", (void *) resolver);
   ctx->hints = hints;

   ctx->hostname_to_free = ctx->hostname = strdup (hostname);

   while (isspace (*ctx->hostname))
      ++ ctx->hostname;

   while (isspace (ctx->hostname [strlen (ctx->hostname) - 1]))
      ctx->hostname [strlen (ctx->hostname) - 1] = 0;

   for (it = ctx->hostname; *it; ++ it)
   {
      if (it [0] == ':' && it [1] == '/' && it [2] == '/')
      {
         *it = 0;

         service = ctx->hostname;
         ctx->hostname = it + 3;
      }

      if (*it == ':')
      {
         /* an explicit port overrides the service name */

         service = it + 1;
         *it = 0;
      }
   }

   lwp_copy_string (ctx->service, service, sizeof (ctx->service)); 

   lw_thread_join (ctx->resolver_thread); /* block if the thread is already running */
   lw_thread_start (ctx->resolver_thread, ctx);
}