Fix segfault after thread manager start failure

This should fix the segmentation fault in issue #10 but not the
underlying reason why the thread manager fails to start in the first
place.

Issue:          #10
Reported by:    linuxton
pull/13/head
Daniel Roethlisberger 11 years ago
parent a94dbc8c3a
commit 080604e3c2

@ -405,10 +405,16 @@ proxy_free(proxy_ctx_t *ctx)
proxy_listener_ctx_free(ctx->lctx);
}
for (size_t i = 0; i < (sizeof(ctx->sev) / sizeof(ctx->sev[0])); i++) {
event_free(ctx->sev[i]);
if (ctx->sev[i]) {
event_free(ctx->sev[i]);
}
}
if (ctx->thrmgr) {
pxy_thrmgr_free(ctx->thrmgr);
}
if (ctx->evbase) {
event_base_free(ctx->evbase);
}
pxy_thrmgr_free(ctx->thrmgr);
event_base_free(ctx->evbase);
free(ctx);
}

@ -176,9 +176,10 @@ leave:
idx--;
}
pthread_mutex_destroy(&ctx->mutex);
if (ctx->thr)
if (ctx->thr) {
free(ctx->thr);
free(ctx);
ctx->thr = NULL;
}
return -1;
}
@ -188,20 +189,24 @@ leave:
void
pxy_thrmgr_free(pxy_thrmgr_ctx_t *ctx)
{
if (!ctx)
return;
pthread_mutex_destroy(&ctx->mutex);
for (int idx = 0; idx < ctx->num_thr; idx++) {
event_base_loopbreak(ctx->thr[idx]->evbase);
sched_yield();
}
for (int idx = 0; idx < ctx->num_thr; idx++) {
pthread_join(ctx->thr[idx]->thr, NULL);
}
for (int idx = 0; idx < ctx->num_thr; idx++) {
evdns_base_free(ctx->thr[idx]->dnsbase, 0);
event_base_free(ctx->thr[idx]->evbase);
free(ctx->thr[idx]);
if (ctx->thr) {
for (int idx = 0; idx < ctx->num_thr; idx++) {
event_base_loopbreak(ctx->thr[idx]->evbase);
sched_yield();
}
for (int idx = 0; idx < ctx->num_thr; idx++) {
pthread_join(ctx->thr[idx]->thr, NULL);
}
for (int idx = 0; idx < ctx->num_thr; idx++) {
evdns_base_free(ctx->thr[idx]->dnsbase, 0);
event_base_free(ctx->thr[idx]->evbase);
free(ctx->thr[idx]);
}
free(ctx->thr);
}
free(ctx->thr);
free(ctx);
}

Loading…
Cancel
Save