1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// This file is part of dpdk. It is subject to the license terms in the COPYRIGHT file found in the top-level directory of this distribution and at https://raw.githubusercontent.com/lemonrock/dpdk/master/COPYRIGHT. No part of dpdk, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the COPYRIGHT file.
// Copyright © 2016-2019 The developers of dpdk. See the COPYRIGHT file in the top-level directory of this distribution and at https://raw.githubusercontent.com/lemonrock/dpdk/master/COPYRIGHT.
//


/// A process common configuration execution error.
#[derive(Debug)]
pub enum ProcessCommonConfigurationExecutionError
{
	/// Process niceness adjustment failed.
	ProcessNicenessAdjustmentFailed(ProcessNicenessAdjustmentError),

	/// Process affinity setting failed.
	CouldNotSetCurrentProcessAffinity(io::Error),

	/// Could not load kernel modules (explanation in tuple argument).
	CouldNotLoadKernelModules(String),

	/// Could not write system control values.
	CouldNotWriteSystemControlValues(io::Error),

	/// Rescan of all PCI buses and devices failed.
	RescanOfAllPciBusesAndDevices(io::Error),

	/// CPU features failed validation (explanation in tuple argument).
	CpuFeaturesValidationFailed(String),

	/// Linux kernel command line failed validation (explanation in tuple argument).
	LinuxKernelCommandLineValidationFailed(String),

	/// Could not set work queue hyper thread affinity to online shared hyper threads.
	///
	/// Shared hyper threads are those shared with the operating system and other processes (ie not isolated).
	CouldNotSetWorkQueueHyperThreadAffinityToOnlineSharedHyperThreads(io::Error),

	/// Could not force watchdog hyper thread affinity to online shared hyper threads.
	///
	/// Shared hyper threads are those shared with the operating system and other processes (ie not isolated).
	CouldNotForceWatchdogHyperThreadAffinityToOnlineSharedHyperThreads(io::Error),

	/// Could not disable Transparent Huge Pages (THP).
	CouldNotDisableTransparentHugePages(DisableTransparentHugePagesError),

	/// Execution failed (with description of reason).
	ExecutionFailed(String),

	/// Execution panicked (with panic info data).
	ExecutionPanicked(Box<dyn Any + Send + 'static>),
}

impl Display for ProcessCommonConfigurationExecutionError
{
	#[inline(always)]
	fn fmt(&self, f: &mut Formatter) -> fmt::Result
	{
		<ProcessCommonConfigurationExecutionError as Debug>::fmt(self, f)
	}
}

impl error::Error for ProcessCommonConfigurationExecutionError
{
	#[inline(always)]
	fn source(&self) ->  Option<&(error::Error + 'static)>
	{
		use self::ProcessCommonConfigurationExecutionError::*;

		match self
		{
			&ProcessNicenessAdjustmentFailed(ref error) => Some(error),

			&CouldNotSetCurrentProcessAffinity(ref error) => Some(error),

			&CouldNotLoadKernelModules(_) => None,

			&CouldNotWriteSystemControlValues(ref error) => Some(error),

			&RescanOfAllPciBusesAndDevices(ref error) => Some(error),

			&CpuFeaturesValidationFailed(_) => None,

			&LinuxKernelCommandLineValidationFailed(_) => None,

			&CouldNotSetWorkQueueHyperThreadAffinityToOnlineSharedHyperThreads(ref error) => Some(error),

			&CouldNotForceWatchdogHyperThreadAffinityToOnlineSharedHyperThreads(ref error) => Some(error),

			&CouldNotDisableTransparentHugePages(ref error) => Some(error),

			&ExecutionFailed(..) => None,

			&ExecutionPanicked(..) => None,
		}
	}
}

impl From<ProcessNicenessAdjustmentError> for ProcessCommonConfigurationExecutionError
{
	#[inline(always)]
	fn from(error: ProcessNicenessAdjustmentError) -> Self
	{
		ProcessCommonConfigurationExecutionError::ProcessNicenessAdjustmentFailed(error)
	}
}

impl From<DisableTransparentHugePagesError> for ProcessCommonConfigurationExecutionError
{
	#[inline(always)]
	fn from(error: DisableTransparentHugePagesError) -> Self
	{
		ProcessCommonConfigurationExecutionError::CouldNotDisableTransparentHugePages(error)
	}
}

impl From<String> for ProcessCommonConfigurationExecutionError
{
	#[inline(always)]
	fn from(explanation: String) -> Self
	{
		ProcessCommonConfigurationExecutionError::ExecutionFailed(explanation)
	}
}

impl From<Box<dyn Any + Send + 'static>> for ProcessCommonConfigurationExecutionError
{
	#[inline(always)]
	fn from(panic_information: Box<dyn Any + Send + 'static>) -> Self
	{
		ProcessCommonConfigurationExecutionError::ExecutionPanicked(panic_information)
	}
}