Handle setting the virtual time 1.0
authorArjen Baart <arjen@andromeda.nl>
Tue, 28 Jul 2020 16:25:47 +0000 (18:25 +0200)
committerArjen Baart <arjen@andromeda.nl>
Tue, 28 Jul 2020 16:25:47 +0000 (18:25 +0200)
configure.ac
src/Makefile.am
src/Tachyon.cpp
src/tachyon.cpp
test/Makefile.am
test/remote_settime [new file with mode: 0755]
test/settime.cpp [new file with mode: 0644]
test/wait_for_time.cpp [new file with mode: 0644]

index c5be2c3..39535ac 100644 (file)
@@ -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])
 
index 5e1c993..920e586 100644 (file)
@@ -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
index bd50f66..5a32f9a 100644 (file)
@@ -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)
index 71966a0..367060b 100644 (file)
@@ -13,7 +13,7 @@ int main(int argc, char *argv[])
        ("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;
@@ -41,6 +41,12 @@ int main(int argc, char *argv[])
          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
    {
index 0a8505a..f6af2a7 100644 (file)
@@ -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 (executable)
index 0000000..0f57afa
--- /dev/null
@@ -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 <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
diff --git a/test/settime.cpp b/test/settime.cpp
new file mode 100644 (file)
index 0000000..b6e6780
--- /dev/null
@@ -0,0 +1,27 @@
+#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";
+
+}
diff --git a/test/wait_for_time.cpp b/test/wait_for_time.cpp
new file mode 100644 (file)
index 0000000..d958f4f
--- /dev/null
@@ -0,0 +1,36 @@
+#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;
+   }
+}