mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-06-07 10:30:41 +02:00
naming
This commit is contained in:
parent
88c65c506f
commit
6cc13f9dc1
@ -4,7 +4,7 @@
|
|||||||
* published at http://www.kjellkod.cc/threadsafecircularqueue
|
* published at http://www.kjellkod.cc/threadsafecircularqueue
|
||||||
* 2009-11-02
|
* 2009-11-02
|
||||||
* @author Kjell Hedstr<EFBFBD>m, hedstrom@kjellkod.cc
|
* @author Kjell Hedstr<EFBFBD>m, hedstrom@kjellkod.cc
|
||||||
* modified by the sls detetor group
|
* modified by the sls detector group
|
||||||
* */
|
* */
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
@ -15,21 +15,24 @@
|
|||||||
* Thread safe for one reader, and one writer */
|
* Thread safe for one reader, and one writer */
|
||||||
template <typename Element> class CircularFifo {
|
template <typename Element> class CircularFifo {
|
||||||
private:
|
private:
|
||||||
std::vector<Element *> array;
|
size_t tail{0};
|
||||||
size_t tail; // input index
|
size_t head{0};
|
||||||
size_t head; // output index
|
|
||||||
size_t capacity;
|
size_t capacity;
|
||||||
|
std::vector<Element *> data;
|
||||||
mutable sem_t data_mutex;
|
mutable sem_t data_mutex;
|
||||||
mutable sem_t free_mutex;
|
mutable sem_t free_mutex;
|
||||||
size_t increment(size_t i) const;
|
size_t increment(size_t i) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CircularFifo(size_t size) : tail(0), head(0) {
|
explicit CircularFifo(size_t size) : capacity(size + 1), data(capacity) {
|
||||||
capacity = size + 1;
|
|
||||||
array.resize(capacity);
|
|
||||||
sem_init(&data_mutex, 0, 0);
|
sem_init(&data_mutex, 0, 0);
|
||||||
sem_init(&free_mutex, 0, size);
|
sem_init(&free_mutex, 0, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CircularFifo(const CircularFifo &) = delete;
|
||||||
|
CircularFifo(CircularFifo&&) = delete;
|
||||||
|
|
||||||
virtual ~CircularFifo() {
|
virtual ~CircularFifo() {
|
||||||
sem_destroy(&data_mutex);
|
sem_destroy(&data_mutex);
|
||||||
sem_destroy(&free_mutex);
|
sem_destroy(&free_mutex);
|
||||||
@ -71,7 +74,7 @@ bool CircularFifo<Element>::push(Element *&item, bool no_block) {
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
sem_wait(&free_mutex);
|
sem_wait(&free_mutex);
|
||||||
array[tail] = item;
|
data[tail] = item;
|
||||||
tail = increment(tail);
|
tail = increment(tail);
|
||||||
sem_post(&data_mutex);
|
sem_post(&data_mutex);
|
||||||
return true;
|
return true;
|
||||||
@ -91,7 +94,7 @@ bool CircularFifo<Element>::pop(Element *&item, bool no_block) {
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
sem_wait(&data_mutex);
|
sem_wait(&data_mutex);
|
||||||
item = array[head];
|
item = data[head];
|
||||||
head = increment(head);
|
head = increment(head);
|
||||||
sem_post(&free_mutex);
|
sem_post(&free_mutex);
|
||||||
return true;
|
return true;
|
||||||
|
52
slsReceiverSoftware/tests/test-CircularFifo.cpp
Normal file
52
slsReceiverSoftware/tests/test-CircularFifo.cpp
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
#include "catch.hpp"
|
||||||
|
#include "CircularFifo.h"
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
TEST_CASE("Empty buffer"){
|
||||||
|
CircularFifo<char> fifo(0);
|
||||||
|
|
||||||
|
//Since the fifo can hold zero elements
|
||||||
|
//its both empty and full
|
||||||
|
CHECK(fifo.isEmpty()== true);
|
||||||
|
CHECK(fifo.isFull()== true);
|
||||||
|
|
||||||
|
|
||||||
|
//push fails
|
||||||
|
char* c = new char;
|
||||||
|
*c = 'h';
|
||||||
|
CHECK(fifo.push(c, true) == false);
|
||||||
|
|
||||||
|
//pop fails
|
||||||
|
CHECK(fifo.pop(c, true) == false);
|
||||||
|
|
||||||
|
delete c;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Push pop"){
|
||||||
|
CircularFifo<int> fifo(5);
|
||||||
|
|
||||||
|
std::vector<int> vec{3,7,12,3,4};
|
||||||
|
int* p = &vec[0];
|
||||||
|
|
||||||
|
for(size_t i =0; i!=vec.size(); ++i){
|
||||||
|
fifo.push(p);
|
||||||
|
++p;
|
||||||
|
CHECK(fifo.getDataValue() == i+1);
|
||||||
|
CHECK(fifo.getFreeValue() == 4-i);
|
||||||
|
}
|
||||||
|
|
||||||
|
CHECK(fifo.isEmpty()== false);
|
||||||
|
CHECK(fifo.isFull()== true);
|
||||||
|
|
||||||
|
for(size_t i = 0; i!= vec.size(); ++i){
|
||||||
|
fifo.pop(p);
|
||||||
|
CHECK(*p == vec[i]);
|
||||||
|
CHECK(fifo.getDataValue() == 4-i);
|
||||||
|
CHECK(fifo.getFreeValue() == i+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
CHECK(fifo.isEmpty()== true);
|
||||||
|
CHECK(fifo.isFull()== false);
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user