
2 changed files with 121 additions and 1 deletions
@ -0,0 +1,117 @@ |
|||
// small unittest program for libpEpAdapter
|
|||
// TODO: use Gtest or the like for more modular unit tests!
|
|||
|
|||
#include "pc_container.hh" |
|||
#include <cstdio> |
|||
#include <cstdlib> |
|||
#include <iostream> |
|||
#include <thread> |
|||
|
|||
|
|||
using namespace pEp; |
|||
|
|||
|
|||
// Producer's data:
|
|||
class P |
|||
{ |
|||
public: |
|||
P(int i) |
|||
: data{new char[64]} |
|||
{ |
|||
snprintf(data, 63, "%i", i); |
|||
} |
|||
|
|||
P(const P&) = delete; |
|||
void operator=(const P&) = delete; |
|||
|
|||
~P() |
|||
{ |
|||
std::cerr << "~P(): data=" << (data ? data : "(NULL)" ) << '\n'; |
|||
delete[] data; |
|||
} |
|||
|
|||
char* data; |
|||
}; |
|||
|
|||
|
|||
// Consumer's data:
|
|||
class C |
|||
{ |
|||
public: |
|||
C(int _i) : i(_i) {} |
|||
int i; |
|||
}; |
|||
|
|||
pc_container<P,C> pc; |
|||
|
|||
void consumer_thread() |
|||
{ |
|||
bool keep_running = true; |
|||
int sum = 0; |
|||
while(keep_running) |
|||
{ |
|||
auto q = pc.get_changed(); // might block, that is okay.
|
|||
switch(q.state()) |
|||
{ |
|||
case PC_State::Created: |
|||
{ |
|||
const int value = atoi( q.pdata->data ); |
|||
if(value<0) |
|||
{ |
|||
std::cerr << "Q\n"; |
|||
keep_running = false; |
|||
}else{ |
|||
std::cerr << "C"; |
|||
q.cdata = new C( value ); |
|||
sum += q.cdata->i; |
|||
} |
|||
break; |
|||
} |
|||
case PC_State::Deleted: |
|||
{ |
|||
std::cerr << "D"; |
|||
sum -= q.cdata->i; |
|||
delete q.cdata; |
|||
break; |
|||
} |
|||
case PC_State::Changed: |
|||
{ |
|||
std::cerr << "X"; |
|||
sum -= q.cdata->i; |
|||
delete q.cdata; |
|||
q.cdata = new C( atoi( q.pdata->data ) ); |
|||
sum += q.cdata->i; |
|||
break; |
|||
} |
|||
default: throw "Illegal state"; |
|||
} |
|||
} |
|||
|
|||
std::cout << "Consumer sum: " << sum << ".\n"; |
|||
} |
|||
|
|||
int main() |
|||
{ |
|||
for(int i=0; i<10; ++i) |
|||
{ |
|||
pc.insert( new P(i) ); |
|||
} |
|||
|
|||
std::thread t{ &consumer_thread }; |
|||
|
|||
for(int i=10; i<100; ++i) |
|||
{ |
|||
pc.insert( new P(i) ); |
|||
} |
|||
|
|||
while( !pc.empty() ) |
|||
{ |
|||
auto q = pc.begin(); |
|||
delete q->pdata; |
|||
pc.erase( q ); |
|||
} |
|||
|
|||
pc.insert( new P(-1) ); |
|||
|
|||
t.join(); |
|||
} |
Loading…
Reference in new issue