void LearnEngine::LearnList::add_sample(const PHV &phv) { static thread_local ByteContainer sample; sample.clear(); builder(phv, &sample); std::unique_lock<std::mutex> lock(mutex); const auto it = filter.find(sample); if(it != filter.end()) return; buffer.insert(buffer.end(), sample.begin(), sample.end()); num_samples++; auto filter_it = filter.insert(filter.end(), std::move(sample)); FilterPtrs &filter_ptrs = old_buffers[buffer_id]; filter_ptrs.unacked_count++; filter_ptrs.buffer.push_back(filter_it); if(num_samples == 1 && max_samples > 1) { buffer_started = clock::now(); b_can_send.notify_one(); // wake transmit thread to update cond var wait time } else if(num_samples >= max_samples) { while(buffer_tmp.size() != 0) { b_can_swap.wait(lock); } swap_buffers(); b_can_send.notify_one(); } }