25 #ifndef PSYLLID_MONARCH3_WRAP_HH_ 26 #define PSYLLID_MONARCH3_WRAP_HH_ 28 #include "M3Monarch.hh" 30 #include "cancelable.hh" 60 typedef std::chrono::time_point< std::chrono::steady_clock, std::chrono::nanoseconds >
monarch_time_point_t;
93 const monarch3::Monarch3*
od_ptr()
const {
return f_monarch_on_deck.get();}
94 const monarch3::Monarch3*
tf_ptr()
const {
return f_monarch_to_finish.get();}
97 bool pointers_empty()
const;
99 bool mod_exists()
const;
101 bool mtf_exists()
const;
107 void create_on_deck();
109 void clear_on_deck();
111 void finish_to_finish();
117 void set_as_to_finish( std::shared_ptr< monarch3::Monarch3 >& a_monarch );
119 void get_on_deck( std::shared_ptr< monarch3::Monarch3 >& a_monarch );
122 void create_on_deck_nolock();
123 void finish_to_finish_nolock();
159 unsigned get_and_increment_file_count()
const;
162 header_wrap_ptr get_header();
164 const header_wrap_ptr get_header()
const;
168 stream_wrap_ptr get_stream(
unsigned a_stream_no );
173 void execute_switch_loop();
175 void trigger_switch();
178 bool okay_to_write();
183 void switch_to_new_file();
189 void finish_stream(
unsigned a_stream_no );
194 monarch_time_point_t get_run_start_time()
const;
200 void set_max_file_size(
double a_size );
204 void record_file_contribution(
double a_size );
209 void do_cancellation(
int a_code );
273 monarch3::M3Header& header();
276 monarch3::M3Header* ptr();
278 const monarch3::M3Header* ptr()
const;
281 unique_lock get_lock()
const;
323 bool is_valid()
const;
326 monarch3::M3Record* get_stream_record();
328 monarch3::M3Record* get_channel_record(
unsigned a_chan_no );
331 bool write_record( monarch3::RecordIdType a_rec_id, monarch3::TimeType a_rec_time,
const void* a_rec_block, uint64_t a_bytes,
bool a_is_new_acq );
354 return ! f_monarch_on_deck && ! f_monarch_to_finish;
359 return f_monarch_on_deck.operator bool();
364 return f_monarch_to_finish.operator bool();
369 f_od_condition.notify_one();
376 f_monarch_to_finish.swap( a_monarch );
383 a_monarch.swap( f_monarch_on_deck );
391 if( ! f_monarch_on_deck ) create_on_deck_nolock();
398 f_monarch_to_finish->FinishWriting();
399 f_monarch_to_finish.reset();
409 return f_header_wrap;
414 return f_run_start_time;
419 return f_file_count++;
424 f_max_file_size_mb = a_size;
430 f_monarch_od_manager.cancel( a_code );
466 return f_stream->GetStreamRecord();
471 return f_stream->GetChannelRecord( a_chan_no );
std::shared_ptr< header_wrapper > header_wrap_ptr
monarch_time_point_t f_run_start_time
std::thread * f_switch_thread
std::condition_variable f_od_condition
std::shared_ptr< stream_wrapper > stream_wrap_ptr
double f_max_file_size_mb
monarch3::M3Stream * f_stream
std::map< unsigned, stream_wrap_ptr > f_stream_wraps
void set_max_file_size(double a_size)
Set the maximum file size used to determine when a new file is automatically started.
monarch3::M3Record * get_stream_record()
Get the pointer to the stream record.
std::unique_lock< std::mutex > unique_lock
std::string f_filename_base
std::atomic< bool > f_do_switch_flag
void notify()
Notify the manager to process its monarch objects if needed (asynchronous)
monarch3::M3Record * get_channel_record(unsigned a_chan_no)
Get the pointer to a particular channel record.
std::thread * f_od_thread
std::shared_ptr< monarch3::Monarch3 > f_monarch
header_wrap_ptr get_header()
Returns the header wrapped in a header_wrap_ptr to be filled at the beginning of file writing...
monarch_wrapper * f_monarch_wrapper
Handles asynchronous creation of on-deck monarch files and finishing of completed files...
bool pointers_empty() const
Return true if both f_monarch_on_deck and f_monarch_to_finish are empty.
std::condition_variable f_wait_to_write
Wrapper class for a monarch3::M3Stream object.
std::ostream & operator<<(std::ostream &a_os, monarch_stage a_stage)
const monarch_wrapper * f_monarch_wrap
std::shared_ptr< monarch_wrapper > monarch_wrap_ptr
monarch_on_deck_manager f_monarch_od_manager
monarch_time_point_t get_run_start_time() const
const monarch3::Monarch3 * od_ptr() const
const monarch3::Monarch3 * tf_ptr() const
std::condition_variable f_do_switch_trig
std::condition_variable f_od_continue_condition
bool mod_exists() const
Return true if f_monarch_on_deck exists.
std::mutex f_monarch_mutex
void do_cancellation(int a_code)
monarch_stage to_stage(uint32_t a_stage_uint)
std::atomic< bool > f_ok_to_write
unsigned get_and_increment_file_count() const
As it says, return the current value to, and then increment, the file count.
std::string f_orig_filename
void set_as_to_finish(std::shared_ptr< monarch3::Monarch3 > &a_monarch)
Give a monarch object to the on-deck manager with the intent that it be finished asynchronously.
std::chrono::time_point< std::chrono::steady_clock, std::chrono::nanoseconds > monarch_time_point_t
Wrapper class for a monarch3::M3Monarch object.
void create_on_deck()
Create the on-deck monarch object if it doesn't exist already (synchronous)
void finish_to_finish_nolock()
std::shared_ptr< monarch3::Monarch3 > f_monarch_on_deck
bool mtf_exists() const
Return true if f_monarch_to_finish exists.
uint32_t to_uint(monarch_stage a_stage)
void get_on_deck(std::shared_ptr< monarch3::Monarch3 > &a_monarch)
Get the on-deck monarch object that has been created asynchronously.
std::atomic< double > f_file_size_est_mb
std::shared_ptr< monarch3::Monarch3 > f_monarch_to_finish
std::string f_filename_ext
header_wrap_ptr f_header_wrap