diff --git a/docs b/docs index 97435c1a..f7f73f52 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 97435c1a622e41e0a5fc1be72aaadea62e1b7adb +Subproject commit f7f73f52a5a60a1606c05a3e8a2d6a5df32b579c diff --git a/libraries/app/api.cpp b/libraries/app/api.cpp index 02216e19..f96c291b 100644 --- a/libraries/app/api.cpp +++ b/libraries/app/api.cpp @@ -35,6 +35,7 @@ namespace graphene { namespace app { database_api::database_api(graphene::chain::database& db):_db(db) { + wlog("creating database api ${x}", ("x",int64_t(this)) ); _change_connection = _db.changed_objects.connect([this](const vector& ids) { on_objects_changed(ids); }); @@ -44,6 +45,29 @@ namespace graphene { namespace app { _applied_block_connection = _db.applied_block.connect([this](const signed_block&){ on_applied_block(); }); } + database_api::~database_api() + { + elog("freeing database api ${x}", ("x",int64_t(this)) ); + try { + if(_broadcast_changes_complete.valid()) + { + _broadcast_changes_complete.cancel(); + ilog( "waiting.."); + _broadcast_changes_complete.wait(); + } + if(_broadcast_removed_complete.valid()) + { + _broadcast_removed_complete.cancel(); + ilog( "waiting.."); + _broadcast_removed_complete.wait(); + } + ilog( "done" ); + } catch (const fc::exception& e) + { + wlog("${e}", ("e",e.to_detail_string())); + } + } + fc::variants database_api::get_objects(const vector& ids)const { fc::variants result; @@ -185,7 +209,7 @@ namespace graphene { namespace app { } std::map database_api::get_full_accounts(std::function callback, - const vector& names_or_ids) + const vector& names_or_ids, bool subscribe) { FC_ASSERT( _account_subscriptions.size() < 1024 ); std::map results; @@ -205,7 +229,16 @@ namespace graphene { namespace app { if (account == nullptr) continue; - _account_subscriptions[account->id] = callback; + if( subscribe ) + { + ilog( "subscribe to ${id}", ("id",account->name) ); + _account_subscriptions[account->id] = callback; + } + else + { + wlog( "unsubscribe to ${id}", ("id",account->name) ); + _account_subscriptions.erase(account->id); + } // fc::mutable_variant_object full_account; full_account acnt; @@ -725,6 +758,7 @@ namespace graphene { namespace app { _broadcast_removed_complete = fc::async([=](){ for( const auto& item : broadcast_queue ) { + idump((item.first)(item.second) ); auto sub = _account_subscriptions.find(item.first); if( sub != _account_subscriptions.end() ) sub->second( fc::variant(item.second ) ); @@ -761,6 +795,7 @@ namespace graphene { namespace app { void database_api::on_objects_changed(const vector& ids) { + idump((ids)(_account_subscriptions.size())); vector my_objects; map > broadcast_queue; map< pair, vector > market_broadcast_queue; @@ -809,6 +844,7 @@ namespace graphene { namespace app { _broadcast_changes_complete = fc::async([=](){ for( const auto& item : broadcast_queue ) { + edump( (item) ); auto sub = _account_subscriptions.find(item.first); if( sub != _account_subscriptions.end() ) sub->second( fc::variant(item.second ) ); @@ -881,24 +917,6 @@ namespace graphene { namespace app { }); } - database_api::~database_api() - { - try { - if(_broadcast_changes_complete.valid()) - { - _broadcast_changes_complete.cancel(); - _broadcast_changes_complete.wait(); - } - if(_broadcast_removed_complete.valid()) - { - _broadcast_removed_complete.cancel(); - _broadcast_removed_complete.wait(); - } - } catch (const fc::exception& e) - { - wlog("${e}", ("e",e.to_detail_string())); - } - } bool database_api::subscribe_to_objects( const std::function& callback, const vector& ids) { diff --git a/libraries/app/include/graphene/app/api.hpp b/libraries/app/include/graphene/app/api.hpp index 50b46278..58d683eb 100644 --- a/libraries/app/include/graphene/app/api.hpp +++ b/libraries/app/include/graphene/app/api.hpp @@ -152,7 +152,7 @@ namespace graphene { namespace app { * */ std::map get_full_accounts(std::function callback, - const vector& names_or_ids); + const vector& names_or_ids, bool subscribe ); /** * Stop receiving updates generated by get_full_accounts()