summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@gmail.com>2009-09-20 01:09:24 +0000
committerTavian Barnes <tavianator@gmail.com>2009-09-20 01:09:24 +0000
commitab843ae81eb445d94ed6821e45df8a782d2886e6 (patch)
tree6004225779a1c9ce9d7915ccbde167a4c25f26d0 /src
parentd69067be2350d635683b524381c3d084498ec7aa (diff)
downloadlibsandglass-ab843ae81eb445d94ed6821e45df8a782d2886e6.tar.xz
Don't change the `ts' parameter in sandglass_spin.
Diffstat (limited to 'src')
-rw-r--r--src/sandglass_impl.h2
-rw-r--r--src/timespec.c6
-rw-r--r--src/tsc.c15
3 files changed, 16 insertions, 7 deletions
diff --git a/src/sandglass_impl.h b/src/sandglass_impl.h
index 07a3616..689c6bf 100644
--- a/src/sandglass_impl.h
+++ b/src/sandglass_impl.h
@@ -41,6 +41,6 @@ void sandglass_get_currtime(struct timespec *ts);
void sandglass_timespec_add(struct timespec *ts, const struct timespec *d);
void sandglass_timespec_sub(struct timespec *ts, const struct timespec *d);
int sandglass_timespec_cmp(const struct timespec *a, const struct timespec *b);
-void sandglass_spin(struct timespec *ts);
+void sandglass_spin(const struct timespec *ts);
#endif /* SANDGLASS_IMPL_H_INCLUDED */ \ No newline at end of file
diff --git a/src/timespec.c b/src/timespec.c
index f8ab791..c077f8b 100644
--- a/src/timespec.c
+++ b/src/timespec.c
@@ -91,7 +91,7 @@ sandglass_timespec_cmp(const struct timespec *a, const struct timespec *b)
/* Spins for the time interval specified by ts */
void
-sandglass_spin(struct timespec *ts)
+sandglass_spin(const struct timespec *ts)
{
struct timespec curr, until;
sandglass_get_currtime(&curr);
@@ -102,8 +102,4 @@ sandglass_spin(struct timespec *ts)
do {
sandglass_get_currtime(&curr);
} while (sandglass_timespec_cmp(&curr, &until) < 0);
-
- /* Adjust ts to the time actually waited */
- sandglass_timespec_sub(&curr, &until);
- sandglass_timespec_add(ts, &curr);
}
diff --git a/src/tsc.c b/src/tsc.c
index 554a6d8..135cd2a 100644
--- a/src/tsc.c
+++ b/src/tsc.c
@@ -29,11 +29,24 @@ sandglass_tsc_resolution()
{
static long tsc = 0;
static struct timespec ts = { .tv_sec = 0, .tv_nsec = 10000000L };
+ struct timespec curr, until;
if (tsc == 0) {
+ sandglass_get_currtime(&curr);
+ until = curr;
+ sandglass_timespec_add(&until, &ts);
tsc = sandglass_get_tsc();
- sandglass_spin(&ts);
+
+ /* Spin */
+ do {
+ sandglass_get_currtime(&curr);
+ } while (sandglass_timespec_cmp(&curr, &until) < 0);
+
tsc = sandglass_get_tsc() - tsc;
+
+ /* Adjust ts to the time actually waited */
+ sandglass_timespec_sub(&curr, &until);
+ sandglass_timespec_add(&ts, &curr);
}
return tsc*1.0e9/ts.tv_nsec;