/************************************************* * End the current message * *************************************************/ void Filter::finish_msg() { end_msg(); for(u32bit j = 0; j != total_ports(); ++j) if(next[j]) next[j]->finish_msg(); }
/************************************************* * Start a new message * *************************************************/ void Filter::new_msg() { start_msg(); for(u32bit j = 0; j != total_ports(); ++j) if(next[j]) next[j]->new_msg(); }
/* * End the current message */ void Filter::finish_msg() { end_msg(); for(size_t j = 0; j != total_ports(); ++j) if(m_next[j]) m_next[j]->finish_msg(); }
/* * Start a new message */ void Filter::new_msg() { start_msg(); for(size_t j = 0; j != total_ports(); ++j) if(m_next[j]) m_next[j]->new_msg(); }
void Threaded_Fork::thread_delegate_work(const byte input[], size_t length) { //Set the data to do. m_thread_data->m_input = input; m_thread_data->m_input_length = length; //Let the workers start processing. m_thread_data->m_input_ready_semaphore.release(total_ports()); //Wait for all the filters to finish processing. for(size_t i = 0; i != total_ports(); ++i) m_thread_data->m_input_complete_semaphore.acquire(); //Reset the thread data m_thread_data->m_input = nullptr; m_thread_data->m_input_length = 0; }
void Threaded_Fork::send(const byte input[], size_t length) { if(m_write_queue.size()) thread_delegate_work(m_write_queue.data(), m_write_queue.size()); thread_delegate_work(input, length); bool nothing_attached = true; for(size_t j = 0; j != total_ports(); ++j) if(m_next[j]) nothing_attached = false; if(nothing_attached) m_write_queue += std::make_pair(input, length); else m_write_queue.clear(); }
/************************************************* * Send data to all ports * *************************************************/ void Filter::send(const byte input[], u32bit length) { bool nothing_attached = true; for(u32bit j = 0; j != total_ports(); ++j) if(next[j]) { if(write_queue.has_items()) next[j]->write(write_queue, write_queue.size()); next[j]->write(input, length); nothing_attached = false; } if(nothing_attached) write_queue.append(input, length); else if(write_queue.has_items()) write_queue.destroy(); }
/* * Send data to all ports */ void Filter::send(const byte input[], size_t length) { if(!length) return; bool nothing_attached = true; for(size_t j = 0; j != total_ports(); ++j) if(m_next[j]) { if(m_write_queue.size()) m_next[j]->write(m_write_queue.data(), m_write_queue.size()); m_next[j]->write(input, length); nothing_attached = false; } if(nothing_attached) m_write_queue += std::make_pair(input, length); else m_write_queue.clear(); }
/************************************************* * Set the active port on a filter * *************************************************/ void Filter::set_port(u32bit new_port) { if(new_port >= total_ports()) throw Invalid_Argument("Filter: Invalid port number"); port_num = new_port; }