Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
A
actor-incubator
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
cpp-libs
actor-incubator
Commits
4b373edb
Unverified
Commit
4b373edb
authored
Jan 27, 2020
by
Dominik Charousset
Committed by
GitHub
Jan 27, 2020
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #60
Refactor write events
parents
cf2eb1e4
d89f0c67
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
73 additions
and
72 deletions
+73
-72
libcaf_net/caf/net/datagram_transport.hpp
libcaf_net/caf/net/datagram_transport.hpp
+16
-16
libcaf_net/caf/net/stream_transport.hpp
libcaf_net/caf/net/stream_transport.hpp
+57
-56
No files found.
libcaf_net/caf/net/datagram_transport.hpp
View file @
4b373edb
...
@@ -103,17 +103,20 @@ public:
...
@@ -103,17 +103,20 @@ public:
}
}
bool
handle_write_event
(
endpoint_manager
&
manager
)
override
{
bool
handle_write_event
(
endpoint_manager
&
manager
)
override
{
CAF_LOG_TRACE
(
CAF_ARG
(
this
->
handle_
.
id
)
CAF_LOG_TRACE
(
CAF_ARG
2
(
"handle"
,
this
->
handle_
.
id
)
<<
CAF_ARG2
(
"queue-size"
,
packet_queue_
.
size
()));
<<
CAF_ARG2
(
"queue-size"
,
packet_queue_
.
size
()));
// Try to write leftover data.
auto
fetch_next_message
=
[
&
]
{
write_some
();
if
(
auto
msg
=
manager
.
next_message
())
{
// Get new data from parent.
this
->
next_layer_
.
write_message
(
*
this
,
std
::
move
(
msg
));
for
(
auto
msg
=
manager
.
next_message
();
msg
!=
nullptr
;
return
true
;
msg
=
manager
.
next_message
())
{
}
this
->
next_layer_
.
write_message
(
*
this
,
std
::
move
(
msg
));
return
false
;
}
};
// Write prepared data.
do
{
return
write_some
();
if
(
auto
err
=
write_some
())
return
err
==
sec
::
unavailable_or_would_block
;
}
while
(
fetch_next_message
());
return
!
packet_queue_
.
empty
();
}
}
// TODO: remove this function. `resolve` should add workers when needed.
// TODO: remove this function. `resolve` should add workers when needed.
...
@@ -163,8 +166,7 @@ private:
...
@@ -163,8 +166,7 @@ private:
this
->
read_buf_
.
resize
(
max_datagram_size
);
this
->
read_buf_
.
resize
(
max_datagram_size
);
}
}
bool
write_some
()
{
error
write_some
()
{
CAF_LOG_TRACE
(
CAF_ARG2
(
"handle"
,
this
->
handle_
.
id
));
// Helper function to sort empty buffers back into the right caches.
// Helper function to sort empty buffers back into the right caches.
auto
recycle
=
[
&
]()
{
auto
recycle
=
[
&
]()
{
auto
&
front
=
packet_queue_
.
front
();
auto
&
front
=
packet_queue_
.
front
();
...
@@ -197,13 +199,11 @@ private:
...
@@ -197,13 +199,11 @@ private:
if
(
err
!=
sec
::
unavailable_or_would_block
)
{
if
(
err
!=
sec
::
unavailable_or_would_block
)
{
CAF_LOG_ERROR
(
"write failed"
<<
CAF_ARG
(
err
));
CAF_LOG_ERROR
(
"write failed"
<<
CAF_ARG
(
err
));
this
->
next_layer_
.
handle_error
(
err
);
this
->
next_layer_
.
handle_error
(
err
);
return
false
;
}
}
CAF_LOG_DEBUG
(
"write returned `unavailable_or_would_block`"
);
return
err
;
return
true
;
}
}
}
}
return
fals
e
;
return
non
e
;
}
}
std
::
deque
<
packet
>
packet_queue_
;
std
::
deque
<
packet
>
packet_queue_
;
...
...
libcaf_net/caf/net/stream_transport.hpp
View file @
4b373edb
...
@@ -107,18 +107,63 @@ public:
...
@@ -107,18 +107,63 @@ public:
return
true
;
return
true
;
}
}
bool
handle_write_event
(
endpoint_manager
&
parent
)
override
{
bool
handle_write_event
(
endpoint_manager
&
manager
)
override
{
CAF_LOG_TRACE
(
CAF_ARG2
(
"handle"
,
this
->
handle
().
id
));
CAF_LOG_TRACE
(
CAF_ARG2
(
"handle"
,
this
->
handle_
.
id
)
// Try to write leftover data.
<<
CAF_ARG2
(
"queue-size"
,
write_queue_
.
size
()));
write_some
();
auto
drain_write_queue
=
[]()
->
error_code
<
sec
>
{
// Get new data from parent.
// Helper function to sort empty buffers back into the right caches.
// TODO: dont read all messages at once - get one by one.
auto
recycle
=
[
&
]()
{
for
(
auto
msg
=
parent
.
next_message
();
msg
!=
nullptr
;
auto
&
front
=
this
->
write_queue_
.
front
();
msg
=
parent
.
next_message
())
{
auto
&
is_header
=
front
.
first
;
this
->
next_layer_
.
write_message
(
*
this
,
std
::
move
(
msg
));
auto
&
buf
=
front
.
second
;
}
written_
=
0
;
// Write prepared data.
buf
.
clear
();
return
write_some
();
if
(
is_header
)
{
if
(
this
->
header_bufs_
.
size
()
<
this
->
header_bufs_
.
capacity
())
this
->
header_bufs_
.
emplace_back
(
std
::
move
(
buf
));
}
else
if
(
this
->
payload_bufs_
.
size
()
<
this
->
payload_bufs_
.
capacity
())
{
this
->
payload_bufs_
.
emplace_back
(
std
::
move
(
buf
));
}
write_queue_
.
pop_front
();
};
// Write buffers from the write_queue_ for as long as possible.
while
(
!
write_queue_
.
empty
())
{
auto
&
buf
=
write_queue_
.
front
().
second
;
CAF_ASSERT
(
!
buf
.
empty
());
auto
data
=
buf
.
data
()
+
written_
;
auto
len
=
buf
.
size
()
-
written_
;
auto
write_ret
=
write
(
this
->
handle
(),
make_span
(
data
,
len
));
if
(
auto
num_bytes
=
get_if
<
size_t
>
(
&
write_ret
))
{
CAF_LOG_DEBUG
(
CAF_ARG
(
this
->
handle_
.
id
)
<<
CAF_ARG
(
*
num_bytes
));
written_
+=
*
num_bytes
;
if
(
written_
>=
buf
.
size
())
{
recycle
();
written_
=
0
;
}
}
else
{
auto
err
=
get
<
sec
>
(
write_ret
);
if
(
err
!=
sec
::
unavailable_or_would_block
)
{
CAF_LOG_DEBUG
(
"send failed"
<<
CAF_ARG
(
err
));
this
->
next_layer_
.
handle_error
(
err
);
}
return
err
;
}
}
return
none
;
};
auto
fetch_next_message
=
[
&
]
{
if
(
auto
msg
=
manager
.
next_message
())
{
this
->
next_layer_
.
write_message
(
*
this
,
std
::
move
(
msg
));
return
true
;
}
return
false
;
};
do
{
if
(
auto
err
=
drain_write_queue
())
return
err
==
sec
::
unavailable_or_would_block
;
}
while
(
fetch_next_message
());
CAF_ASSERT
(
write_queue_
.
empty
());
return
false
;
}
}
void
write_packet
(
id_type
,
span
<
buffer_type
*>
buffers
)
override
{
void
write_packet
(
id_type
,
span
<
buffer_type
*>
buffers
)
override
{
...
@@ -167,50 +212,6 @@ private:
...
@@ -167,50 +212,6 @@ private:
}
}
}
}
bool
write_some
()
{
CAF_LOG_TRACE
(
CAF_ARG2
(
"handle"
,
this
->
handle_
.
id
));
// Helper function to sort empty buffers back into the right caches.
auto
recycle
=
[
&
]()
{
auto
&
front
=
this
->
write_queue_
.
front
();
auto
&
is_header
=
front
.
first
;
auto
&
buf
=
front
.
second
;
written_
=
0
;
buf
.
clear
();
if
(
is_header
)
{
if
(
this
->
header_bufs_
.
size
()
<
this
->
header_bufs_
.
capacity
())
this
->
header_bufs_
.
emplace_back
(
std
::
move
(
buf
));
}
else
if
(
this
->
payload_bufs_
.
size
()
<
this
->
payload_bufs_
.
capacity
())
{
this
->
payload_bufs_
.
emplace_back
(
std
::
move
(
buf
));
}
write_queue_
.
pop_front
();
};
// Write buffers from the write_queue_ for as long as possible.
while
(
!
write_queue_
.
empty
())
{
auto
&
buf
=
write_queue_
.
front
().
second
;
CAF_ASSERT
(
!
buf
.
empty
());
auto
data
=
buf
.
data
()
+
written_
;
auto
len
=
buf
.
size
()
-
written_
;
auto
write_ret
=
write
(
this
->
handle
(),
make_span
(
data
,
len
));
if
(
auto
num_bytes
=
get_if
<
size_t
>
(
&
write_ret
))
{
CAF_LOG_DEBUG
(
CAF_ARG
(
this
->
handle_
.
id
)
<<
CAF_ARG
(
*
num_bytes
));
written_
+=
*
num_bytes
;
if
(
written_
>=
buf
.
size
())
{
recycle
();
written_
=
0
;
}
}
else
{
auto
err
=
get
<
sec
>
(
write_ret
);
if
(
err
!=
sec
::
unavailable_or_would_block
)
{
CAF_LOG_DEBUG
(
"send failed"
<<
CAF_ARG
(
err
));
this
->
next_layer_
.
handle_error
(
err
);
return
false
;
}
return
true
;
}
}
return
false
;
}
write_queue_type
write_queue_
;
write_queue_type
write_queue_
;
size_t
written_
;
size_t
written_
;
size_t
read_threshold_
;
size_t
read_threshold_
;
...
...
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