[
https://issues.apache.org/jira/browse/THRIFT-1690?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13496527#comment-13496527
]
Ben Craig commented on THRIFT-1690:
-----------------------------------
The old code was a bit of a portability mess. The new code is a different
portability mess. The toy program that I've been using for my own testing has
gotten away without needing to touch the raw HANDLE / file descriptor. I would
prefer to solve most use cases in that way, but still provide access to the
underlying OS object when platform specific things are needed. I think #ifdefs
are inevitable there. There is still significant room to improve though. I
don't think IntPtr is the answer though, as that is too large on 64-bit *nix
platforms.
The projects I am working on care a lot about named pipes and named AF_UNIX
sockets. This is for Mac, Windows, and Linux, both 32 and 64-bit. I am
actively working on making it easy to use these in cross-platform code. I hope
to have patches for the following problems in the next month:
1. Portable naming. I want to be able to construct my TTransport (or
TServerTransport) without ifdefs. That means that "MyPipe" needs to have the
appropriate slashes added on Windows (already done). It also means that
"MyPipe" needs to either be put in a special folder on *nix, or needs to be an
abstract socket. Putting the socket file in the app's current working
directory probably isn't desirable.
2. Better cleanup. Stop doesn't currently work on TPipeServer. Stopping
AF_UNIX sockets doesn't clean up the file (and I'm not sure it can safely).
Both of these cases are important to me, because my use cases aren't of the
"launch the app and let it run 2 years" variety. My clients and servers start
and stop in interactive scenarios.
I don't have a personal need / interest in anonymous pipes. I wasn't trying to
break them, but I also didn't have tests for them. I think the correct way to
handle these is to have a new TServerTransport class specifically for anonymous
pipes. It may forward to TPipeServer and TServerSocket, but it can have the
constructors that make sense for anonymous pipes, and not carry the baggage of
named pipes.
For the record, I'm not thrilled with the "multi-purpose" transports like
TSocket, TPipe, and their server counterparts. Porting single aspects of those
classes is normally easy, but porting all of the aspects often doesn't work.
My preferred approach would have involved TTCPSocket, TNamedSocket(?),
TAnonymousSocket, and the like. A lot of them would have similar
implementations (possibly forwarding to helper classes), but it would make for
more portable client code.
> Sockets and Pipe Handles truncated on Win64
> -------------------------------------------
>
> Key: THRIFT-1690
> URL: https://issues.apache.org/jira/browse/THRIFT-1690
> Project: Thrift
> Issue Type: Bug
> Components: C++ - Library
> Affects Versions: 0.9
> Environment: 64-bit Windows
> Reporter: Ben Craig
> Assignee: Roger Meier
> Attachments: lib_socket_typedef.patch, libthrift_pipe_size.patch,
> libthrift_warning_purge.patch
>
> Original Estimate: 48h
> Remaining Estimate: 48h
>
> On 64-bit Windows, "int" is a 32-bit value. SOCKET and HANDLE are 64-bit.
> All of the files dealing with sockets in thrift use "int" as the type of a
> socket, as this is the idiomatic way to handle sockets on POSIX systems. For
> portability, a SOCKET typedef is probably needed.
> For the Pipe Server and Pipe Transport, HANDLEs are cast to ints to store as
> member variables for some reason (maybe to avoid #including <windows.h> in a
> header?).
> Both of these situations can result in invalid handles being used (and valid
> handles being leaked) when the system is under load.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira