Go to the documentation of this file.00001
00009
00010
00011
00012
00013 #include <iostream>
00014 #include <cstdlib>
00015 #include <gtest/gtest.h>
00016 #include <ecl/time/sleep.hpp>
00017 #include <ecl/time/timestamp.hpp>
00018 #include "../../include/ecl/ipc/semaphore.hpp"
00019 #include "../../include/ecl/ipc/shared_memory.hpp"
00020
00021 #ifdef ECL_HAS_SEMAPHORES
00022
00023
00024
00025
00026
00027 using std::string;
00028 using ecl::SharedMemory;
00029 using ecl::Semaphore;
00030 using ecl::Duration;
00031 using ecl::Sleep;
00032
00033
00034
00035
00036
00041
00042
00043
00044
00045 namespace ecl {
00046 namespace ipc {
00047 namespace tests {
00048
00049
00050
00051
00052
00053 class SemaphoreTimedData {
00054 public:
00055 double value[2];
00056 void initialise() { value[0] = 1.0; value[1] = 2.0; };
00057 };
00058
00059 }
00060 }
00061 }
00062
00063
00064
00065
00066
00067 using ecl::ipc::tests::SemaphoreTimedData;
00068
00069
00070
00071
00072
00077
00078
00079
00080
00081 TEST(SemaphoreTimedTests,access) {
00082
00083 string sm_name("shared_memory");
00084 string sem_name("shared_semaphore");
00085 Sleep sleep;
00086 Duration timeout(0,750000000);
00087
00088 pid_t pID = fork();
00089 if (pID == 0)
00090 {
00091
00092
00093
00094
00095 sleep(1);
00096 try {
00097 SharedMemory<SemaphoreTimedData> sm(sm_name);
00098 Semaphore semaphore(sem_name);
00099
00100 bool result = semaphore.trylock(timeout);
00101 EXPECT_FALSE(result);
00102 if ( result ) {
00103
00104 } else {
00105
00106
00107 if ( (result = semaphore.trylock(timeout)) ) {
00108 EXPECT_TRUE(result);
00109
00110 } else {
00111
00112 }
00113 }
00114 semaphore.unlock();
00115 } catch ( ecl::StandardException &e ) {
00116
00117 std::cout << e.what() << std::endl;
00118 }
00119 }
00120 else if (pID < 0)
00121 {
00122 std::cerr << "Failed to fork" << std::endl;
00123 exit(1);
00124 }
00125 else
00126 {
00127
00128
00129
00130 try {
00131 SharedMemory<SemaphoreTimedData> sm(sm_name);
00132 Semaphore semaphore(sem_name);
00133 SemaphoreTimedData *data = sm.data();
00134 semaphore.lock();
00135 data->value[0] = 1.3;
00136 data->value[1] = 2.3;
00137 EXPECT_EQ(1.3,data->value[0]);
00138 EXPECT_EQ(2.3,data->value[1]);
00139
00140
00141 sleep(2);
00142
00143 semaphore.unlock();
00144 sleep(2);
00145 } catch ( ecl::StandardException &e ) {
00146
00147 std::cout << e.what() << std::endl;
00148 }
00149 }
00150 }
00151
00152
00153
00154
00155
00156 int main(int argc, char **argv) {
00157
00158 std::cout << std::endl;
00159 std::cout << "What you should see:" << std::endl;
00160 std::cout << " - Process forks" << std::endl;
00161 std::cout << " - Parent creates shared memory." << std::endl;
00162 std::cout << " - Parent locks a semaphore and enters shared memory for 2 seconds." << std::endl;
00163 std::cout << " - Child waits one second and tries lock for 750ms." << std::endl;
00164 std::cout << " - Child fails and again tries lock for 750ms." << std::endl;
00165 std::cout << " - Child succeeds in locking.." << std::endl;
00166 std::cout << std::endl;
00167
00168 testing::InitGoogleTest(&argc,argv);
00169 return RUN_ALL_TESTS();
00170 }
00171
00172 #else
00173
00174
00175
00176
00177
00178 int main(int argc, char **argv) {
00179 std::cout << std::endl;
00180 std::cout << "Semaphores are not supported on this platform (or ecl is just lacking)." << std::endl;
00181 std::cout << std::endl;
00182 return 0;
00183 }
00184
00185 #endif
00186
00187
00188
00189
00190
00191
00192