summaryrefslogtreecommitdiffstats
path: root/cpukit/posix/src/posixtimespecsubtract.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/posix/src/posixtimespecsubtract.c')
-rw-r--r--cpukit/posix/src/posixtimespecsubtract.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/cpukit/posix/src/posixtimespecsubtract.c b/cpukit/posix/src/posixtimespecsubtract.c
new file mode 100644
index 0000000000..0fa611b6ea
--- /dev/null
+++ b/cpukit/posix/src/posixtimespecsubtract.c
@@ -0,0 +1,50 @@
+/*
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <assert.h>
+#include <time.h>
+#include <errno.h>
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/tod.h>
+
+#include <rtems/seterr.h>
+#include <rtems/posix/time.h>
+
+/*PAGE
+ *
+ * _POSIX_Timespec_subtract
+ */
+
+void _POSIX_Timespec_subtract(
+ const struct timespec *the_start,
+ const struct timespec *end,
+ struct timespec *result
+)
+{
+ struct timespec start_struct = *the_start;
+ struct timespec *start = &start_struct;
+ uint32_t nsecs_per_sec = TOD_NANOSECONDS_PER_SECOND;
+
+ if (end->tv_nsec < start->tv_nsec) {
+ int seconds = (start->tv_nsec - end->tv_nsec) / nsecs_per_sec + 1;
+ start->tv_nsec -= nsecs_per_sec * seconds;
+ start->tv_sec += seconds;
+ }
+
+ if (end->tv_nsec - start->tv_nsec > nsecs_per_sec) {
+ int seconds = (start->tv_nsec - end->tv_nsec) / nsecs_per_sec;
+ start->tv_nsec += nsecs_per_sec * seconds;
+ start->tv_sec -= seconds;
+ }
+
+ result->tv_sec = end->tv_sec - start->tv_sec;
+ result->tv_nsec = end->tv_nsec - start->tv_nsec;
+}