From: Arjen Baart Date: Tue, 28 Jul 2020 16:25:47 +0000 (+0200) Subject: Handle setting the virtual time X-Git-Tag: 1.0^0 X-Git-Url: http://www.andromeda.nl/gitweb/?a=commitdiff_plain;h=169a5aa00fcfa3bdd02c628e140c5362145c9b38;p=Tachyon.git Handle setting the virtual time --- diff --git a/configure.ac b/configure.ac index c5be2c3..39535ac 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ # 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]) diff --git a/src/Makefile.am b/src/Makefile.am index 5e1c993..920e586 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -6,4 +6,6 @@ tachyon_SOURCES = tachyon.cpp include_HEADERS = Tachyon.h +libTachyon_la_LDFLAGS = -release 1.0.0 + LDADD = -lboost_program_options libTachyon.la diff --git a/src/Tachyon.cpp b/src/Tachyon.cpp index bd50f66..5a32f9a 100644 --- a/src/Tachyon.cpp +++ b/src/Tachyon.cpp @@ -187,6 +187,10 @@ void Tachyon::receive_message(void) accellerate(atof(message+1)); break; + case 'T': + settime(atol(message+1)); + break; + default: // Invalid message. break; @@ -195,6 +199,11 @@ void Tachyon::receive_message(void) time_t Tachyon::time(void) { + timespec virtual_time; + + virtual_time = gettime(); + + return virtual_time.tv_sec; } // calculate the currect virtual time @@ -320,6 +329,21 @@ int Tachyon::sleep_until(timespec ends_at) 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) diff --git a/src/tachyon.cpp b/src/tachyon.cpp index 71966a0..367060b 100644 --- a/src/tachyon.cpp +++ b/src/tachyon.cpp @@ -13,7 +13,7 @@ int main(int argc, char *argv[]) ("help,h", "produce help message") ("tachyon-name", po::value(), "tachyon name") ("accelleration,a", po::value(), "set time acceleration factor") - ("time,t", po::value(), "set time value in seconds") + ("time,t", po::value(), "set time value in seconds") ; po::positional_options_description p; @@ -41,6 +41,12 @@ int main(int argc, char *argv[]) double factor = vm["accelleration"].as(); t.accellerate(factor); } + + if (vm.count("time")) + { + time_t newtime = vm["time"].as(); + t.settime(newtime); + } } else { diff --git a/test/Makefile.am b/test/Makefile.am index 0a8505a..f6af2a7 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,9 +1,9 @@ -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 @@ -11,6 +11,8 @@ timespec_SOURCES = timespec.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 diff --git a/test/remote_settime b/test/remote_settime new file mode 100755 index 0000000..0f57afa --- /dev/null +++ b/test/remote_settime @@ -0,0 +1,32 @@ +#!/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 +#include +#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"; + +} diff --git a/test/wait_for_time.cpp b/test/wait_for_time.cpp new file mode 100644 index 0000000..d958f4f --- /dev/null +++ b/test/wait_for_time.cpp @@ -0,0 +1,36 @@ +#include +#include +#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; + } +}