From 4df43be69c3f25a4a5f96d379a59d6c6d6f214fa Mon Sep 17 00:00:00 2001 From: Martin Sustrik Date: Wed, 17 Aug 2011 18:41:02 +0200 Subject: [PATCH] Fix the PGM support on win64 On win64 the size of file descriptor is not the same as size of int. The bug in PGM transport caused a runtime error because of this. The problem is fixed now. Signed-off-by: Martin Sustrik --- NEWS | 2 ++ src/pgm_receiver.cpp | 4 ++-- src/pgm_sender.cpp | 8 ++++---- src/pgm_socket.cpp | 8 ++++---- src/pgm_socket.hpp | 7 ++++--- 5 files changed, 16 insertions(+), 13 deletions(-) diff --git a/NEWS b/NEWS index c67a3ec8..4d893ee0 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,8 @@ Bug fixes --------- +* Fixed issue 240, assertion failure in pgm_socket.cpp:437. + * Fixed issue 238, assertion failure in zmq.cpp:655, when zmq_poll is used on an empty set, on Windows. diff --git a/src/pgm_receiver.cpp b/src/pgm_receiver.cpp index 4fadadca..7e7da969 100644 --- a/src/pgm_receiver.cpp +++ b/src/pgm_receiver.cpp @@ -60,8 +60,8 @@ int zmq::pgm_receiver_t::init (bool udp_encapsulation_, const char *network_) void zmq::pgm_receiver_t::plug (io_thread_t *io_thread_, i_inout *inout_) { // Retrieve PGM fds and start polling. - int socket_fd; - int waiting_pipe_fd; + fd_t socket_fd = retired_fd; + fd_t waiting_pipe_fd = retired_fd; pgm_socket.get_receiver_fds (&socket_fd, &waiting_pipe_fd); socket_handle = add_fd (socket_fd); pipe_handle = add_fd (waiting_pipe_fd); diff --git a/src/pgm_sender.cpp b/src/pgm_sender.cpp index 4d76433b..7a0c9512 100644 --- a/src/pgm_sender.cpp +++ b/src/pgm_sender.cpp @@ -64,10 +64,10 @@ int zmq::pgm_sender_t::init (bool udp_encapsulation_, const char *network_) void zmq::pgm_sender_t::plug (io_thread_t *io_thread_, i_inout *inout_) { // Alocate 2 fds for PGM socket. - int downlink_socket_fd = 0; - int uplink_socket_fd = 0; - int rdata_notify_fd = 0; - int pending_notify_fd = 0; + fd_t downlink_socket_fd = retired_fd; + fd_t uplink_socket_fd = retired_fd; + fd_t rdata_notify_fd = retired_fd; + fd_t pending_notify_fd = retired_fd; encoder.set_inout (inout_); diff --git a/src/pgm_socket.cpp b/src/pgm_socket.cpp index 5a829072..29ff3e61 100644 --- a/src/pgm_socket.cpp +++ b/src/pgm_socket.cpp @@ -394,8 +394,8 @@ zmq::pgm_socket_t::~pgm_socket_t () // Get receiver fds. receive_fd_ is signaled for incoming packets, // waiting_pipe_fd_ is signaled for state driven events and data. -void zmq::pgm_socket_t::get_receiver_fds (int *receive_fd_, - int *waiting_pipe_fd_) +void zmq::pgm_socket_t::get_receiver_fds (fd_t *receive_fd_, + fd_t *waiting_pipe_fd_) { socklen_t socklen; bool rc; @@ -421,8 +421,8 @@ void zmq::pgm_socket_t::get_receiver_fds (int *receive_fd_, // receive_fd_ is for incoming back-channel protocol packets. // rdata_notify_fd_ is raised for waiting repair transmissions. // pending_notify_fd_ is for state driven events. -void zmq::pgm_socket_t::get_sender_fds (int *send_fd_, int *receive_fd_, - int *rdata_notify_fd_, int *pending_notify_fd_) +void zmq::pgm_socket_t::get_sender_fds (fd_t *send_fd_, fd_t *receive_fd_, + fd_t *rdata_notify_fd_, fd_t *pending_notify_fd_) { socklen_t socklen; bool rc; diff --git a/src/pgm_socket.hpp b/src/pgm_socket.hpp index 9699aed6..5ba83876 100644 --- a/src/pgm_socket.hpp +++ b/src/pgm_socket.hpp @@ -36,6 +36,7 @@ #include #endif +#include "fd.hpp" #include "options.hpp" namespace zmq @@ -56,12 +57,12 @@ namespace zmq int init (bool udp_encapsulation_, const char *network_); // Get receiver fds and store them into user allocated memory. - void get_receiver_fds (int *receive_fd_, int *waiting_pipe_fd_); + void get_receiver_fds (fd_t *receive_fd_, fd_t *waiting_pipe_fd_); // Get sender and receiver fds and store it to user allocated // memory. Receive fd is used to process NAKs from peers. - void get_sender_fds (int *send_fd_, int *receive_fd_, - int *rdata_notify_fd_, int *pending_notify_fd_); + void get_sender_fds (fd_t *send_fd_, fd_t *receive_fd_, + fd_t *rdata_notify_fd_, fd_t *pending_notify_fd_); // Send data as one APDU, transmit window owned memory. size_t send (unsigned char *data_, size_t data_len_);