1
0

Self tests (#3242)

* SelfTests: Added a cEvent stress-test.

* cNetwork: Fixed startup event hang.

The original code used to hang with a ~ 1:50000 chance, because on Linux the cEvent was destroyed before its "Set()" returned.
This commit is contained in:
Mattes D
2016-06-26 15:51:12 +02:00
committed by worktycho
parent 4e2c92d15f
commit 1462e4f70e
5 changed files with 114 additions and 6 deletions

View File

@@ -0,0 +1,60 @@
// StressEvent.cpp
// Stress-tests the cEvent implementation
#include "Globals.h"
#include <thread>
/** Number of repetitions of the thread loops. */
const int NUM_REPETITIONS = 5000;
// Forward declarations are needed for clang
void runThread(cEvent * a_Event1, cEvent * a_Event2, const char * a_ThreadName);
/** Function that runs in a separate thread, notifies event1 and waits for event2, in a loop, NUM_REPETITIONS times.
This basically simulates a producer / consumer pattern with 2 events, one for "queue empty", the other for "queue full". */
void runThread(cEvent * a_Event1, cEvent * a_Event2, const char * a_ThreadName)
{
LOG("Thread %s started", a_ThreadName);
for (int i = 0; i < NUM_REPETITIONS; ++i)
{
// LOGD("%s: Waiting for event %p (%d)", a_ThreadName, a_Event2, i);
a_Event2->Wait();
// LOGD("%s: Setting event %p (%d)", a_ThreadName, a_Event1, i);
a_Event1->SetAll();
}
LOG("Thread %s finished", a_ThreadName);
}
int main()
{
LOG("Test started");
cEvent event1, event2;
event1.Set();
std::thread thread1(&runThread, &event1, &event2, "A");
std::thread thread2(&runThread, &event2, &event1, "B");
thread1.join();
thread2.join();
LOG("Test finished");
return 0;
}