// (C) 2017 University of Bristol. See License.txt /* * Summer.cpp * */ #include "Auth/Summer.h" #include "Auth/MAC_Check.h" #include "Tools/int.h" template Summer::Summer(int sum_players, int last_sum_players, int next_sum_players, Player* send_player, Player* receive_player, Parallel_MAC_Check& MC) : sum_players(sum_players), last_sum_players(last_sum_players), next_sum_players(next_sum_players), base_player(0), MC(MC),send_player(send_player), receive_player(receive_player), thread(0), stop(false), size(0) { cout << "Setting up summation by " << sum_players << " players" << endl; } template Summer::~Summer() { delete send_player; if (timer.elapsed()) cout << T::type_string() << " summation by " << sum_players << " players: " << timer.elapsed() << endl; } template void Summer::run() { octetStream os; while (true) { int size = 0; if (!input_queue.pop(size)) break; int my_relative_num = positive_modulo(send_player->my_num() - base_player, send_player->num_players()); if (my_relative_num < sum_players) { // first summer takes inputs from queue if (last_sum_players == send_player->num_players()) share_queue.pop(values); else { values.resize(size); receive_player->receive_player(receive_player->my_num(),os,true); for (int i = 0; i < size; i++) values[i].unpack(os); } timer.start(); if (T::t() == 2) add_openings(values, *receive_player, sum_players, last_sum_players, base_player, MC); else add_openings(values, *receive_player, sum_players, last_sum_players, base_player, MC); timer.stop(); os.reset_write_head(); for (int i = 0; i < size; i++) values[i].pack(os); if (sum_players > 1) { int receiver = positive_modulo(base_player + my_relative_num % next_sum_players, send_player->num_players()); send_player->send_to(receiver, os, true); } else { send_player->send_all(os); MC.value_queue.push(values); } } if (sum_players == 1) output_queue.push(size); base_player = (base_player + 1) % send_player->num_players(); } } template class Summer; template class Summer; #ifdef USE_GF2N_LONG template class Summer; #endif