-/* $Id: pipe.cpp,v 1.9 2007-01-25 14:05:54 adam Exp $
+/* $Id: pipe.cpp,v 1.10 2007-02-19 12:51:08 adam Exp $
Copyright (c) 2005-2007, Index Data.
See the LICENSE file for details
WORD wVersionRequested = MAKEWORD(2, 0);
if (WSAStartup( wVersionRequested, &wsaData ))
throw Pipe::Error("WSAStartup failed");
+#else
+ port_to_use = 0; // we'll just use pipe on Unix
#endif
if (port_to_use)
{
else
{
#ifndef WIN32
- pipe(m_p->m_fd);
+ if (pipe(m_p->m_fd))
+ throw Pipe::Error("pipe failed");
+ else
+ {
+ assert(m_p->m_fd[0] >= 0);
+ assert(m_p->m_fd[1] >= 0);
+ }
#endif
}
}
-/* $Id: test_pipe.cpp,v 1.8 2007-01-25 14:05:54 adam Exp $
+/* $Id: test_pipe.cpp,v 1.9 2007-02-19 12:51:08 adam Exp $
Copyright (c) 2005-2007, Index Data.
See the LICENSE file for details
*/
#include "config.hpp"
-
+#include <errno.h>
#include <yazpp/socket-manager.h>
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef WIN32
+#include <winsock.h>
+#endif
+
+#if HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+
#include <iostream>
#include <stdexcept>
private:
yazpp_1::ISocketObservable *m_obs;
mp::Pipe m_pipe;
+ bool m_data;
bool m_timeout;
public:
Timer(yazpp_1::ISocketObservable *obs, int duration);
void socketNotify(int event);
bool timeout() { return m_timeout; };
+ bool data() { return m_data; };
};
Timer::Timer(yazpp_1::ISocketObservable *obs,
int duration) :
- m_obs(obs), m_pipe(9122), m_timeout(false)
+ m_obs(obs), m_pipe(9122), m_data(false), m_timeout(false)
{
obs->addObserver(m_pipe.read_fd(), this);
obs->maskObserver(this, yazpp_1::SOCKET_OBSERVE_READ);
obs->timeoutObserver(this, duration);
+#ifdef WIN32
+ int r = send(m_pipe.write_fd(), "", 1, 0);
+#else
+ int r = write(m_pipe.write_fd(), "", 1);
+#endif
+ if (r == -1)
+ {
+ std::cout << "Error write: "<< strerror(errno) << std::endl;
+ }
+ BOOST_CHECK_EQUAL(write(m_pipe.write_fd(), "", 1), 1);
}
void Timer::socketNotify(int event)
{
- m_timeout = true;
- m_obs->deleteObserver(this);
+ if (event & yazpp_1::SOCKET_OBSERVE_READ)
+ {
+ m_data = true;
+ char buf[3];
+#ifdef WIN32
+ int r = recv(m_pipe.read_fd(), buf, 1, 0);
+#else
+ int r = read(m_pipe.read_fd(), buf, 1);
+#endif
+ if (r == -1)
+ {
+ std::cout << "Error read: "<< strerror(errno) << std::endl;
+ }
+ }
+ else if (event && yazpp_1::SOCKET_OBSERVE_TIMEOUT)
+ {
+ m_timeout = true;
+ m_obs->deleteObserver(this);
+ }
}
BOOST_AUTO_UNIT_TEST( test_pipe_1 )
{
yazpp_1::SocketManager mySocketManager;
- Timer t(&mySocketManager, 0);
+ Timer t(&mySocketManager, 1);
while (mySocketManager.processEvent() > 0)
if (t.timeout())
break;
BOOST_CHECK(t.timeout());
+ BOOST_CHECK(t.data());
}
/*
-/* $Id: thread_pool_observer.cpp,v 1.18 2007-01-25 14:05:54 adam Exp $
+/* $Id: thread_pool_observer.cpp,v 1.19 2007-02-19 12:51:08 adam Exp $
Copyright (c) 2005-2007, Index Data.
See the LICENSE file for details
if (event & SOCKET_OBSERVE_READ)
{
char buf[2];
+#ifdef WIN32
recv(m_p->m_pipe.read_fd(), buf, 1, 0);
+#else
+ read(m_p->m_pipe.read_fd(), buf, 1);
+#endif
IThreadPoolMsg *out;
{
boost::mutex::scoped_lock output_lock(m_p->m_mutex_output_data);
{
boost::mutex::scoped_lock output_lock(m_p->m_mutex_output_data);
m_p->m_output.push_back(out);
+#ifdef WIN32
send(m_p->m_pipe.write_fd(), "", 1, 0);
+#else
+ write(m_p->m_pipe.write_fd(), "", 1);
+#endif
}
}
}