I don't want to be snarky, but you guys who are interested in having WIndows 
libraries are slowly reproducing the work I already did and submitted as part 
of https://issues.apache.org/jira/browse/THRIFT-591.

This includes a full ASIO based implementation of local sockets, implemented as 
Unix domain sockets on *nix, and Windows named pipes on Windows. It won't apply 
against the current sources, but the named pipe stuff was all new code anyway.

- Rush

On Dec 2, 2011, at 10:47 AM, Alex Parenteau wrote:

> Hi Peace,
> 
> I would use boost::asio, and use the ability of it to handle Windows/Posix 
> file descriptors.
> 
> Below are some snippets of code that might help illustrate this (don't try to 
> compile!)
> 
> I don't know much of the pipe transport in thrift, so this may not be 
> applicable to your question.
> 
> As an orthogonal thought, I was wondering if anybody has put some thought 
> around using boost::asio for async thrift servers (right now using libevent).
> 
> Regards,
> alex
> 
> #include <boost/asio.hpp> 
> #include <boost/system/windows_error.hpp>
> 
> #ifdef DVA_OS_WIN
>       using boost::asio::windows::stream_handle;
>       typedef stream_handle platform_stream;
>       typedef HANDLE platform_descriptor;
> #     define PIPE_EOF_ERROR_CODE boost::system::windows_error::broken_pipe
> #else
>       using boost::asio::posix::stream_descriptor;
>       typedef stream_descriptor platform_stream;
>       typedef int platform_descriptor;
> #     define PIPE_EOF_ERROR_CODE boost::asio::error::eof
> #endif
> 
>       boost::asio::io_service io_service_;
>       platform_stream pipe_;
>       std::vector<char> data_;
>       bool done_;
>       bool error_;
>       size_t total_size_;
>       boost::asio::strand strand_;
>       boost::thread thread_;
> 
> PipeSession(platform_descriptor fd) :
>               io_service_(), pipe_(io_service_, fd),
> {
> }
> 
> bool PipeSession ::start()
> {
> #ifdef LINUX
>       for (;;)
>       {
>               boost::asio::posix::descriptor_base::bytes_readable 
> command(true);
>               pipe_.io_control(command);
>               std::size_t bytes_readable = command.get();
> 
>               if(bytes_readable) {
>                       break;
>               }
>       }
> #endif
>       _thread = boost::thread(boost::bind(&PipeSession::run))
> 
>       return true;
> }
> 
> void PipeSession ::run() {
>       try {
>               pipe_.async_read_some(boost::asio::buffer(data_),
>                       strand_.wrap(boost::bind(&PipeSession::handle_read,
>                       this, boost::asio::placeholders::error,
>                       boost::asio::placeholders::bytes_transferred)));
> 
>                       std::size_t num = io_service_.run();
> 
>               } catch(const boost::system::system_error& e) {
>                       done_ = true;
>                       if(e.code() != PIPE_EOF_ERROR_CODE)
>                               throw;
>               }
> 
>       static platform_descriptor CreatePipeFD(const std::string& pipeName, 
> bool readFlag) {
> #ifdef WIN32
>               HANDLE fd = CreateNamedPipe( 
>                       pipeName.c_str(),    // pipe name 
>                       PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,       // 
> read/write access TODO PIPE_ACCESS_INBOUND? PIPE_ACCESS_OUTBOUND?
>                       PIPE_TYPE_BYTE |          // byte type pipe 
>                       PIPE_READMODE_BYTE |      // byte-read mode 
>                       PIPE_WAIT,                // blocking mode 
>                       PIPE_UNLIMITED_INSTANCES, // max. instances  
>                       BUFSIZE,                  // output buffer size 
>                       BUFSIZE,                  // input buffer size 
>                       0,                        // client time-out 
>                       NULL);                    // default security attribute 
> 
>               if(fd == INVALID_HANDLE_VALUE) {
>                       throw std::runtime_error("CreateNamedPipe failed");
>               }
> 
>               OVERLAPPED overlapped = {0};
>               overlapped.hEvent = CreateEvent(0,TRUE,FALSE,0);
>               if(ConnectNamedPipe(fd, &overlapped) != FALSE || GetLastError() 
> != ERROR_IO_PENDING) {
>                       CloseHandle(overlapped.hEvent);
>                       CloseHandle(fd);
>                       throw std::runtime_error("ConnectNamedPipe failed");
>               }
> #else
>               if(mkfifo(pipeName .c_str(), 0660) < 0) {
>                       throw std::runtime_error("fifo failed");
>               }
> 
>               int fd = open(pipeName c_str(), (readFlag ? O_RDONLY : O_RDWR) 
> | O_NONBLOCK);
>               if(fd <= 0) {
>                       throw std::runtime_error("open failed");
>               }
> #endif
> 
> #ifdef WIN32
>               DWORD waitRes;
>               if((waitRes = WaitForSingleObject(overlapped.hEvent, 
> LAUNCH_TIMEOUT * 1000)) != WAIT_OBJECT_0) {
>                       CloseHandle(overlapped.hEvent);
>                       CloseHandle(fd);
>                       throw std::runtime_error("WaitForSingleObject failed");
>               }
>               CloseHandle(overlapped.hEvent);
> 
> #endif
> 
>               return fd;
>       }
> }
> 
> -----Original Message-----
> From: Peace [mailto:p...@yahoo.com] 
> Sent: Thursday, December 01, 2011 3:24 PM
> To: user@thrift.apache.org
> Subject: Pipe transport for Windows
> 
> Hello group,
> 
> I am implementing Named and Anonymous Pipes transport for Thrift on the 
> Windows platform.  The motivation for this is to provide a lightweight local 
> IPC transport for applications that run entirely on one system. Unix already 
> has domain sockets support in the TSocket transport but that does not work on 
> Windows.  I would have preferred a cross-platform solution but Windows pipes 
> are much too different from the Unix implementations. What are your thoughts 
> on submitting this for possible inclusion?  Would a Windows-only transport 
> bother people?  Is there a better way to accomplish this?
> 
> 
> Regards,
> Peace

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to