$(TOP_INCDIR)/afs/opr_assert.h \
$(TOP_INCDIR)/opr/jhash.h \
$(TOP_INCDIR)/opr/queue.h \
- $(TOP_INCDIR)/opr/rbtree.h
+ $(TOP_INCDIR)/opr/rbtree.h \
+ $(TOP_INCDIR)/opr/time.h
all: $(HEADERS) $(TOP_LIBDIR)/libopr.a
$(TOP_INCDIR)/opr/rbtree.h: ${srcdir}/rbtree.h
$(INSTALL_DATA) $? $@
+$(TOP_INCDIR)/opr/time.h: ${srcdir}/opr_time.h
+ $(INSTALL_DATA) $? $@
+
clean:
rm -f $(objects) libopr.a
$(INCFILEDIR)\opr_assert.h \
$(DESTDIR)\include\opr\jhash.h \
$(DESTDIR)\include\opr\queue.h \
- $(DESTDIR)\include\opr\rbtree.h
+ $(DESTDIR)\include\opr\rbtree.h \
+ $(DESTDIR)\include\opr\time.h
+
+$(DESTDIR)\include\opr\time.h: opr_time.h
+ $(COPY) $** $@
LIBFILE = $(DESTDIR)\lib\opr.lib
--- /dev/null
+/*
+ * Copyright (c) 2012 Your File System Inc. All rights reserved.
+ */
+
+/* This header provides routines for dealing with the 100ns based AFS
+ * time type. We hide the actual variable behind a structure, so that
+ * attempts to do
+ *
+ * time_t ourTime;
+ * opr_time theirTime;
+ *
+ * ourTime = theirTime;
+ *
+ * will be caught by the compiler.
+ */
+
+#ifndef OPENAFS_OPR_TIME_H
+#define OPENAFS_OPR_TIME_H
+
+struct opr_time {
+ afs_int64 time;
+};
+
+static_inline void
+opr_time_FromSecs(struct opr_time *out, time_t in)
+{
+ out->time = ((afs_int64)in) * 10000000;
+}
+
+static_inline time_t
+opr_time_ToSecs(struct opr_time *in)
+{
+ return in->time/10000000;;
+}
+
+static_inline void
+opr_time_FromMsecs(struct opr_time *out, int msecs)
+{
+ out->time = ((afs_int64)msecs) * 10000;
+}
+
+static_inline int
+opr_time_ToMsecs(struct opr_time *in)
+{
+ return in->time/10000;
+}
+
+static_inline void
+opr_time_FromTimeval(struct opr_time *out, struct timeval *in)
+{
+ out->time = ((afs_int64)in->tv_sec) * 10000000 + in->tv_usec * 10;
+}
+
+static_inline void
+opr_time_ToTimeval(struct opr_time *in, struct timeval *out)
+{
+ out->tv_sec = in->time / 10000000;
+ out->tv_usec = (in->time / 10) % 1000000;
+}
+
+static_inline int
+opr_time_Now(struct opr_time *out)
+{
+ struct timeval tv;
+ int code;
+
+ code = gettimeofday(&tv, NULL);
+ if (code == 0)
+ opr_time_FromTimeval(out, &tv);
+
+ return code;
+}
+
+static_inline int
+opr_time_GreaterThan(struct opr_time *t1, struct opr_time *t2)
+{
+ return t1->time > t2->time;
+}
+
+static_inline int
+opr_time_LessThan(struct opr_time *t1, struct opr_time *t2)
+{
+ return t1->time < t2->time;
+}
+
+static_inline void
+opr_time_Add(struct opr_time *t1, struct opr_time *t2)
+{
+ t1->time += t2->time;
+}
+
+static_inline void
+opr_time_Sub(struct opr_time *t1, struct opr_time *t2)
+{
+ t1->time -= t2->time;
+}
+
+static_inline void
+opr_time_AddMsec(struct opr_time *t1, int msec)
+{
+ struct opr_time t2;
+
+ opr_time_FromMsecs(&t2, msec);
+ opr_time_Add(t1, &t2);
+}
+
+#endif
opr/jhash
opr/queues
opr/rbtree
+opr/time
ptserver/pt_util
ptserver/pts-man
rx/event
/jhash-t
/rbtree-t
/queues-t
+/time-t
LIBS=../tap/libtap.a $(abs_top_builddir)/lib/libopr.a
-tests = jhash-t queues-t rbtree-t
+tests = jhash-t queues-t rbtree-t time-t
all check test tests: $(tests)
jhash-t: jhash-t.o
$(AFS_LDRULE) jhash-t.o ../tap/libtap.a $(XLIBS)
+time-t: time-t.o
+ $(AFS_LDRULE) time-t.o ../tap/libtap.a $(XLIBS)
+
clean distclean:
$(RM) -f $(tests) *.o core
--- /dev/null
+/*
+ * Copyright (c) 2012 Your File System Inc. All rights reserved.
+ */
+
+/* Some trivial tests for the very straightforwards OPR 100ns time
+ * implementation.
+ */
+
+#include <afsconfig.h>
+#include <afs/param.h>
+
+#include <roken.h>
+
+#include <tests/tap/basic.h>
+
+#include <opr/time.h>
+
+int
+main(int argc, char **argv)
+{
+ struct opr_time oprTime;
+ struct timeval osTimeval;
+ time_t osTime, osNow;
+ plan(4);
+
+ /* Check that FromSecs, then ToSecs results in the same value coming out */
+
+ opr_time_FromSecs(&oprTime, 1337065355);
+ osTime = opr_time_ToSecs(&oprTime);
+ ok(osTime == 1337065355, "ToSecs(FromSecs(time)) == time");
+
+ /* Check the FromTimeval, then ToTimeval result in the same value. Note that
+ * our chosen microseconds field is very close to overflow */
+
+ osTimeval.tv_sec = 1337065355;
+ osTimeval.tv_usec = 999;
+ opr_time_FromTimeval(&oprTime, &osTimeval);
+ opr_time_ToTimeval(&oprTime, &osTimeval);
+ ok(osTimeval.tv_sec == 1337065355 && osTimeval.tv_usec == 999,
+ "ToTimeval(FromTimeval(timeval) == timeval)");
+
+ /* Check that opr_time_Now looks reasonable */
+ is_int(0, opr_time_Now(&oprTime), "opr_time_Now succeeds");
+ osNow = time(NULL);
+ osTime = opr_time_ToSecs(&oprTime);
+ ok(abs(osTime - osNow) < 2, "opr_time_Now returns a reasonable value");
+
+ return 0;
+}