Browse Source

tpws: fix cleanup in resolver_init

pull/181/head
bol-van 1 year ago
parent
commit
f94703a866
  1. 80
      tpws/resolver.c

80
tpws/resolver.c

@ -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)

Loading…
Cancel
Save