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
93bdb792
Commit
93bdb792
authored
Mar 20, 2010
by
Martin Sustrik
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
PUB socket was blocking occassionally - fixed
parent
cbaf1097
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
47 additions
and
54 deletions
+47
-54
pub.cpp
src/pub.cpp
+38
-46
pub.hpp
src/pub.hpp
+9
-8
No files found.
src/pub.cpp
View file @
93bdb792
...
@@ -26,7 +26,7 @@
...
@@ -26,7 +26,7 @@
zmq
::
pub_t
::
pub_t
(
class
app_thread_t
*
parent_
)
:
zmq
::
pub_t
::
pub_t
(
class
app_thread_t
*
parent_
)
:
socket_base_t
(
parent_
),
socket_base_t
(
parent_
),
stalled_pipe
(
NULL
)
active
(
0
)
{
{
options
.
requires_in
=
false
;
options
.
requires_in
=
false
;
options
.
requires_out
=
true
;
options
.
requires_out
=
true
;
...
@@ -34,16 +34,18 @@ zmq::pub_t::pub_t (class app_thread_t *parent_) :
...
@@ -34,16 +34,18 @@ zmq::pub_t::pub_t (class app_thread_t *parent_) :
zmq
::
pub_t
::~
pub_t
()
zmq
::
pub_t
::~
pub_t
()
{
{
for
(
out_pipes_t
::
size_type
i
=
0
;
i
!=
out_
pipes
.
size
();
i
++
)
for
(
pipes_t
::
size_type
i
=
0
;
i
!=
pipes
.
size
();
i
++
)
out_
pipes
[
i
]
->
term
();
pipes
[
i
]
->
term
();
out_
pipes
.
clear
();
pipes
.
clear
();
}
}
void
zmq
::
pub_t
::
xattach_pipes
(
class
reader_t
*
inpipe_
,
void
zmq
::
pub_t
::
xattach_pipes
(
class
reader_t
*
inpipe_
,
class
writer_t
*
outpipe_
,
const
blob_t
&
peer_identity_
)
class
writer_t
*
outpipe_
,
const
blob_t
&
peer_identity_
)
{
{
zmq_assert
(
!
inpipe_
);
zmq_assert
(
!
inpipe_
);
out_pipes
.
push_back
(
outpipe_
);
pipes
.
push_back
(
outpipe_
);
pipes
.
swap
(
active
,
pipes
.
size
()
-
1
);
active
++
;
}
}
void
zmq
::
pub_t
::
xdetach_inpipe
(
class
reader_t
*
pipe_
)
void
zmq
::
pub_t
::
xdetach_inpipe
(
class
reader_t
*
pipe_
)
...
@@ -53,9 +55,11 @@ void zmq::pub_t::xdetach_inpipe (class reader_t *pipe_)
...
@@ -53,9 +55,11 @@ void zmq::pub_t::xdetach_inpipe (class reader_t *pipe_)
void
zmq
::
pub_t
::
xdetach_outpipe
(
class
writer_t
*
pipe_
)
void
zmq
::
pub_t
::
xdetach_outpipe
(
class
writer_t
*
pipe_
)
{
{
out_pipes
.
erase
(
pipe_
);
// Remove the pipe from the list; adjust number of active pipes
if
(
pipe_
==
stalled_pipe
)
// accordingly.
stalled_pipe
=
NULL
;
if
(
pipes
.
index
(
pipe_
)
<
active
)
active
--
;
pipes
.
erase
(
pipe_
);
}
}
void
zmq
::
pub_t
::
xkill
(
class
reader_t
*
pipe_
)
void
zmq
::
pub_t
::
xkill
(
class
reader_t
*
pipe_
)
...
@@ -70,8 +74,9 @@ void zmq::pub_t::xrevive (class reader_t *pipe_)
...
@@ -70,8 +74,9 @@ void zmq::pub_t::xrevive (class reader_t *pipe_)
void
zmq
::
pub_t
::
xrevive
(
class
writer_t
*
pipe_
)
void
zmq
::
pub_t
::
xrevive
(
class
writer_t
*
pipe_
)
{
{
zmq_assert
(
stalled_pipe
=
pipe_
);
// Move the pipe to the list of active pipes.
stalled_pipe
=
NULL
;
pipes
.
swap
(
pipes
.
index
(
pipe_
),
active
);
active
++
;
}
}
int
zmq
::
pub_t
::
xsetsockopt
(
int
option_
,
const
void
*
optval_
,
int
zmq
::
pub_t
::
xsetsockopt
(
int
option_
,
const
void
*
optval_
,
...
@@ -83,10 +88,8 @@ int zmq::pub_t::xsetsockopt (int option_, const void *optval_,
...
@@ -83,10 +88,8 @@ int zmq::pub_t::xsetsockopt (int option_, const void *optval_,
int
zmq
::
pub_t
::
xsend
(
zmq_msg_t
*
msg_
,
int
flags_
)
int
zmq
::
pub_t
::
xsend
(
zmq_msg_t
*
msg_
,
int
flags_
)
{
{
out_pipes_t
::
size_type
pipes_count
=
out_pipes
.
size
();
// If there are no active pipes available, simply drop the message.
if
(
active
==
0
)
{
// If there are no pipes available, simply drop the message.
if
(
pipes_count
==
0
)
{
int
rc
=
zmq_msg_close
(
msg_
);
int
rc
=
zmq_msg_close
(
msg_
);
zmq_assert
(
rc
==
0
);
zmq_assert
(
rc
==
0
);
rc
=
zmq_msg_init
(
msg_
);
rc
=
zmq_msg_init
(
msg_
);
...
@@ -94,21 +97,13 @@ int zmq::pub_t::xsend (zmq_msg_t *msg_, int flags_)
...
@@ -94,21 +97,13 @@ int zmq::pub_t::xsend (zmq_msg_t *msg_, int flags_)
return
0
;
return
0
;
}
}
// First check whether all pipes are available for writing.
if
(
!
check_write
())
{
errno
=
EAGAIN
;
return
-
1
;
}
msg_content_t
*
content
=
(
msg_content_t
*
)
msg_
->
content
;
msg_content_t
*
content
=
(
msg_content_t
*
)
msg_
->
content
;
// For VSMs the copying is straighforward.
// For VSMs the copying is straighforward.
if
(
content
==
(
msg_content_t
*
)
ZMQ_VSM
)
{
if
(
content
==
(
msg_content_t
*
)
ZMQ_VSM
)
{
for
(
out_pipes_t
::
size_type
i
=
0
;
i
!=
pipes_count
;
i
++
)
{
for
(
pipes_t
::
size_type
i
=
0
;
i
!=
active
;)
bool
written
=
out_pipes
[
i
]
->
write
(
msg_
);
if
(
write
(
pipes
[
i
],
msg_
))
zmq_assert
(
written
);
i
++
;
out_pipes
[
i
]
->
flush
();
}
int
rc
=
zmq_msg_init
(
msg_
);
int
rc
=
zmq_msg_init
(
msg_
);
zmq_assert
(
rc
==
0
);
zmq_assert
(
rc
==
0
);
return
0
;
return
0
;
...
@@ -117,10 +112,11 @@ int zmq::pub_t::xsend (zmq_msg_t *msg_, int flags_)
...
@@ -117,10 +112,11 @@ int zmq::pub_t::xsend (zmq_msg_t *msg_, int flags_)
// Optimisation for the case when there's only a single pipe
// Optimisation for the case when there's only a single pipe
// to send the message to - no refcount adjustment i.e. no atomic
// to send the message to - no refcount adjustment i.e. no atomic
// operations are needed.
// operations are needed.
if
(
pipes_count
==
1
)
{
if
(
active
==
1
)
{
bool
written
=
out_pipes
[
0
]
->
write
(
msg_
);
if
(
!
write
(
pipes
[
0
],
msg_
))
{
zmq_assert
(
written
);
int
rc
=
zmq_msg_close
(
msg_
);
out_pipes
[
0
]
->
flush
();
zmq_assert
(
rc
==
0
);
}
int
rc
=
zmq_msg_init
(
msg_
);
int
rc
=
zmq_msg_init
(
msg_
);
zmq_assert
(
rc
==
0
);
zmq_assert
(
rc
==
0
);
return
0
;
return
0
;
...
@@ -130,17 +126,18 @@ int zmq::pub_t::xsend (zmq_msg_t *msg_, int flags_)
...
@@ -130,17 +126,18 @@ int zmq::pub_t::xsend (zmq_msg_t *msg_, int flags_)
// to deal with reference counting. First add N-1 references to
// to deal with reference counting. First add N-1 references to
// the content (we are holding one reference anyway, that's why -1).
// the content (we are holding one reference anyway, that's why -1).
if
(
msg_
->
flags
&
ZMQ_MSG_SHARED
)
if
(
msg_
->
flags
&
ZMQ_MSG_SHARED
)
content
->
refcnt
.
add
(
pipes_count
-
1
);
content
->
refcnt
.
add
(
active
-
1
);
else
{
else
{
content
->
refcnt
.
set
(
pipes_count
);
content
->
refcnt
.
set
(
active
);
msg_
->
flags
|=
ZMQ_MSG_SHARED
;
msg_
->
flags
|=
ZMQ_MSG_SHARED
;
}
}
// Push the message to all destinations.
// Push the message to all destinations.
for
(
out_pipes_t
::
size_type
i
=
0
;
i
!=
pipes_count
;
i
++
)
{
for
(
pipes_t
::
size_type
i
=
0
;
i
!=
active
;)
{
bool
written
=
out_pipes
[
i
]
->
write
(
msg_
);
if
(
!
write
(
pipes
[
i
],
msg_
))
zmq_assert
(
written
);
content
->
refcnt
.
sub
(
1
);
out_pipes
[
i
]
->
flush
();
else
i
++
;
}
}
// Detach the original message from the data buffer.
// Detach the original message from the data buffer.
...
@@ -163,22 +160,17 @@ bool zmq::pub_t::xhas_in ()
...
@@ -163,22 +160,17 @@ bool zmq::pub_t::xhas_in ()
bool
zmq
::
pub_t
::
xhas_out
()
bool
zmq
::
pub_t
::
xhas_out
()
{
{
return
check_write
()
;
return
true
;
}
}
bool
zmq
::
pub_t
::
check_write
(
)
bool
zmq
::
pub_t
::
write
(
class
writer_t
*
pipe_
,
zmq_msg_t
*
msg_
)
{
{
if
(
stalled_pipe
!=
NULL
)
if
(
!
pipe_
->
write
(
msg_
))
{
active
--
;
pipes
.
swap
(
pipes
.
index
(
pipe_
),
active
);
return
false
;
return
false
;
out_pipes_t
::
size_type
pipes_num
=
out_pipes
.
size
();
for
(
out_pipes_t
::
size_type
i
=
0
;
i
<
pipes_num
;
i
++
)
{
if
(
!
out_pipes
[
i
]
->
check_write
())
{
stalled_pipe
=
out_pipes
[
i
];
return
false
;
}
}
}
pipe_
->
flush
();
return
true
;
return
true
;
}
}
src/pub.hpp
View file @
93bdb792
...
@@ -49,16 +49,17 @@ namespace zmq
...
@@ -49,16 +49,17 @@ namespace zmq
private
:
private
:
//
Outbound pipes, i.e. those the socket is sending messages to.
//
Write the message to the pipe. Make the pipe inactive if writing
typedef
yarray_t
<
class
writer_t
>
out_pipes_t
;
// fails. In such a case false is returned.
out_pipes_t
out_pipes
;
bool
write
(
class
writer_t
*
pipe_
,
zmq_msg_t
*
msg_
)
;
//
Pointer to the pipe we are waiting for to became writable
//
Outbound pipes, i.e. those the socket is sending messages to.
// again; NULL if tha last send operation was successful.
typedef
yarray_t
<
class
writer_t
>
pipes_t
;
class
writer_t
*
stalled_pipe
;
pipes_t
pipes
;
// Check whether we can write a message to all pipes.
// Number of active pipes. All the active pipes are located at the
bool
check_write
();
// beginning of the pipes array.
pipes_t
::
size_type
active
;
pub_t
(
const
pub_t
&
);
pub_t
(
const
pub_t
&
);
void
operator
=
(
const
pub_t
&
);
void
operator
=
(
const
pub_t
&
);
...
...
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