![]() |
Project
|
#include <memory>
#include <stdexcept>
#include "Framework/BoostOptionsRetriever.h"
#include "Framework/BacktraceHelpers.h"
#include "Framework/CallbacksPolicy.h"
#include "Framework/ChannelConfigurationPolicy.h"
#include "Framework/ChannelMatching.h"
#include "Framework/ConfigParamsHelper.h"
#include "Framework/ConfigParamSpec.h"
#include "Framework/ConfigContext.h"
#include "Framework/ComputingQuotaEvaluator.h"
#include "CommonDriverServices.h"
#include "Framework/DataProcessingDevice.h"
#include "Framework/DataProcessingContext.h"
#include "Framework/DataProcessorSpec.h"
#include "Framework/PluginManager.h"
#include "Framework/DeviceControl.h"
#include "Framework/DeviceExecution.h"
#include "Framework/DeviceInfo.h"
#include "Framework/DeviceMetricsInfo.h"
#include "Framework/DeviceMetricsHelper.h"
#include "Framework/DeviceConfigInfo.h"
#include "Framework/DeviceSpec.h"
#include "Framework/DeviceState.h"
#include "Framework/DeviceConfig.h"
#include "DeviceStateHelpers.h"
#include "Framework/ServiceRegistryHelpers.h"
#include "Framework/DevicesManager.h"
#include "Framework/DebugGUI.h"
#include "Framework/LocalRootFileService.h"
#include "Framework/LogParsingHelpers.h"
#include "Framework/Logger.h"
#include "Framework/ParallelContext.h"
#include "Framework/RawDeviceService.h"
#include "Framework/SimpleRawDeviceService.h"
#include "Framework/Signpost.h"
#include "Framework/ControlService.h"
#include "Framework/CallbackService.h"
#include "Framework/WorkflowSpec.h"
#include "Framework/Monitoring.h"
#include "Framework/DataProcessorInfo.h"
#include "Framework/DriverInfo.h"
#include "Framework/DriverConfig.h"
#include "Framework/DriverControl.h"
#include "Framework/DataTakingContext.h"
#include "Framework/CommandInfo.h"
#include "Framework/RunningWorkflowInfo.h"
#include "Framework/TopologyPolicy.h"
#include "Framework/WorkflowSpecNode.h"
#include "Framework/GuiCallbackContext.h"
#include "Framework/DeviceContext.h"
#include "Framework/ServiceMetricsInfo.h"
#include "Framework/CommonServices.h"
#include "Framework/DefaultsHelpers.h"
#include "ProcessingPoliciesHelpers.h"
#include "DriverServerContext.h"
#include "HTTPParser.h"
#include "DPLWebSocket.h"
#include "ArrowSupport.h"
#include "Framework/ConfigParamDiscovery.h"
#include "ComputingResourceHelpers.h"
#include "DataProcessingStatus.h"
#include "DDSConfigHelpers.h"
#include "O2ControlHelpers.h"
#include "DeviceSpecHelpers.h"
#include "GraphvizHelpers.h"
#include "MermaidHelpers.h"
#include "PropertyTreeHelpers.h"
#include "SimpleResourceManager.h"
#include "WorkflowSerializationHelpers.h"
#include <Configuration/ConfigurationInterface.h>
#include <Configuration/ConfigurationFactory.h>
#include <Monitoring/MonitoringFactory.h>
#include "ResourcesMonitoringHelper.h"
#include <fairmq/Device.h>
#include <fairmq/DeviceRunner.h>
#include <fairmq/shmem/Monitor.h>
#include <fairmq/ProgOptions.h>
#include <boost/program_options.hpp>
#include <boost/program_options/options_description.hpp>
#include <boost/program_options/variables_map.hpp>
#include <boost/exception/diagnostic_information.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <uv.h>
#include <TEnv.h>
#include <TSystem.h>
#include <cinttypes>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <csignal>
#include <iostream>
#include <map>
#include <regex>
#include <set>
#include <string>
#include <type_traits>
#include <tuple>
#include <chrono>
#include <utility>
#include <numeric>
#include <functional>
#include <fcntl.h>
#include <netinet/ip.h>
#include <sys/resource.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/un.h>
#include <sys/wait.h>
#include <unistd.h>
#include <execinfo.h>
#include <cfenv>
Go to the source code of this file.
Classes | |
struct | DeviceLogContext |
struct | StreamConfigContext |
struct | DeviceRef |
struct | DeviceStdioContext |
struct | WorkflowInfo |
Macros | |
#define | BOOST_BIND_GLOBAL_PLACEHOLDERS |
Typedefs | |
using | DataProcessorInfos = std::vector< DataProcessorInfo > |
using | DeviceExecutions = std::vector< DeviceExecution > |
using | DeviceSpecs = std::vector< DeviceSpec > |
using | DeviceInfos = std::vector< DeviceInfo > |
using | DataProcessingStatesInfos = std::vector< DataProcessingStates > |
using | DeviceControls = std::vector< DeviceControl > |
using | DataProcessorSpecs = std::vector< DataProcessorSpec > |
Functions | |
bpo::options_description | gHiddenDeviceOptions ("Hidden child options") |
O2_DECLARE_DYNAMIC_LOG (driver) | |
O2_DECLARE_DYNAMIC_LOG (gui) | |
void | doBoostException (boost::exception &e, const char *) |
void | doDPLException (o2::framework::RuntimeErrorRef &ref, char const *) |
void | doUnknownException (std::string const &s, char const *) |
char * | getIdString (int argc, char **argv) |
int | callMain (int argc, char **argv, int(*mainNoCatch)(int, char **)) |
void | getChildData (int infd, DeviceInfo &outinfo) |
bool | checkIfCanExit (std::vector< DeviceInfo > const &infos) |
void | killChildren (std::vector< DeviceInfo > &infos, int sig) |
bool | areAllChildrenGone (std::vector< DeviceInfo > &infos) |
Check the state of the children. | |
void | createPipes (int *pipes) |
void | cleanupSHM (std::string const &uniqueWorkflowId) |
Helper to invoke shared memory cleanup. | |
void | spawnRemoteDevice (uv_loop_t *loop, std::string const &, DeviceSpec const &spec, DeviceControl &, DeviceExecution &, DeviceInfos &deviceInfos, DataProcessingStatesInfos &allStates) |
void | log_callback (uv_poll_t *handle, int status, int events) |
void | close_websocket (uv_handle_t *handle) |
void | websocket_callback (uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf) |
void | ws_connect_callback (uv_stream_t *server, int status) |
A callback for the rest engine. | |
void | stream_config (uv_work_t *req) |
void | handleSignals () |
void | handleChildrenStdio (DriverServerContext *serverContext, std::string const &forwardedStdin, std::vector< DeviceStdioContext > &childFds, std::vector< uv_poll_t * > &handles) |
void | handle_crash (int sig) |
void | spawnDevice (uv_loop_t *loop, DeviceRef ref, std::vector< DeviceSpec > const &specs, DriverInfo &driverInfo, std::vector< DeviceControl > &, std::vector< DeviceExecution > &executions, std::vector< DeviceInfo > &deviceInfos, std::vector< DataProcessingStates > &allStates, ServiceRegistryRef serviceRegistry, boost::program_options::variables_map &varmap, std::vector< DeviceStdioContext > &childFds, unsigned parentCPU, unsigned parentNode) |
void | processChildrenOutput (uv_loop_t *loop, DriverInfo &driverInfo, DeviceInfos &infos, DeviceSpecs const &specs, DeviceControls &controls) |
bool | processSigChild (DeviceInfos &infos, DeviceSpecs &specs) |
AlgorithmSpec | dryRun (DeviceSpec const &spec) |
void | doDefaultWorkflowTerminationHook () |
int | doChild (int argc, char **argv, ServiceRegistry &serviceRegistry, RunningWorkflowInfo const &runningWorkflow, RunningDeviceRef ref, DriverConfig const &driverConfig, ProcessingPolicies processingPolicies, std::string const &defaultDriverClient, uv_loop_t *loop) |
void | gui_callback (uv_timer_s *ctx) |
void | single_step_callback (uv_timer_s *ctx) |
Force single stepping of the children. | |
void | force_exit_callback (uv_timer_s *ctx) |
std::vector< std::regex > | getDumpableMetrics () |
void | dumpMetricsCallback (uv_timer_t *handle) |
void | dumpRunSummary (DriverServerContext &context, DriverInfo const &driverInfo, DeviceInfos const &infos, DeviceSpecs const &specs) |
int | runStateMachine (DataProcessorSpecs const &workflow, WorkflowInfo const &workflowInfo, DataProcessorInfos const &previousDataProcessorInfos, CommandInfo const &commandInfo, DriverControl &driverControl, DriverInfo &driverInfo, DriverConfig &driverConfig, std::vector< DeviceMetricsInfo > &metricsInfos, std::vector< ConfigParamSpec > const &detectedParams, boost::program_options::variables_map &varmap, std::vector< ServiceSpec > &driverServices, std::string frameworkId) |
void | printHelp (bpo::variables_map const &varmap, bpo::options_description const &executorOptions, std::vector< DataProcessorSpec > const &physicalWorkflow, std::vector< ConfigParamSpec > const ¤tWorkflowOptions) |
bool | isOutputToPipe () |
bool | isInputConfig () |
void | overrideCloning (ConfigContext &ctx, WorkflowSpec &workflow) |
void | overridePipeline (ConfigContext &ctx, WorkflowSpec &workflow) |
void | overrideLabels (ConfigContext &ctx, WorkflowSpec &workflow) |
void | initialiseDriverControl (bpo::variables_map const &varmap, DriverInfo &driverInfo, DriverControl &control) |
Helper function to initialise the controller from the command line options. | |
void | conflicting_options (const boost::program_options::variables_map &vm, const std::string &opt1, const std::string &opt2) |
Helper to to detect conflicting options. | |
template<typename T > | |
void | apply_permutation (std::vector< T > &v, std::vector< int > &indices) |
void | checkNonResiliency (std::vector< DataProcessorSpec > const &specs, std::vector< std::pair< int, int > > const &edges) |
std::string | debugTopoInfo (std::vector< DataProcessorSpec > const &specs, std::vector< TopoIndexInfo > const &infos, std::vector< std::pair< int, int > > const &edges) |
void | enableSignposts (std::string const &signpostsToEnable) |
void | overrideAll (o2::framework::ConfigContext &ctx, std::vector< o2::framework::DataProcessorSpec > &workflow) |
o2::framework::ConfigContext | createConfigContext (std::unique_ptr< ConfigParamRegistry > &workflowOptionsRegistry, o2::framework::ServiceRegistry &configRegistry, std::vector< o2::framework::ConfigParamSpec > &workflowOptions, std::vector< o2::framework::ConfigParamSpec > &extraOptions, int argc, char **argv) |
std::unique_ptr< o2::framework::ServiceRegistry > | createRegistry () |
int | doMain (int argc, char **argv, o2::framework::WorkflowSpec const &workflow, std::vector< ChannelConfigurationPolicy > const &channelPolicies, std::vector< CompletionPolicy > const &completionPolicies, std::vector< DispatchPolicy > const &dispatchPolicies, std::vector< ResourcePolicy > const &resourcePolicies, std::vector< CallbacksPolicy > const &callbacksPolicies, std::vector< SendingPolicy > const &sendingPolicies, std::vector< ConfigParamSpec > const ¤tWorkflowOptions, std::vector< ConfigParamSpec > const &detectedParams, o2::framework::ConfigContext &configContext) |
Variables | |
std::vector< DeviceMetricsInfo > | gDeviceMetricsInfos |
volatile sig_atomic_t | graceful_exit = false |
volatile sig_atomic_t | forceful_exit = false |
volatile sig_atomic_t | sigchld_requested = false |
volatile sig_atomic_t | double_sigint = false |
auto | bindGUIPort |
#define BOOST_BIND_GLOBAL_PLACEHOLDERS |
Definition at line 12 of file runDataProcessing.cxx.
using DataProcessingStatesInfos = std::vector<DataProcessingStates> |
Definition at line 167 of file runDataProcessing.cxx.
using DataProcessorInfos = std::vector<DataProcessorInfo> |
Definition at line 163 of file runDataProcessing.cxx.
using DataProcessorSpecs = std::vector<DataProcessorSpec> |
Definition at line 169 of file runDataProcessing.cxx.
using DeviceControls = std::vector<DeviceControl> |
Definition at line 168 of file runDataProcessing.cxx.
using DeviceExecutions = std::vector<DeviceExecution> |
Definition at line 164 of file runDataProcessing.cxx.
using DeviceInfos = std::vector<DeviceInfo> |
Definition at line 166 of file runDataProcessing.cxx.
using DeviceSpecs = std::vector<DeviceSpec> |
Definition at line 165 of file runDataProcessing.cxx.
Definition at line 2686 of file runDataProcessing.cxx.
bool areAllChildrenGone | ( | std::vector< DeviceInfo > & | infos | ) |
Check the state of the children.
Definition at line 289 of file runDataProcessing.cxx.
Definition at line 195 of file runDataProcessing.cxx.
bool checkIfCanExit | ( | std::vector< DeviceInfo > const & | infos | ) |
Return true if all the DeviceInfo in infos are ready to quit. false otherwise. FIXME: move to an helper class
Definition at line 264 of file runDataProcessing.cxx.
void checkNonResiliency | ( | std::vector< DataProcessorSpec > const & | specs, |
std::vector< std::pair< int, int > > const & | edges | ||
) |
Definition at line 2704 of file runDataProcessing.cxx.
void cleanupSHM | ( | std::string const & | uniqueWorkflowId | ) |
Helper to invoke shared memory cleanup.
Definition at line 382 of file runDataProcessing.cxx.
void close_websocket | ( | uv_handle_t * | handle | ) |
Definition at line 451 of file runDataProcessing.cxx.
void conflicting_options | ( | const boost::program_options::variables_map & | vm, |
const std::string & | opt1, | ||
const std::string & | opt2 | ||
) |
Helper to to detect conflicting options.
Definition at line 2675 of file runDataProcessing.cxx.
o2::framework::ConfigContext createConfigContext | ( | std::unique_ptr< ConfigParamRegistry > & | workflowOptionsRegistry, |
o2::framework::ServiceRegistry & | configRegistry, | ||
std::vector< o2::framework::ConfigParamSpec > & | workflowOptions, | ||
std::vector< o2::framework::ConfigParamSpec > & | extraOptions, | ||
int | argc, | ||
char ** | argv | ||
) |
Definition at line 2809 of file runDataProcessing.cxx.
Definition at line 333 of file runDataProcessing.cxx.
std::unique_ptr< o2::framework::ServiceRegistry > createRegistry | ( | ) |
Definition at line 2829 of file runDataProcessing.cxx.
std::string debugTopoInfo | ( | std::vector< DataProcessorSpec > const & | specs, |
std::vector< TopoIndexInfo > const & | infos, | ||
std::vector< std::pair< int, int > > const & | edges | ||
) |
Definition at line 2727 of file runDataProcessing.cxx.
Definition at line 3264 of file runDataProcessing.cxx.
int doChild | ( | int | argc, |
char ** | argv, | ||
ServiceRegistry & | serviceRegistry, | ||
RunningWorkflowInfo const & | runningWorkflow, | ||
RunningDeviceRef | ref, | ||
DriverConfig const & | driverConfig, | ||
ProcessingPolicies | processingPolicies, | ||
std::string const & | defaultDriverClient, | ||
uv_loop_t * | loop | ||
) |
Create all the requested services and initialise them
Definition at line 1013 of file runDataProcessing.cxx.
void doDefaultWorkflowTerminationHook | ( | ) |
Definition at line 1008 of file runDataProcessing.cxx.
void doDPLException | ( | o2::framework::RuntimeErrorRef & | ref, |
char const * | processName | ||
) |
Definition at line 968 of file runDataProcessing.cxx.
int doMain | ( | int | argc, |
char ** | argv, | ||
o2::framework::WorkflowSpec const & | workflow, | ||
std::vector< ChannelConfigurationPolicy > const & | channelPolicies, | ||
std::vector< CompletionPolicy > const & | completionPolicies, | ||
std::vector< DispatchPolicy > const & | dispatchPolicies, | ||
std::vector< ResourcePolicy > const & | resourcePolicies, | ||
std::vector< CallbacksPolicy > const & | callbacksPolicies, | ||
std::vector< SendingPolicy > const & | sendingPolicies, | ||
std::vector< ConfigParamSpec > const & | currentWorkflowOptions, | ||
std::vector< ConfigParamSpec > const & | detectedParams, | ||
o2::framework::ConfigContext & | configContext | ||
) |
Iterate over the physicalWorkflow, any DataProcessorSpec that has a expendable label should have all the timeframe lifetime outputs changed to sporadic, because there is no guarantee that the device will be alive, so we should not expect its data to always arrive.
This is the earlies the services are actually needed
Set the fair::Logger severity to the one specified in the command line We do it by hand here, because FairMQ device is not initialsed until much later and we need the logger before that.
Definition at line 2843 of file runDataProcessing.cxx.
void doUnknownException | ( | std::string const & | s, |
char const * | processName | ||
) |
Definition at line 987 of file runDataProcessing.cxx.
AlgorithmSpec dryRun | ( | DeviceSpec const & | spec | ) |
Definition at line 996 of file runDataProcessing.cxx.
void dumpMetricsCallback | ( | uv_timer_t * | handle | ) |
Definition at line 1240 of file runDataProcessing.cxx.
void dumpRunSummary | ( | DriverServerContext & | context, |
DriverInfo const & | driverInfo, | ||
DeviceInfos const & | infos, | ||
DeviceSpecs const & | specs | ||
) |
Definition at line 1249 of file runDataProcessing.cxx.
void enableSignposts | ( | std::string const & | signpostsToEnable | ) |
Definition at line 2756 of file runDataProcessing.cxx.
void force_exit_callback | ( | uv_timer_s * | ctx | ) |
Definition at line 1216 of file runDataProcessing.cxx.
void getChildData | ( | int | infd, |
DeviceInfo & | outinfo | ||
) |
Definition at line 235 of file runDataProcessing.cxx.
std::vector< std::regex > getDumpableMetrics | ( | ) |
Definition at line 1222 of file runDataProcessing.cxx.
Definition at line 185 of file runDataProcessing.cxx.
bpo::options_description gHiddenDeviceOptions | ( | "Hidden child options" | ) |
void gui_callback | ( | uv_timer_s * | ctx | ) |
Definition at line 1128 of file runDataProcessing.cxx.
Definition at line 638 of file runDataProcessing.cxx.
void handleChildrenStdio | ( | DriverServerContext * | serverContext, |
std::string const & | forwardedStdin, | ||
std::vector< DeviceStdioContext > & | childFds, | ||
std::vector< uv_poll_t * > & | handles | ||
) |
Add pollers for stdout and stderr
Definition at line 601 of file runDataProcessing.cxx.
void handleSignals | ( | ) |
Definition at line 581 of file runDataProcessing.cxx.
void initialiseDriverControl | ( | bpo::variables_map const & | varmap, |
DriverInfo & | driverInfo, | ||
DriverControl & | control | ||
) |
Helper function to initialise the controller from the command line options.
Definition at line 2526 of file runDataProcessing.cxx.
bool isInputConfig | ( | ) |
Definition at line 2357 of file runDataProcessing.cxx.
bool isOutputToPipe | ( | ) |
Definition at line 2350 of file runDataProcessing.cxx.
void killChildren | ( | std::vector< DeviceInfo > & | infos, |
int | sig | ||
) |
Definition at line 279 of file runDataProcessing.cxx.
Definition at line 426 of file runDataProcessing.cxx.
O2_DECLARE_DYNAMIC_LOG | ( | driver | ) |
O2_DECLARE_DYNAMIC_LOG | ( | gui | ) |
void overrideAll | ( | o2::framework::ConfigContext & | ctx, |
std::vector< o2::framework::DataProcessorSpec > & | workflow | ||
) |
Definition at line 2802 of file runDataProcessing.cxx.
void overrideCloning | ( | ConfigContext & | ctx, |
WorkflowSpec & | workflow | ||
) |
Definition at line 2370 of file runDataProcessing.cxx.
void overrideLabels | ( | ConfigContext & | ctx, |
WorkflowSpec & | workflow | ||
) |
Definition at line 2460 of file runDataProcessing.cxx.
void overridePipeline | ( | ConfigContext & | ctx, |
WorkflowSpec & | workflow | ||
) |
Definition at line 2420 of file runDataProcessing.cxx.
void printHelp | ( | bpo::variables_map const & | varmap, |
bpo::options_description const & | executorOptions, | ||
std::vector< DataProcessorSpec > const & | physicalWorkflow, | ||
std::vector< ConfigParamSpec > const & | currentWorkflowOptions | ||
) |
Definition at line 2313 of file runDataProcessing.cxx.
void processChildrenOutput | ( | uv_loop_t * | loop, |
DriverInfo & | driverInfo, | ||
DeviceInfos & | infos, | ||
DeviceSpecs const & | specs, | ||
DeviceControls & | controls | ||
) |
Definition at line 836 of file runDataProcessing.cxx.
bool processSigChild | ( | DeviceInfos & | infos, |
DeviceSpecs & | specs | ||
) |
Definition at line 919 of file runDataProcessing.cxx.
int runStateMachine | ( | DataProcessorSpecs const & | workflow, |
WorkflowInfo const & | workflowInfo, | ||
DataProcessorInfos const & | previousDataProcessorInfos, | ||
CommandInfo const & | commandInfo, | ||
DriverControl & | driverControl, | ||
DriverInfo & | driverInfo, | ||
DriverConfig & | driverConfig, | ||
std::vector< DeviceMetricsInfo > & | metricsInfos, | ||
std::vector< ConfigParamSpec > const & | detectedParams, | ||
boost::program_options::variables_map & | varmap, | ||
std::vector< ServiceSpec > & | driverServices, | ||
std::string | frameworkId | ||
) |
Cleanup the shared memory for the uniqueWorkflowId, in case we are unlucky and an old one is already present.
After INIT we go into RUNNING and eventually to SCHEDULE from there and back into running. This is because the general case would be that we start an application and then we wait for resource offers from DDS or whatever resource manager we use.
extract and apply process switches prune device inputs
FIXME: use commandline arguments as alternative
Set the default value for tracingFlags of each control to the command line value –dpl-tracing-flags
Set the value for the severity of displayed logs to the command line value –severity
Definition at line 1349 of file runDataProcessing.cxx.
void single_step_callback | ( | uv_timer_s * | ctx | ) |
Force single stepping of the children.
Definition at line 1210 of file runDataProcessing.cxx.
void spawnDevice | ( | uv_loop_t * | loop, |
DeviceRef | ref, | ||
std::vector< DeviceSpec > const & | specs, | ||
DriverInfo & | driverInfo, | ||
std::vector< DeviceControl > & | , | ||
std::vector< DeviceExecution > & | executions, | ||
std::vector< DeviceInfo > & | deviceInfos, | ||
std::vector< DataProcessingStates > & | allStates, | ||
ServiceRegistryRef | serviceRegistry, | ||
boost::program_options::variables_map & | varmap, | ||
std::vector< DeviceStdioContext > & | childFds, | ||
unsigned | parentCPU, | ||
unsigned | parentNode | ||
) |
This will start a new device by forking and executing a new child
Definition at line 674 of file runDataProcessing.cxx.
void spawnRemoteDevice | ( | uv_loop_t * | loop, |
std::string const & | , | ||
DeviceSpec const & | spec, | ||
DeviceControl & | , | ||
DeviceExecution & | , | ||
DeviceInfos & | deviceInfos, | ||
DataProcessingStatesInfos & | allStates | ||
) |
Definition at line 390 of file runDataProcessing.cxx.
void stream_config | ( | uv_work_t * | req | ) |
Definition at line 530 of file runDataProcessing.cxx.
void websocket_callback | ( | uv_stream_t * | stream, |
ssize_t | nread, | ||
const uv_buf_t * | buf | ||
) |
Definition at line 458 of file runDataProcessing.cxx.
A callback for the rest engine.
Definition at line 504 of file runDataProcessing.cxx.
auto bindGUIPort |
Definition at line 1276 of file runDataProcessing.cxx.
volatile sig_atomic_t double_sigint = false |
Definition at line 363 of file runDataProcessing.cxx.
volatile sig_atomic_t forceful_exit = false |
Definition at line 361 of file runDataProcessing.cxx.
std::vector<DeviceMetricsInfo> gDeviceMetricsInfos |
Definition at line 171 of file runDataProcessing.cxx.
volatile sig_atomic_t graceful_exit = false |
Definition at line 360 of file runDataProcessing.cxx.
volatile sig_atomic_t sigchld_requested = false |
Definition at line 362 of file runDataProcessing.cxx.