free ctx fields when error occurs during creation

dev
Paul Cruz 2017-07-05 10:20:56 -07:00
parent 5df4cb0530
commit 9ccd55f3a8
1 changed files with 34 additions and 23 deletions

View File

@ -47,6 +47,34 @@ typedef struct {
FILE* dstFile; FILE* dstFile;
} adaptCCtx; } adaptCCtx;
static void freeCompressionJobs(adaptCCtx* ctx)
{
unsigned u;
for (u=0; u<ctx->numJobs; u++) {
jobDescription job = ctx->jobs[u];
free(job.dst.start);
free(job.src.start);
}
}
static int freeCCtx(adaptCCtx* ctx)
{
{
int const completedMutexError = pthread_mutex_destroy(&ctx->jobCompleted_mutex);
int const completedCondError = pthread_cond_destroy(&ctx->jobCompleted_cond);
int const readyMutexError = pthread_mutex_destroy(&ctx->jobReady_mutex);
int const readyCondError = pthread_cond_destroy(&ctx->jobReady_cond);
int const allJobsMutexError = pthread_mutex_destroy(&ctx->allJobsCompleted_mutex);
int const allJobsCondError = pthread_cond_destroy(&ctx->allJobsCompleted_cond);
int const fileCloseError = ctx->dstFile != NULL ? fclose(ctx->dstFile) : 0;
if (ctx->jobs){
freeCompressionJobs(ctx);
free(ctx->jobs);
}
return completedMutexError | completedCondError | readyMutexError | readyCondError | fileCloseError | allJobsMutexError | allJobsCondError;
}
}
static adaptCCtx* createCCtx(unsigned numJobs, const char* const outFilename) static adaptCCtx* createCCtx(unsigned numJobs, const char* const outFilename)
{ {
@ -80,12 +108,14 @@ static adaptCCtx* createCCtx(unsigned numJobs, const char* const outFilename)
ctx->allJobsCompleted = 0; ctx->allJobsCompleted = 0;
if (!ctx->jobs) { if (!ctx->jobs) {
DISPLAY("Error: could not allocate space for jobs during context creation\n"); DISPLAY("Error: could not allocate space for jobs during context creation\n");
freeCCtx(ctx);
return NULL; return NULL;
} }
{ {
FILE* dstFile = fopen(outFilename, "wb"); FILE* dstFile = fopen(outFilename, "wb");
if (dstFile == NULL) { if (dstFile == NULL) {
DISPLAY("Error: could not open output file\n"); DISPLAY("Error: could not open output file\n");
freeCCtx(ctx);
return NULL; return NULL;
} }
ctx->dstFile = dstFile; ctx->dstFile = dstFile;
@ -93,35 +123,15 @@ static adaptCCtx* createCCtx(unsigned numJobs, const char* const outFilename)
return ctx; return ctx;
} }
static void freeCompressionJobs(adaptCCtx* ctx)
{
unsigned u;
for (u=0; u<ctx->numJobs; u++) {
jobDescription job = ctx->jobs[u];
free(job.dst.start);
free(job.src.start);
}
}
static int freeCCtx(adaptCCtx* ctx)
static void waitUntilAllJobsCompleted(adaptCCtx* ctx)
{ {
pthread_mutex_lock(&ctx->allJobsCompleted_mutex); pthread_mutex_lock(&ctx->allJobsCompleted_mutex);
while (ctx->allJobsCompleted == 0) { while (ctx->allJobsCompleted == 0) {
pthread_cond_wait(&ctx->allJobsCompleted_cond, &ctx->allJobsCompleted_mutex); pthread_cond_wait(&ctx->allJobsCompleted_cond, &ctx->allJobsCompleted_mutex);
} }
pthread_mutex_unlock(&ctx->allJobsCompleted_mutex); pthread_mutex_unlock(&ctx->allJobsCompleted_mutex);
{
int const completedMutexError = pthread_mutex_destroy(&ctx->jobCompleted_mutex);
int const completedCondError = pthread_cond_destroy(&ctx->jobCompleted_cond);
int const readyMutexError = pthread_mutex_destroy(&ctx->jobReady_mutex);
int const readyCondError = pthread_cond_destroy(&ctx->jobReady_cond);
int const allJobsMutexError = pthread_mutex_destroy(&ctx->allJobsCompleted_mutex);
int const allJobsCondError = pthread_cond_destroy(&ctx->allJobsCompleted_cond);
int const fileError = fclose(ctx->dstFile);
freeCompressionJobs(ctx);
free(ctx->jobs);
return completedMutexError | completedCondError | readyMutexError | readyCondError | fileError | allJobsMutexError | allJobsCondError;
}
} }
static void* compressionThread(void* arg) static void* compressionThread(void* arg)
@ -140,7 +150,7 @@ static void* compressionThread(void* arg)
size_t const compressedSize = ZSTD_compress(job->dst.start, job->dst.size, job->src.start, job->src.size, job->compressionLevel); size_t const compressedSize = ZSTD_compress(job->dst.start, job->dst.size, job->src.start, job->src.size, job->compressionLevel);
if (ZSTD_isError(compressedSize)) { if (ZSTD_isError(compressedSize)) {
ctx->threadError = 1; ctx->threadError = 1;
DISPLAY("Error: somethign went wrong during compression\n"); DISPLAY("Error: something went wrong during compression: %s\n", ZSTD_getErrorName(compressedSize));
return arg; return arg;
} }
job->compressedSize = compressedSize; job->compressedSize = compressedSize;
@ -329,6 +339,7 @@ int main(int argCount, const char* argv[])
} }
cleanup: cleanup:
waitUntilAllJobsCompleted(ctx);
/* file compression completed */ /* file compression completed */
ret |= (srcFile != NULL) ? fclose(srcFile) : 0; ret |= (srcFile != NULL) ? fclose(srcFile) : 0;
ret |= (ctx != NULL) ? freeCCtx(ctx) : 0; ret |= (ctx != NULL) ? freeCCtx(ctx) : 0;