}
}
-template<class T>
-bool ObjectPipe<T>::read(T* t)
-{
- T* ptr;
- int ret = ::read(d_fds[0], &ptr, sizeof(ptr));
-
- if(ret < 0)
- unixDie("read");
- if(ret==0)
- return false;
- if(ret != sizeof(ptr))
- throw std::runtime_error("Partial read, should not happen");
- *t=*ptr;
- delete ptr;
- return true;
-}
-
template<class T>
int ObjectPipe<T>::readTimeout(T* t, double msec)
{
- T* ptr;
-
- int ret = waitForData(d_fds[0], 0, 1000*msec);
- if(ret < 0)
- unixDie("waiting for data in object pipe");
- if(ret == 0)
- return -1;
-
- ret = ::read(d_fds[0], &ptr, sizeof(ptr)); // this is BLOCKING!
-
- if(ret < 0)
- unixDie("read");
- if(ret==0)
- return false;
- if(ret != sizeof(ptr))
- throw std::runtime_error("Partial read, should not happen 2");
- *t=*ptr;
- delete ptr;
- return 1;
+ while (true) {
+ int ret = waitForData(d_fds[0], 0, 1000*msec);
+ if (ret < 0) {
+ if (errno == EINTR) {
+ continue;
+ }
+ unixDie("waiting for data in object pipe");
+ }
+ else if (ret == 0) {
+ return -1;
+ }
+
+ T* ptr = nullptr;
+ ret = ::read(d_fds[0], &ptr, sizeof(ptr)); // this is BLOCKING!
+
+ if (ret < 0) {
+ if (errno == EINTR) {
+ continue;
+ }
+ unixDie("read");
+ }
+ else if (ret == 0) {
+ return false;
+ }
+
+ if (ret != sizeof(ptr)) {
+ throw std::runtime_error("Partial read, should not happen 2");
+ }
+
+ *t = *ptr;
+ delete ptr;
+ return 1;
+ }
}
ObjectPipe();
~ObjectPipe();
void write(T& t);
- bool read(T* t); // returns false on EOF
- int readTimeout(T* t, double msec); //!< -1 is timeout, 0 is no data, 1 is data. msec<0 waits infinitely wrong. msec==0 = undefined
+ int readTimeout(T* t, double msec); //!< -1 is timeout, 0 is no data, 1 is data. msec<0 waits infinitely long. msec==0 = undefined
void close();
private:
int d_fds[2];
int i;
for(int n=0; n < 100; ++n) {
- bool res=op.read(&i);
- BOOST_CHECK_EQUAL(res, true);
+ int res=op.readTimeout(&i, -1);
+ BOOST_CHECK_EQUAL(res, 1);
BOOST_CHECK_EQUAL(n, i);
}
op.close();
- BOOST_CHECK_EQUAL(op.read(&i), false);
+ BOOST_CHECK_EQUAL(op.readTimeout(&i, 1), 0);
};