# HG changeset patch # User Tero Marttila # Date 1213715743 -10800 # Node ID e2916f8ebaa6433bc306775315648ff0dff500da # Parent 7512207c9041cd7b09b0d193838ef3df8e0a9fea fix memory alloc/free bugs, and one in render_threads where the last row was left out committer: Tero Marttila diff -r 7512207c9041 -r e2916f8ebaa6 node_main.c --- a/node_main.c Tue Jun 17 18:05:08 2008 +0300 +++ b/node_main.c Tue Jun 17 18:15:43 2008 +0300 @@ -65,12 +65,13 @@ void handle_client (int sock) { double duration; - struct render *ctx; + struct render *ctx = NULL; FILE *fh; u_int8_t mode; u_int32_t img_w, img_h; double x1, y1, x2, y2; + struct render_threads *threads_info = NULL; // open it as a FILE* if (!(fh = fdopen(sock, "r+"))) @@ -107,7 +108,6 @@ if (render_io_stream(ctx, fh)) ERROR("render_io_stream"); - struct render_threads *threads_info = NULL; // render threaded \o/ if (!(threads_info = render_threads_alloc(ctx))) @@ -128,7 +128,9 @@ // fall through to just clean up normally error: - // free the threads_info? + if (ctx) + render_free(ctx); + if (threads_info) render_threads_free(threads_info); diff -r 7512207c9041 -r e2916f8ebaa6 render.c --- a/render.c Tue Jun 17 18:05:08 2008 +0300 +++ b/render.c Tue Jun 17 18:15:43 2008 +0300 @@ -19,6 +19,10 @@ return ctx; } +void render_free(struct render *ctx) { + free(ctx); +} + int render_set_mode (struct render *ctx, int mode) { if (mode != RENDER_RAW && mode != RENDER_PNG) return -1; diff -r 7512207c9041 -r e2916f8ebaa6 render.h --- a/render.h Tue Jun 17 18:05:08 2008 +0300 +++ b/render.h Tue Jun 17 18:15:43 2008 +0300 @@ -31,6 +31,7 @@ * Alloc a new render context */ struct render *render_alloc (); +void render_free(struct render *ctx); /* * Clear out the value of the given render context diff -r 7512207c9041 -r e2916f8ebaa6 render_threads.c --- a/render_threads.c Tue Jun 17 18:05:08 2008 +0300 +++ b/render_threads.c Tue Jun 17 18:15:43 2008 +0300 @@ -389,8 +389,8 @@ pthread_mutex_lock(&ctx->process_row_mut); } - // are all the slices done now? - if (ctx->slices_running == 0) { + // are all the rows and slices done now? + if (ctx->slices_running == 0 && ctx->waiting_rows == 0) { // unlock the mutex so the worker threads don't get stuck on it pthread_mutex_unlock(&ctx->process_row_mut); @@ -429,13 +429,13 @@ for (i = 0; i < ctx->slice_count; i++) { if (pthread_cancel(ctx->threads[i].thread)) PWARNING("pthread_cancel(worker:%d)", i); - else { - if (pthread_join(ctx->threads[i].thread, &retval)) { - PWARNING("pthread_join(worker:%d)", i); - } else { - if (retval != PTHREAD_CANCELED) - PWARNING("worker:%d retval = %p", i, retval); - } + + // join it in any case + if (pthread_join(ctx->threads[i].thread, &retval)) { + PWARNING("pthread_join(worker:%d)", i); + } else { + if (retval != PTHREAD_CANCELED) + PWARNING("worker:%d retval = %p", i, retval); } } @@ -509,6 +509,9 @@ if (!(ctx = calloc(1, sizeof(*ctx)))) ERROR("calloc"); + // flag it for free()ing + ctx->owned_by_me = 1; + // init with silent fall-through if (render_threads_init(ctx, render_info)) goto error;