aboutsummaryrefslogtreecommitdiffstats
path: root/tests/CommonLibs/InterthreadTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/CommonLibs/InterthreadTest.cpp')
-rw-r--r--tests/CommonLibs/InterthreadTest.cpp137
1 files changed, 137 insertions, 0 deletions
diff --git a/tests/CommonLibs/InterthreadTest.cpp b/tests/CommonLibs/InterthreadTest.cpp
new file mode 100644
index 0000000..c131c2a
--- /dev/null
+++ b/tests/CommonLibs/InterthreadTest.cpp
@@ -0,0 +1,137 @@
+/*
+* Copyright 2008 Free Software Foundation, Inc.
+*
+*
+* This software is distributed under the terms of the GNU Affero Public License.
+* See the COPYING file in the main directory for details.
+*
+* This use of this software may be subject to additional restrictions.
+* See the LEGAL file in the main directory for details.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+
+
+#include "Threads.h"
+#include "Interthread.h"
+#include <iostream>
+
+using namespace std;
+
+
+InterthreadQueue<int> gQ;
+InterthreadMap<int,int> gMap;
+
+int q_last_read_val = -1;
+int q_last_write_val;
+int m_last_read_val;
+int m_last_write_val;
+
+void* qWriter(void*)
+{
+ int *p;
+ for (int i=0; i<20; i++) {
+ p = new int;
+ *p = i;
+ CERR("queue write " << *p);
+ gQ.write(p);
+ q_last_write_val = i;
+ if (random()%2) sleep(1);
+ }
+ p = new int;
+ *p = -1;
+ gQ.write(p);
+ return NULL;
+}
+
+void* qReader(void*)
+{
+ bool done = false;
+ while (!done) {
+ int *p = gQ.read();
+ CERR("queue read " << *p);
+ if (*p<0) {
+ assert(q_last_read_val == 19 && *p == -1);
+ done = true;
+ } else {
+ assert(q_last_read_val == *p - 1);
+ q_last_read_val = *p;
+ }
+ delete p;
+ }
+ return NULL;
+}
+
+
+void* mapWriter(void*)
+{
+ int *p;
+ for (int i=0; i<20; i++) {
+ p = new int;
+ *p = i;
+ CERR("map write " << *p);
+ gMap.write(i,p);
+ m_last_write_val = i;
+ if (random()%2) sleep(1);
+ }
+ return NULL;
+}
+
+void* mapReader(void*)
+{
+ for (int i=0; i<20; i++) {
+ int *p = gMap.read(i);
+ CERR("map read " << *p);
+ assert(*p == i);
+ m_last_read_val = *p;
+ // InterthreadMap will delete the pointers
+ // delete p;
+ }
+ return NULL;
+}
+
+
+
+
+
+
+int main(int argc, char *argv[])
+{
+ Thread qReaderThread;
+ qReaderThread.start(qReader,NULL);
+ Thread mapReaderThread;
+ mapReaderThread.start(mapReader,NULL);
+
+ Thread qWriterThread;
+ qWriterThread.start(qWriter,NULL);
+ Thread mapWriterThread;
+ mapWriterThread.start(mapWriter,NULL);
+
+ qReaderThread.join();
+ qWriterThread.join();
+ mapReaderThread.join();
+ mapWriterThread.join();
+
+ assert(q_last_write_val == 19);
+ assert(q_last_read_val == 19);
+ assert(m_last_write_val == 19);
+ assert(m_last_read_val == 19);
+
+ printf("Done\n");
+}
+
+
+// vim: ts=4 sw=4