From c14494fb684b0caa8a66eb2e8f8d3f0ab0c1383f Mon Sep 17 00:00:00 2001 From: theoreticalbts Date: Sat, 29 Aug 2015 20:18:17 -0400 Subject: [PATCH] time: Make timer use fc::time_point instead of fc::time_point_sec so witness plugin can control quantization --- libraries/app/application.cpp | 2 +- libraries/plugins/witness/witness.cpp | 9 ++++++--- libraries/time/include/graphene/time/time.hpp | 4 ++-- libraries/time/time.cpp | 4 ++-- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/libraries/app/application.cpp b/libraries/app/application.cpp index 856aa2d0..cf88be5a 100644 --- a/libraries/app/application.cpp +++ b/libraries/app/application.cpp @@ -231,7 +231,7 @@ namespace detail { genesis_state_type genesis = fc::json::from_file(_options->at("genesis-json").as()).as(); if( _options->count("genesis-timestamp") ) { - genesis.initial_timestamp = graphene::time::now() + genesis.initial_parameters.block_interval + _options->at("genesis-timestamp").as(); + genesis.initial_timestamp = fc::time_point_sec( graphene::time::now() ) + genesis.initial_parameters.block_interval + _options->at("genesis-timestamp").as(); genesis.initial_timestamp -= genesis.initial_timestamp.sec_since_epoch() % genesis.initial_parameters.block_interval; std::cerr << "Used genesis timestamp: " << genesis.initial_timestamp.to_iso_string() << " (PLEASE RECORD THIS)\n"; } diff --git a/libraries/plugins/witness/witness.cpp b/libraries/plugins/witness/witness.cpp index 8d2b37ec..b7a1f6b4 100644 --- a/libraries/plugins/witness/witness.cpp +++ b/libraries/plugins/witness/witness.cpp @@ -177,8 +177,10 @@ void witness_plugin::plugin_shutdown() void witness_plugin::schedule_production_loop() { //Schedule for the next second's tick regardless of chain state - fc::time_point_sec next_second( graphene::time::now().sec_since_epoch() + 1 ); - wdump( (next_second) ); + // If we would wait less than 200ms, wait for the whole second. + fc::time_point now = graphene::time::now(); + fc::time_point_sec next_second( now + fc::microseconds( 1200000 ) ); + wdump( (now.time_since_epoch().count())(next_second) ); _block_production_task = fc::schedule([this]{block_production_loop();}, next_second, "Witness Block Production"); } @@ -239,7 +241,8 @@ block_production_condition::block_production_condition_enum witness_plugin::bloc block_production_condition::block_production_condition_enum witness_plugin::maybe_produce_block( fc::mutable_variant_object& capture ) { chain::database& db = database(); - fc::time_point_sec now = graphene::time::now(); + fc::time_point now_fine = graphene::time::now(); + fc::time_point_sec now = now_fine + fc::microseconds( 500000 ); // If the next block production opportunity is in the present or future, we're synced. if( !_production_enabled ) diff --git a/libraries/time/include/graphene/time/time.hpp b/libraries/time/include/graphene/time/time.hpp index 3b7d6b42..e4252400 100644 --- a/libraries/time/include/graphene/time/time.hpp +++ b/libraries/time/include/graphene/time/time.hpp @@ -27,8 +27,8 @@ namespace graphene { namespace time { extern time_discontinuity_signal_type time_discontinuity_signal; fc::optional ntp_time(); - fc::time_point_sec now(); - fc::time_point_sec nonblocking_now(); // identical to now() but guaranteed not to block + fc::time_point now(); + fc::time_point nonblocking_now(); // identical to now() but guaranteed not to block void update_ntp_time(); fc::microseconds ntp_error(); void shutdown_ntp_time(); diff --git a/libraries/time/time.cpp b/libraries/time/time.cpp index 5a7fd939..98f83bed 100644 --- a/libraries/time/time.cpp +++ b/libraries/time/time.cpp @@ -60,7 +60,7 @@ void shutdown_ntp_time() delete actual_ntp_service; } -fc::time_point_sec now() +fc::time_point now() { if( simulated_time ) return fc::time_point() + fc::seconds( simulated_time + adjusted_time_sec ); @@ -72,7 +72,7 @@ fc::time_point_sec now() return fc::time_point::now() + fc::seconds( adjusted_time_sec ); } -fc::time_point_sec nonblocking_now() +fc::time_point nonblocking_now() { if (simulated_time) return fc::time_point() + fc::seconds(simulated_time + adjusted_time_sec);