diff options
author | Tavian Barnes <tavianator@gmail.com> | 2010-09-29 17:49:49 -0400 |
---|---|---|
committer | Tavian Barnes <tavianator@gmail.com> | 2010-09-29 19:03:03 -0400 |
commit | cec47afae217cea36779d7dea4437b35dee63be2 (patch) | |
tree | c02e964d1381da9543733981040615984743edad | |
parent | 140afde9d7096bea0f8d5f6a04e5c41dd37ab40b (diff) | |
download | dimension-cec47afae217cea36779d7dea4437b35dee63be2.tar.xz |
Make parts of the progress API internal.
-rw-r--r-- | libdimension/Makefile.am | 2 | ||||
-rw-r--r-- | libdimension/dimension-impl.h | 2 | ||||
-rw-r--r-- | libdimension/dimension/progress.h | 14 | ||||
-rw-r--r-- | libdimension/progress-impl.h (renamed from libdimension/progress-struct.h) | 16 | ||||
-rw-r--r-- | libdimension/progress.c | 43 |
5 files changed, 33 insertions, 44 deletions
diff --git a/libdimension/Makefile.am b/libdimension/Makefile.am index 73fb010..36517ee 100644 --- a/libdimension/Makefile.am +++ b/libdimension/Makefile.am @@ -75,7 +75,7 @@ libdimension_la_SOURCES = $(nobase_include_HEADERS) \ platform.h \ point_light.c \ progress.c \ - progress-struct.h \ + progress-impl.h \ prtree.c \ prtree.h \ raytrace.c \ diff --git a/libdimension/dimension-impl.h b/libdimension/dimension-impl.h index 0329dbc..7d1f943 100644 --- a/libdimension/dimension-impl.h +++ b/libdimension/dimension-impl.h @@ -23,7 +23,7 @@ #define _GNU_SOURCE #include "dimension.h" -#include "progress-struct.h" +#include "progress-impl.h" #include "platform.h" #include "threads.h" #include "prtree.h" diff --git a/libdimension/dimension/progress.h b/libdimension/dimension/progress.h index 53dfc37..043f014 100644 --- a/libdimension/dimension/progress.h +++ b/libdimension/dimension/progress.h @@ -30,12 +30,7 @@ typedef struct dmnsn_progress dmnsn_progress; -/* Allocate a new progress object */ -dmnsn_progress *dmnsn_new_progress(void); -/* For failed returns from *_async() functions */ -void dmnsn_delete_progress(dmnsn_progress *progress); - -/* Join the worker thread and returns it's integer return value in addition to +/* Join the worker thread and return it's integer return value in addition to deleting `progress' */ int dmnsn_finish_progress(dmnsn_progress *progress); @@ -44,11 +39,4 @@ double dmnsn_get_progress(const dmnsn_progress *progress); /* Wait for the progress to be >= prog, in a better way than spinlocking */ void dmnsn_wait_progress(const dmnsn_progress *progress, double prog); -/* Create a new level of loop nesting */ -void dmnsn_new_progress_element(dmnsn_progress *progress, unsigned int total); -/* Increment the progress counter; should only be called from innermost loop */ -void dmnsn_increment_progress(dmnsn_progress *progress); -/* Instantly complete the progress */ -void dmnsn_done_progress(dmnsn_progress *progress); - #endif /* DIMENSION_PROGRESS_H */ diff --git a/libdimension/progress-struct.h b/libdimension/progress-impl.h index 06c63be..ef5ad42 100644 --- a/libdimension/progress-struct.h +++ b/libdimension/progress-impl.h @@ -18,8 +18,18 @@ * <http://www.gnu.org/licenses/>. * *************************************************************************/ -#ifndef DIMENSION_IMPL_PROGRESS_STRUCT_H -#define DIMENSION_IMPL_PROGRESS_STRUCT_H +#ifndef DIMENSION_IMPL_PROGRESS_H +#define DIMENSION_IMPL_PROGRESS_H + +/* Allocate a new progress object */ +dmnsn_progress *dmnsn_new_progress(void); + +/* Create a new level of loop nesting */ +void dmnsn_new_progress_element(dmnsn_progress *progress, unsigned int total); +/* Increment the progress counter; should only be called from innermost loop */ +void dmnsn_increment_progress(dmnsn_progress *progress); +/* Instantly complete the progress */ +void dmnsn_done_progress(dmnsn_progress *progress); struct dmnsn_progress { /* Array of progress elements. Progress is given by P(0), where @@ -41,4 +51,4 @@ struct dmnsn_progress { volatile double *min_waitp; /* Hack for const values */ }; -#endif /* DIMENSION_IMPL_PROGRESS_STRUCT_H */ +#endif /* DIMENSION_IMPL_PROGRESS_H */ diff --git a/libdimension/progress.c b/libdimension/progress.c index aeac2ac..f7a8b62 100644 --- a/libdimension/progress.c +++ b/libdimension/progress.c @@ -65,29 +65,6 @@ dmnsn_new_progress() return progress; } -/* Delete a dmnsn_progress*, which has not yet been associated with a thread */ -void -dmnsn_delete_progress(dmnsn_progress *progress) -{ - if (progress) { - if (pthread_rwlock_destroy(progress->rwlock) != 0) { - dmnsn_error(DMNSN_SEVERITY_LOW, "Leaking rwlock."); - } - if (pthread_mutex_destroy(progress->mutex) != 0) { - dmnsn_error(DMNSN_SEVERITY_LOW, "Leaking mutex."); - } - if (pthread_cond_destroy(progress->cond) != 0) { - dmnsn_error(DMNSN_SEVERITY_LOW, "Leaking condition variable."); - } - - dmnsn_free(progress->rwlock); - dmnsn_free(progress->mutex); - dmnsn_free(progress->cond); - dmnsn_delete_array(progress->elements); - dmnsn_free(progress); - } -} - /* Join the worker thread and delete `progress'. */ int dmnsn_finish_progress(dmnsn_progress *progress) @@ -96,6 +73,7 @@ dmnsn_finish_progress(dmnsn_progress *progress) int retval = -1; if (progress) { + /* Get the thread's return value */ if (pthread_join(progress->thread, &ptr) != 0) { /* Medium severity because an unjoined thread likely means that the thread is incomplete or invalid */ @@ -103,10 +81,23 @@ dmnsn_finish_progress(dmnsn_progress *progress) } else if (ptr) { retval = *(int *)ptr; dmnsn_free(ptr); - /* Wake up all waiters */ - dmnsn_done_progress(progress); } - dmnsn_delete_progress(progress); + + /* Free the progress object */ + if (pthread_rwlock_destroy(progress->rwlock) != 0) { + dmnsn_error(DMNSN_SEVERITY_LOW, "Leaking rwlock."); + } + if (pthread_mutex_destroy(progress->mutex) != 0) { + dmnsn_error(DMNSN_SEVERITY_LOW, "Leaking mutex."); + } + if (pthread_cond_destroy(progress->cond) != 0) { + dmnsn_error(DMNSN_SEVERITY_LOW, "Leaking condition variable."); + } + dmnsn_free(progress->rwlock); + dmnsn_free(progress->mutex); + dmnsn_free(progress->cond); + dmnsn_delete_array(progress->elements); + dmnsn_free(progress); } return retval; |