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) bool resolver_init(int threads, int fd_signal_pipe)
{ {
int t; int t;
@ -152,7 +182,7 @@ bool resolver_init(int threads, int fd_signal_pipe)
if (resolver.sem==SEM_FAILED) if (resolver.sem==SEM_FAILED)
{ {
perror("sem_open"); perror("sem_open");
return false; goto ex;
} }
// unlink immediately to remove tails // unlink immediately to remove tails
sem_unlink(sn); sem_unlink(sn);
@ -160,20 +190,19 @@ bool resolver_init(int threads, int fd_signal_pipe)
if (sem_init(&resolver._sem,0,0)==-1) if (sem_init(&resolver._sem,0,0)==-1)
{ {
perror("sem_init"); perror("sem_init");
return false; goto ex;
} }
resolver.sem = &resolver._sem; resolver.sem = &resolver._sem;
#endif #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; resolver.fd_signal_pipe = fd_signal_pipe;
TAILQ_INIT(&resolver.resolve_list); TAILQ_INIT(&resolver.resolve_list);
// start as many threads as we can up to specified number // start as many threads as we can up to specified number
resolver.thread = malloc(sizeof(pthread_t)*threads); resolver.thread = malloc(sizeof(pthread_t)*threads);
if (!resolver.thread) goto ex1; if (!resolver.thread) goto ex;
memset(&action,0,sizeof(action)); memset(&action,0,sizeof(action));
action.sa_handler = sigbreak; action.sa_handler = sigbreak;
@ -181,12 +210,12 @@ bool resolver_init(int threads, int fd_signal_pipe)
pthread_attr_t attr; pthread_attr_t attr;
if (pthread_attr_init(&attr)) goto ex2; if (pthread_attr_init(&attr)) goto ex;
// set minimum thread stack size // set minimum thread stack size
if (pthread_attr_setstacksize(&attr,20480)) if (pthread_attr_setstacksize(&attr,20480))
{ {
pthread_attr_destroy(&attr); pthread_attr_destroy(&attr);
goto ex2; goto ex;
} }
for(t=0, resolver.threads=threads ; t<threads ; t++) 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); pthread_attr_destroy(&attr);
if (!resolver.threads) goto ex2; if (!resolver.threads) goto ex;
return true; return true;
ex2: ex:
free(resolver.thread); resolver_deinit();
ex1:
pthread_mutex_destroy(&resolver.resolve_list_lock);
return false; 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) struct resolve_item *resolver_queue(const char *dom, uint16_t port, void *ptr)

Loading…
Cancel
Save