lw_error lw_addr_resolve (lw_addr ctx) { if (ctx->resolver_thread) lw_thread_join (ctx->resolver_thread); return ctx->error; }
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); } }
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); }
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); }