summaryrefslogtreecommitdiffstats
path: root/libdimension
diff options
context:
space:
mode:
Diffstat (limited to 'libdimension')
-rw-r--r--libdimension/Makefile.am2
-rw-r--r--libdimension/dimension-impl.h2
-rw-r--r--libdimension/dimension/progress.h14
-rw-r--r--libdimension/progress-impl.h (renamed from libdimension/progress-struct.h)16
-rw-r--r--libdimension/progress.c43
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;