00001
00002
00003
00004 #include <wibble/sys/mutex.h>
00005 #include <wibble/sys/thread.h>
00006
00007 #include <wibble/test.h>
00008
00009 using namespace std;
00010 using namespace wibble::sys;
00011
00012 struct TestThread {
00013
00014
00015 class Thread1 : public Thread
00016 {
00017 protected:
00018 int& res;
00019 int val;
00020
00021 void* main()
00022 {
00023 res = val;
00024 return (void*)val;
00025 }
00026 public:
00027 Thread1(int& res, int val) : res(res), val(val) {}
00028 };
00029
00030
00031 class Thread2 : public Thread
00032 {
00033 protected:
00034 int& res;
00035 Mutex& mutex;
00036 bool done;
00037
00038 void* main()
00039 {
00040 while (!done)
00041 {
00042 MutexLock lock(mutex);
00043 ++res;
00044 }
00045 return 0;
00046 }
00047
00048 public:
00049 Thread2(int& res, Mutex& mutex) :
00050 res(res), mutex(mutex), done(false) {}
00051 void quit() { done = true; }
00052 };
00053
00054
00055 Test execution() {
00056 int val = 0;
00057
00058 Thread1 assigner(val, 42);
00059 assigner.start();
00060 assert_eq(assigner.join(), (void*)42);
00061 assert_eq(val, 42);
00062 }
00063
00064
00065 Test sharedMemory() {
00066 int val = 0;
00067 Mutex mutex;
00068
00069 Thread2 incrementer(val, mutex);
00070 incrementer.start();
00071
00072 bool done = false;
00073 while (!done)
00074 {
00075 MutexLock lock(mutex);
00076 if (val > 100)
00077 done = true;
00078 }
00079 incrementer.quit();
00080 assert_eq(incrementer.join(), (void*)0);
00081 }
00082
00083 };
00084
00085