# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
-AC_INIT([Tachyon], [0.1], [arjen@androemda.nl])
+AC_INIT([Tachyon], [1.0], [arjen@androemda.nl])
AM_INIT_AUTOMAKE([-Wall foreign])
AC_CONFIG_MACRO_DIRS([m4])
include_HEADERS = Tachyon.h
+libTachyon_la_LDFLAGS = -release 1.0.0
+
LDADD = -lboost_program_options libTachyon.la
accellerate(atof(message+1));
break;
+ case 'T':
+ settime(atol(message+1));
+ break;
+
default:
// Invalid message.
break;
time_t Tachyon::time(void)
{
+ timespec virtual_time;
+
+ virtual_time = gettime();
+
+ return virtual_time.tv_sec;
}
// calculate the currect virtual time
void Tachyon::settime(time_t sec)
{
+ timespec desired_time;
+
+ desired_time.tv_sec = sec;
+ desired_time.tv_nsec = 0;
+
+ offset = offset + desired_time - gettime();
+
+ // send to the Tachyon object in another process.
+ if (queue_name[0] == '\0')
+ {
+ char message[MAX_MESSAGE_SIZE];
+
+ sprintf(message, "T%d", sec);
+ mq_send(msg_queue, message, strlen(message), 100);
+ }
}
void Tachyon::accellerate(double factor)
("help,h", "produce help message")
("tachyon-name", po::value<std::string>(), "tachyon name")
("accelleration,a", po::value<double>(), "set time acceleration factor")
- ("time,t", po::value<int>(), "set time value in seconds")
+ ("time,t", po::value<time_t>(), "set time value in seconds")
;
po::positional_options_description p;
double factor = vm["accelleration"].as<double>();
t.accellerate(factor);
}
+
+ if (vm.count("time"))
+ {
+ time_t newtime = vm["time"].as<time_t>();
+ t.settime(newtime);
+ }
}
else
{
-TESTS = create timespec sleep accellerate accellerate_multi sleep_float accellerate_float accellerate_signal
+TESTS = create timespec sleep accellerate accellerate_multi sleep_float accellerate_float accellerate_signal settime remote_settime
AM_CPPFLAGS = -I../src
LDADD = ../src/.libs/libTachyon.la -lrt -lm
-check_PROGRAMS = create timespec sleep sleep_float sleep_signal
+check_PROGRAMS = create timespec sleep sleep_float sleep_signal settime wait_for_time
create_SOURCES = create.cpp
sleep_SOURCES = sleep.cpp
sleep_float_SOURCES = sleep_float.cpp
sleep_signal_SOURCES = sleep_signal.cpp
+settime_SOURCES = settime.cpp
+wait_for_time_SOURCES = wait_for_time.cpp
clean-local:
rm -f sleep.tmp
--- /dev/null
+#!/bin/bash
+#
+# Test setting the virtual time
+#
+set +x
+set -m
+
+PATH=../src:$PATH
+
+which tachyon
+
+START_TIME=`date +%s`
+./wait_for_time >sleep.tmp &
+sleep 1
+read a b c TACHYON_NAME <sleep.tmp
+echo Tachyon name: $TACHYON_NAME
+tachyon -t 2000000000 $TACHYON_NAME
+fg
+STATUS=$?
+echo "Wait for time returns $STATUS"
+END_TIME=`date +%s`
+duration=$(($END_TIME - $START_TIME))
+echo "Elapsed time is $duration"
+cat sleep.tmp
+
+if [[ $duration -eq 1 ]] || [[ $duration -eq 2 ]]
+then
+ echo "Elapsed time within 2 seconds"
+ exit 0
+fi
+echo "Elapsed time $duration seconds is unexpected."
+exit 1
--- /dev/null
+#include <unistd.h>
+#include <iostream>
+#include "Tachyon.h"
+
+/* Test setting the time to a different value */
+
+int main()
+{
+
+ Tachyon timebase;
+ time_t newtime;
+
+ std::cout << "Tachyon name is " << timebase.name() << "\n";
+ std::cout.flush();
+
+ newtime = 2000000000;
+
+ std::cout << "Setting time to " << newtime << "\n";
+ timebase.settime(newtime);
+
+ std::cout << "Virtual time is now " << timebase.time() << "\n";
+
+ sleep(5);
+
+ std::cout << "After 5 seconds, virtual time is " << timebase.time() << "\n";
+
+}
--- /dev/null
+#include <unistd.h>
+#include <iostream>
+#include "Tachyon.h"
+
+/*
+ * Test setting the time by another process
+ * Wait until the virtual time reached a point in the future.
+ * A different process will set the time we're wating for.
+ */
+
+int main()
+{
+
+ Tachyon timebase;
+ int poll = 0;
+
+ std::cout << "Tachyon name is " << timebase.name() << "\n";
+ std::cout.flush();
+
+ while (timebase.time() < 2000000000 && poll < 30)
+ {
+ sleep(1);
+ poll++;
+ }
+
+ if (poll >= 30)
+ {
+ std::cout << "Timeout after 30 seconds.\n";
+ return 1;
+ }
+ else
+ {
+ std::cout << "Virtual time has passed.\n";
+ return 0;
+ }
+}