Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
L
libzmq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
libzmq
Commits
ac46e6da
Commit
ac46e6da
authored
Nov 01, 2015
by
Constantin Rack
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1628 from hintjens/master
Fix for #1399
parents
ab2c009d
ba1515fe
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
28 additions
and
35 deletions
+28
-35
signaler.cpp
src/signaler.cpp
+13
-18
tcp.cpp
src/tcp.cpp
+15
-17
No files found.
src/signaler.cpp
View file @
ac46e6da
...
...
@@ -100,20 +100,15 @@ static int close_wait_ms (int fd_, unsigned int max_ms_ = 2000)
unsigned
int
step_ms
=
max_ms_
/
10
;
if
(
step_ms
<
1
)
step_ms
=
1
;
if
(
step_ms
>
100
)
step_ms
=
100
;
int
rc
=
0
;
// do not sleep on first attempt
do
{
if
(
rc
==
-
1
&&
errno
==
EAGAIN
)
{
do
{
if
(
rc
==
-
1
&&
errno
==
EAGAIN
)
{
sleep_ms
(
step_ms
);
ms_so_far
+=
step_ms
;
}
rc
=
close
(
fd_
);
}
while
(
ms_so_far
<
max_ms_
&&
rc
==
-
1
&&
errno
==
EAGAIN
);
...
...
@@ -187,7 +182,7 @@ void zmq::signaler_t::send ()
errno_assert
(
sz
==
sizeof
(
inc
));
#elif defined ZMQ_HAVE_WINDOWS
unsigned
char
dummy
=
0
;
int
nbytes
=
::
send
(
w
,
(
char
*
)
&
dummy
,
sizeof
(
dummy
),
0
);
int
nbytes
=
::
send
(
w
,
(
char
*
)
&
dummy
,
sizeof
(
dummy
),
0
);
wsa_assert
(
nbytes
!=
SOCKET_ERROR
);
zmq_assert
(
nbytes
==
sizeof
(
dummy
));
#else
...
...
@@ -304,7 +299,7 @@ void zmq::signaler_t::recv ()
#else
unsigned
char
dummy
;
#if defined ZMQ_HAVE_WINDOWS
int
nbytes
=
::
recv
(
r
,
(
char
*
)
&
dummy
,
sizeof
(
dummy
),
0
);
int
nbytes
=
::
recv
(
r
,
(
char
*
)
&
dummy
,
sizeof
(
dummy
),
0
);
wsa_assert
(
nbytes
!=
SOCKET_ERROR
);
#else
ssize_t
nbytes
=
::
recv
(
r
,
&
dummy
,
sizeof
(
dummy
),
0
);
...
...
@@ -342,7 +337,7 @@ int zmq::signaler_t::recv_failable ()
#else
unsigned
char
dummy
;
#if defined ZMQ_HAVE_WINDOWS
int
nbytes
=
::
recv
(
r
,
(
char
*
)
&
dummy
,
sizeof
(
dummy
),
0
);
int
nbytes
=
::
recv
(
r
,
(
char
*
)
&
dummy
,
sizeof
(
dummy
),
0
);
if
(
nbytes
==
SOCKET_ERROR
)
{
const
int
last_error
=
WSAGetLastError
();
if
(
last_error
==
WSAEWOULDBLOCK
)
{
...
...
@@ -466,11 +461,11 @@ int zmq::signaler_t::make_fdpair (fd_t *r_, fd_t *w_)
// Set SO_REUSEADDR and TCP_NODELAY on listening socket.
BOOL
so_reuseaddr
=
1
;
int
rc
=
setsockopt
(
listener
,
SOL_SOCKET
,
SO_REUSEADDR
,
(
char
*
)
&
so_reuseaddr
,
sizeof
so_reuseaddr
);
(
char
*
)
&
so_reuseaddr
,
sizeof
so_reuseaddr
);
wsa_assert
(
rc
!=
SOCKET_ERROR
);
BOOL
tcp_nodelay
=
1
;
rc
=
setsockopt
(
listener
,
IPPROTO_TCP
,
TCP_NODELAY
,
(
char
*
)
&
tcp_nodelay
,
sizeof
tcp_nodelay
);
(
char
*
)
&
tcp_nodelay
,
sizeof
tcp_nodelay
);
wsa_assert
(
rc
!=
SOCKET_ERROR
);
// Init sockaddr to signaler port.
...
...
@@ -496,12 +491,12 @@ int zmq::signaler_t::make_fdpair (fd_t *r_, fd_t *w_)
}
// Bind listening socket to signaler port.
rc
=
bind
(
listener
,
(
const
struct
sockaddr
*
)
&
addr
,
sizeof
addr
);
rc
=
bind
(
listener
,
(
const
struct
sockaddr
*
)
&
addr
,
sizeof
addr
);
if
(
rc
!=
SOCKET_ERROR
&&
signaler_port
==
0
)
{
// Retrieve ephemeral port number
int
addrlen
=
sizeof
addr
;
rc
=
getsockname
(
listener
,
(
struct
sockaddr
*
)
&
addr
,
&
addrlen
);
rc
=
getsockname
(
listener
,
(
struct
sockaddr
*
)
&
addr
,
&
addrlen
);
}
// Listen for incoming connections.
...
...
@@ -510,7 +505,7 @@ int zmq::signaler_t::make_fdpair (fd_t *r_, fd_t *w_)
// Connect writer to the listener.
if
(
rc
!=
SOCKET_ERROR
)
rc
=
connect
(
*
w_
,
(
struct
sockaddr
*
)
&
addr
,
sizeof
addr
);
rc
=
connect
(
*
w_
,
(
struct
sockaddr
*
)
&
addr
,
sizeof
addr
);
// Accept connection from writer.
if
(
rc
!=
SOCKET_ERROR
)
...
...
@@ -582,12 +577,12 @@ int zmq::signaler_t::make_fdpair (fd_t *r_, fd_t *w_)
rc
=
setsockopt
(
listener
,
IPPROTO_TCP
,
TCP_NODELACK
,
&
on
,
sizeof
on
);
errno_assert
(
rc
!=
-
1
);
rc
=
bind
(
listener
,
(
struct
sockaddr
*
)
&
lcladdr
,
sizeof
lcladdr
);
rc
=
bind
(
listener
,
(
struct
sockaddr
*
)
&
lcladdr
,
sizeof
lcladdr
);
errno_assert
(
rc
!=
-
1
);
socklen_t
lcladdr_len
=
sizeof
lcladdr
;
rc
=
getsockname
(
listener
,
(
struct
sockaddr
*
)
&
lcladdr
,
&
lcladdr_len
);
rc
=
getsockname
(
listener
,
(
struct
sockaddr
*
)
&
lcladdr
,
&
lcladdr_len
);
errno_assert
(
rc
!=
-
1
);
rc
=
listen
(
listener
,
1
);
...
...
@@ -602,7 +597,7 @@ int zmq::signaler_t::make_fdpair (fd_t *r_, fd_t *w_)
rc
=
setsockopt
(
*
w_
,
IPPROTO_TCP
,
TCP_NODELACK
,
&
on
,
sizeof
on
);
errno_assert
(
rc
!=
-
1
);
rc
=
connect
(
*
w_
,
(
struct
sockaddr
*
)
&
lcladdr
,
sizeof
lcladdr
);
rc
=
connect
(
*
w_
,
(
struct
sockaddr
*
)
&
lcladdr
,
sizeof
lcladdr
);
errno_assert
(
rc
!=
-
1
);
*
r_
=
accept
(
listener
,
NULL
,
NULL
);
...
...
src/tcp.cpp
View file @
ac46e6da
...
...
@@ -218,7 +218,6 @@ void zmq::tune_tcp_retransmit_timeout (fd_t sockfd_, int timeout_)
&&
errno
!=
EBADF
&&
errno
!=
EDESTADDRREQ
&&
errno
!=
EFAULT
&&
errno
!=
EINVAL
&&
errno
!=
EISCONN
&&
errno
!=
EMSGSIZE
&&
errno
!=
ENOMEM
...
...
@@ -240,21 +239,21 @@ int zmq::tcp_read (fd_t s_, void *data_, size_t size_)
// If not a single byte can be read from the socket in non-blocking mode
// we'll get an error (this may happen during the speculative read).
if
(
rc
==
SOCKET_ERROR
)
{
const
int
last_error
=
WSAGetLastError
();
if
(
last_error
==
WSAEWOULDBLOCK
)
{
errno
=
EAGAIN
;
}
else
{
wsa_assert
(
last_error
==
WSAENETDOWN
||
last_error
==
WSAENETRESET
||
last_error
==
WSAECONNABORTED
||
last_error
==
WSAETIMEDOUT
||
last_error
==
WSAECONNRESET
||
last_error
==
WSAECONNREFUSED
||
last_error
==
WSAENOTCONN
);
errno
=
wsa_error_to_errno
(
last_error
);
}
if
(
rc
==
SOCKET_ERROR
)
{
const
int
last_error
=
WSAGetLastError
();
if
(
last_error
==
WSAEWOULDBLOCK
)
{
errno
=
EAGAIN
;
}
else
{
wsa_assert
(
last_error
==
WSAENETDOWN
||
last_error
==
WSAENETRESET
||
last_error
==
WSAECONNABORTED
||
last_error
==
WSAETIMEDOUT
||
last_error
==
WSAECONNRESET
||
last_error
==
WSAECONNREFUSED
||
last_error
==
WSAENOTCONN
);
errno
=
wsa_error_to_errno
(
last_error
);
}
}
return
rc
==
SOCKET_ERROR
?
-
1
:
rc
;
...
...
@@ -269,7 +268,6 @@ int zmq::tcp_read (fd_t s_, void *data_, size_t size_)
if
(
rc
==
-
1
)
{
errno_assert
(
errno
!=
EBADF
&&
errno
!=
EFAULT
&&
errno
!=
EINVAL
&&
errno
!=
ENOMEM
&&
errno
!=
ENOTSOCK
);
if
(
errno
==
EWOULDBLOCK
||
errno
==
EINTR
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment