3808 icmp statistics (#3982)

* fix(ICMPClinet): ICMPEventArgs Statistics bugs #3808

* fix(SpinlockMutex): 100 % CPU usage on single-core system #3852
This commit is contained in:
Aleksandar Fabijanic 2023-03-22 15:11:13 +01:00 committed by GitHub
parent 93d18162f3
commit bcae06f423
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 46 additions and 27 deletions

View File

@ -94,7 +94,8 @@
"valarray": "cpp",
"strstream": "cpp",
"future": "cpp",
"shared_mutex": "cpp"
"shared_mutex": "cpp",
"stop_token": "cpp"
},
"files.exclude": {
"**/.dep": true,

View File

@ -158,8 +158,9 @@ class Foundation_API SpinlockMutex
///
/// While in some cases (eg. locking small blocks of code)
/// busy-waiting may be an optimal solution, in many scenarios
/// spinlock may not be the right choice - it is up to the user to
/// choose the proper mutex type for their particular case.
/// spinlock may not be the right choice (especially on single-core
/// systems) - it is up to the user to choose the proper mutex type
/// for their particular case.
///
/// Works with the ScopedLock class.
{

View File

@ -145,18 +145,6 @@ inline int ICMPEventArgs::sent() const
}
inline int ICMPEventArgs::minRTT() const
{
return *std::min_element(_rtt.begin(), _rtt.end());
}
inline int ICMPEventArgs::maxRTT() const
{
return *std::max_element(_rtt.begin(), _rtt.end());
}
} } // namespace Poco::Net

View File

@ -57,11 +57,7 @@ public:
typedef AutoPtr<UDPHandlerImpl> Ptr;
typedef std::vector<Ptr> List;
typedef typename List::iterator Iterator;
#ifdef POCO_HAVE_STD_ATOMICS
typedef Poco::SpinlockMutex DFMutex;
#else
typedef Poco::FastMutex DFMutex;
#endif
static const MsgSizeT BUF_STATUS_IDLE = 0;
static const MsgSizeT BUF_STATUS_BUSY = -1;

View File

@ -35,7 +35,7 @@ ICMPEventArgs::ICMPEventArgs(const SocketAddress& address, int repetitions, int
_sent(0),
_dataSize(dataSize),
_ttl(ttl),
_rtt(repetitions, 0),
_rtt(repetitions, -1),
_errors(repetitions)
{
}
@ -77,7 +77,7 @@ std::string ICMPEventArgs::hostAddress() const
void ICMPEventArgs::setRepetitions(int repetitions)
{
_rtt.clear();
_rtt.resize(repetitions, 0);
_rtt.resize(repetitions, -1);
_errors.assign(repetitions, "");
}
@ -101,9 +101,9 @@ int ICMPEventArgs::received() const
{
int received = 0;
for (int i = 0; i < _rtt.size(); ++i)
for (const auto& r : _rtt)
{
if (_rtt[i]) ++received;
if (r != -1) ++received;
}
return received;
}
@ -133,7 +133,6 @@ void ICMPEventArgs::setReplyTime(int index, int time)
{
if (index >= _rtt.size())
throw InvalidArgumentException("Supplied index exceeds array capacity.");
if (0 == time) time = 1;
_rtt[index] = time;
}
@ -144,8 +143,9 @@ int ICMPEventArgs::replyTime(int index) const
throw InvalidArgumentException("Supplied index exceeds array capacity.");
if (-1 == index) index = _sent - 1;
return _rtt[index];
poco_assert (index < _rtt.size());
int ret = _rtt[index];
return (ret < 0) ? 0 : ret;
}
@ -153,7 +153,16 @@ int ICMPEventArgs::avgRTT() const
{
if (0 == _rtt.size()) return 0;
return (int) (std::accumulate(_rtt.begin(), _rtt.end(), 0) / _rtt.size());
int avg = 0, cnt = 0;
for (const auto& r : _rtt)
{
if (r != -1)
{
avg += r;
++cnt;
}
}
return cnt ? static_cast<int>(avg/cnt) : 0;
}
@ -165,4 +174,28 @@ float ICMPEventArgs::percent() const
}
int ICMPEventArgs::minRTT() const
{
int min = 0;
for (const auto& r : _rtt)
{
if (r != -1 && (r < min || min == 0))
min = r;
}
return min;
}
int ICMPEventArgs::maxRTT() const
{
int max = 0;
for (const auto& r : _rtt)
{
if (r != -1 && r > max)
max = r;
}
return max;
}
} } // namespace Poco::Net