Newer
Older
/* daqd.cc - Main daqd source code file */
#include <config.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <errno.h>
#include <time.h>
#include <assert.h>
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <limits.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/mman.h>
#include <string>
#include <iostream>
#ifndef DAQD_CPP11
#error DAQD_CPP11 must be defined
#include <fstream>
#include <memory>
#include "framecpp/Common/MD5SumFilter.hh"
#include "run_number_client.hh"
#include "daqmap.h"
extern "C" {
#include "crc.h"
#include "param.h"
}
using namespace std;
#include "circ.hh"
#include "y.tab.h"
#include "FlexLexer.h"
#include "channel.hh"
#include "daqc.h"
#include "daqd.hh"
#include "sing_list.hh"
#include "net_writer.hh"
#include <stdio.h>
#include <stdarg.h>
#include <time.h>
#include <string.h>
/// Helper function to deal with the archive channels.
daqd_c::configure_archive_channels( char* archive_name,
char* file_name,
char* f1 )
{
archive_c* arc = 0;
// Find archive
for ( s_link* clink = archive.first( ); clink; clink = clink->next( ) )
{
archive_c* a = (archive_c*)clink;
if ( !strcmp( a->fsd.get_path( ), archive_name ) )
arc = a;
}
if ( !arc )
return DAQD_NOT_FOUND;
// Read config file
int res = arc->load_config( file_name );
if ( res == 0 && f1 )
res = arc->load_old_config( f1 );
return res ? DAQD_NOT_FOUND : DAQD_OK;
/// Remove an archive from the list of known archives
/// :TODO: have to use locking here to avoid deleteing "live" archives
daqd_c::delete_archive( char* name )
{
for ( s_link* clink = archive.first( ); clink; clink = clink->next( ) )
{
archive_c* a = (archive_c*)clink;
if ( !strcmp( a->fsd.get_path( ), name ) )
{
archive.remove( clink );
return DAQD_OK;
}
}
return DAQD_NOT_FOUND;
/// Create new archive if it's not created already
/// Set archive's prefix, suffix, number of Data dirs; scan archive file names
daqd_c::scan_archive( char* name, char* prefix, char* suffix, int ndirs )
{
archive_c* arc = 0;
for ( s_link* clink = archive.first( ); clink; clink = clink->next( ) )
{
archive_c* a = (archive_c*)clink;
if ( !strcmp( a->fsd.get_path( ), name ) )
arc = a;
}
if ( !arc )
{
void* mptr = malloc( sizeof( archive_c ) );
if ( !mptr )
return DAQD_MALLOC;
archive.insert( arc = new ( mptr ) archive_c( ) );
}
return arc->scan( name, prefix, suffix, ndirs );
/// Update file directory info for the archive
/// Called when new file is written into the archive by an external archive
/// writer
daqd_c::update_archive( char* name,
unsigned long gps,
unsigned long dt,
unsigned int dir_num )
{
archive_c* arc = 0;
for ( s_link* clink = archive.first( ); clink; clink = clink->next( ) )
{
archive_c* a = (archive_c*)clink;
if ( !strcmp( a->fsd.get_path( ), name ) )
arc = a;
}
if ( !arc )
return DAQD_NOT_FOUND;
int res = arc->fsd.update_dir( gps, 0, dt, dir_num );
if ( res )
return DAQD_MALLOC;
else
return DAQD_OK;
extern void* interpreter_no_prompt( void* );
int shutdown_server( );
/// Server shutdown flag
bool server_is_shutting_down = false;
daqd_c daqd; ///< root object
/// Is set to the program's executable name during run time
char* programname;
/// Mutual exclusion on Frames library calls
pthread_mutex_t framelib_lock;
#ifndef NDEBUG
/// Controls volume of the debugging messages that is printed out
int _debug = 10;
#endif
/// Controls volume of log messages
int _log_level;
//#include "../../src/drv/param.c"
struct cmp_struct
{
bool
operator( )( char* a, char* b )
{
return !strcmp( a, b );
}
};
/// Sort on IFO number and DCU id
/// Do not change channel order within a DCU
int
chan_dcu_eq( const void* a, const void* b )
{
unsigned int dcu1, dcu2;
dcu1 = ( (channel_t*)a )->dcu_id + DCU_COUNT * ( (channel_t*)a )->ifoid;
dcu2 = ( (channel_t*)b )->dcu_id + DCU_COUNT * ( (channel_t*)b )->ifoid;
if ( dcu1 == dcu2 )
return ( (channel_t*)a )->seq_num - ( (channel_t*)b )->seq_num;
Loading
Loading full blame...