2017-08-02 19:31:28 -03:00
|
|
|
#include <AP_HAL/AP_HAL.h>
|
|
|
|
|
|
|
|
#if CONFIG_HAL_BOARD == HAL_BOARD_LINUX
|
2016-07-06 17:28:42 -03:00
|
|
|
|
|
|
|
#include <condition_variable>
|
|
|
|
#include <iostream>
|
|
|
|
#include <mutex>
|
|
|
|
#include <thread>
|
|
|
|
|
2017-08-02 19:31:28 -03:00
|
|
|
#include <AP_HAL/utility/RingBuffer.h>
|
2016-07-06 17:28:42 -03:00
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
struct stress_pairs {
|
|
|
|
uint8_t pair_id;
|
|
|
|
uint8_t reader_buf[32];
|
|
|
|
ByteBuffer buf{128};
|
|
|
|
thread consumer;
|
|
|
|
thread producer;
|
|
|
|
};
|
|
|
|
|
|
|
|
//This buffer is shared among producers.
|
|
|
|
static uint8_t writer_buf[256];
|
|
|
|
|
|
|
|
mutex error_mtx;
|
|
|
|
condition_variable error_cond;
|
|
|
|
|
|
|
|
static void consumer_thread(struct stress_pairs *pair) {
|
|
|
|
uint32_t ret;
|
|
|
|
uint8_t last = 0;
|
|
|
|
|
|
|
|
for (;;) {
|
|
|
|
ret = pair->buf.read(pair->reader_buf, sizeof(pair->reader_buf));
|
|
|
|
|
|
|
|
for (uint32_t i = 0; i < ret; i++) {
|
|
|
|
if (pair->reader_buf[i] != last) {
|
|
|
|
fprintf(stderr, "[id=%u read=%u] Expected=%u Got=%u\n",
|
|
|
|
pair->pair_id, ret, last, pair->reader_buf[i]);
|
|
|
|
unique_lock<mutex> lck(error_mtx);
|
|
|
|
error_cond.notify_all();
|
|
|
|
}
|
|
|
|
last++;
|
|
|
|
last %= sizeof(writer_buf);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void producer_thread(struct stress_pairs *pair) {
|
|
|
|
uint8_t next = 0;
|
|
|
|
|
|
|
|
for (;;) {
|
|
|
|
// Overflow will do the magic
|
|
|
|
next += pair->buf.write(writer_buf + next, sizeof(writer_buf) - next);
|
|
|
|
next %= sizeof(writer_buf);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
usage(const char *program)
|
|
|
|
{
|
|
|
|
cout << "Usage: " << program << " [pairs]\n"
|
|
|
|
" pair - number of <producer,consumer> pairs that should be created. [Default=1]\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
int main(int argc, char const **argv) {
|
|
|
|
unsigned int i, pairs = 1;
|
|
|
|
struct stress_pairs *list;
|
|
|
|
|
|
|
|
if (argc > 1 && (!sscanf(argv[1], "%u", &pairs) || !pairs)) {
|
|
|
|
usage(argv[0]);
|
|
|
|
return EXIT_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < sizeof(writer_buf); i++)
|
|
|
|
writer_buf[i] = i;
|
|
|
|
|
|
|
|
cout << "Hello Threaded World!\n";
|
|
|
|
unique_lock<mutex> lck(error_mtx);
|
|
|
|
|
|
|
|
list = new struct stress_pairs[pairs];
|
|
|
|
for (i = 0; i < pairs; i++) {
|
|
|
|
cout << "Launching pair "<< i << "... ";
|
|
|
|
list[i].pair_id = i;
|
|
|
|
list[i].consumer = thread(consumer_thread, list + i);
|
|
|
|
list[i].producer = thread(producer_thread, list + i);
|
|
|
|
cout << "done!" << endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
error_cond.wait(lck);
|
|
|
|
|
|
|
|
// Let the OS do all the cleaning
|
|
|
|
cout << "Aborting: Good bye **failure** World!\n";
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
2017-08-02 19:31:28 -03:00
|
|
|
|
|
|
|
#else
|
|
|
|
|
2017-08-03 01:10:55 -03:00
|
|
|
#include <stdio.h>
|
|
|
|
|
2017-08-02 19:31:28 -03:00
|
|
|
const AP_HAL::HAL& hal = AP_HAL::get_HAL();
|
|
|
|
|
|
|
|
static void loop() { }
|
|
|
|
static void setup()
|
|
|
|
{
|
|
|
|
printf("Board not currently supported\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
AP_HAL_MAIN();
|
|
|
|
|
|
|
|
#endif
|