|
|
@ -133,6 +133,36 @@ static void sigbreak(int sig) |
|
|
|
{ |
|
|
|
} |
|
|
|
|
|
|
|
void resolver_deinit(void) |
|
|
|
{ |
|
|
|
if (resolver.bInit) |
|
|
|
{ |
|
|
|
resolver.bStop = true; |
|
|
|
|
|
|
|
// wait all threads to terminate
|
|
|
|
for (int t = 0; t < resolver.threads; t++) |
|
|
|
pthread_kill(resolver.thread[t], SIGUSR1); |
|
|
|
for (int t = 0; t < resolver.threads; t++) |
|
|
|
{ |
|
|
|
pthread_kill(resolver.thread[t], SIGUSR1); |
|
|
|
pthread_join(resolver.thread[t], NULL); |
|
|
|
} |
|
|
|
|
|
|
|
pthread_mutex_destroy(&resolver.resolve_list_lock); |
|
|
|
free(resolver.thread); |
|
|
|
|
|
|
|
#ifdef __APPLE__ |
|
|
|
sem_close(resolver.sem); |
|
|
|
#else |
|
|
|
sem_destroy(resolver.sem); |
|
|
|
#endif |
|
|
|
|
|
|
|
resolver_clear_list(); |
|
|
|
|
|
|
|
memset(&resolver,0,sizeof(resolver)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
bool resolver_init(int threads, int fd_signal_pipe) |
|
|
|
{ |
|
|
|
int t; |
|
|
@ -152,7 +182,7 @@ bool resolver_init(int threads, int fd_signal_pipe) |
|
|
|
if (resolver.sem==SEM_FAILED) |
|
|
|
{ |
|
|
|
perror("sem_open"); |
|
|
|
return false; |
|
|
|
goto ex; |
|
|
|
} |
|
|
|
// unlink immediately to remove tails
|
|
|
|
sem_unlink(sn); |
|
|
@ -160,20 +190,19 @@ bool resolver_init(int threads, int fd_signal_pipe) |
|
|
|
if (sem_init(&resolver._sem,0,0)==-1) |
|
|
|
{ |
|
|
|
perror("sem_init"); |
|
|
|
return false; |
|
|
|
goto ex; |
|
|
|
} |
|
|
|
resolver.sem = &resolver._sem; |
|
|
|
#endif |
|
|
|
|
|
|
|
if (pthread_mutex_init(&resolver.resolve_list_lock, NULL)) return false; |
|
|
|
if (pthread_mutex_init(&resolver.resolve_list_lock, NULL)) goto ex; |
|
|
|
|
|
|
|
resolver.bStop = false; |
|
|
|
resolver.fd_signal_pipe = fd_signal_pipe; |
|
|
|
TAILQ_INIT(&resolver.resolve_list); |
|
|
|
|
|
|
|
// start as many threads as we can up to specified number
|
|
|
|
resolver.thread = malloc(sizeof(pthread_t)*threads); |
|
|
|
if (!resolver.thread) goto ex1; |
|
|
|
if (!resolver.thread) goto ex; |
|
|
|
|
|
|
|
memset(&action,0,sizeof(action)); |
|
|
|
action.sa_handler = sigbreak; |
|
|
@ -181,12 +210,12 @@ bool resolver_init(int threads, int fd_signal_pipe) |
|
|
|
|
|
|
|
|
|
|
|
pthread_attr_t attr; |
|
|
|
if (pthread_attr_init(&attr)) goto ex2; |
|
|
|
if (pthread_attr_init(&attr)) goto ex; |
|
|
|
// set minimum thread stack size
|
|
|
|
if (pthread_attr_setstacksize(&attr,20480)) |
|
|
|
{ |
|
|
|
pthread_attr_destroy(&attr); |
|
|
|
goto ex2; |
|
|
|
goto ex; |
|
|
|
} |
|
|
|
for(t=0, resolver.threads=threads ; t<threads ; t++) |
|
|
|
{ |
|
|
@ -197,46 +226,15 @@ bool resolver_init(int threads, int fd_signal_pipe) |
|
|
|
} |
|
|
|
} |
|
|
|
pthread_attr_destroy(&attr); |
|
|
|
if (!resolver.threads) goto ex2; |
|
|
|
if (!resolver.threads) goto ex; |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
ex2: |
|
|
|
free(resolver.thread); |
|
|
|
ex1: |
|
|
|
pthread_mutex_destroy(&resolver.resolve_list_lock); |
|
|
|
ex: |
|
|
|
resolver_deinit(); |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
void resolver_deinit(void) |
|
|
|
{ |
|
|
|
if (resolver.bInit) |
|
|
|
{ |
|
|
|
resolver.bStop = true; |
|
|
|
|
|
|
|
// wait all threads to terminate
|
|
|
|
for (int t = 0; t < resolver.threads; t++) |
|
|
|
pthread_kill(resolver.thread[t], SIGUSR1); |
|
|
|
for (int t = 0; t < resolver.threads; t++) |
|
|
|
{ |
|
|
|
pthread_kill(resolver.thread[t], SIGUSR1); |
|
|
|
pthread_join(resolver.thread[t], NULL); |
|
|
|
} |
|
|
|
|
|
|
|
pthread_mutex_destroy(&resolver.resolve_list_lock); |
|
|
|
free(resolver.thread); |
|
|
|
|
|
|
|
#ifdef __APPLE__ |
|
|
|
sem_close(resolver.sem); |
|
|
|
#else |
|
|
|
sem_destroy(resolver.sem); |
|
|
|
#endif |
|
|
|
|
|
|
|
resolver_clear_list(); |
|
|
|
|
|
|
|
memset(&resolver,0,sizeof(resolver)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
struct resolve_item *resolver_queue(const char *dom, uint16_t port, void *ptr) |
|
|
|