@@ -10,6 +10,8 @@ extern "C" {
10
10
#include " redis/util.h"
11
11
}
12
12
13
+ #include < absl/container/fixed_array.h>
14
+
13
15
#include " base/logging.h"
14
16
#include " server/engine_shard_set.h"
15
17
#include " server/server_state.h"
@@ -25,25 +27,27 @@ bool Matches(string_view pattern, string_view channel) {
25
27
26
28
// Build functor for sending messages to connection
27
29
auto BuildSender (string_view channel, facade::ArgRange messages) {
30
+ absl::FixedArray<string_view, 1 > views (messages.Size ());
28
31
size_t messages_size = accumulate (messages.begin (), messages.end (), 0 ,
29
32
[](int sum, string_view str) { return sum + str.size (); });
30
33
auto buf = shared_ptr<char []>{new char [channel.size () + messages_size]};
31
34
{
32
35
memcpy (buf.get (), channel.data (), channel.size ());
33
36
char * ptr = buf.get () + channel.size ();
37
+
38
+ size_t i = 0 ;
34
39
for (string_view message : messages) {
35
40
memcpy (ptr, message.data (), message.size ());
41
+ views[i++] = {ptr, message.size ()};
36
42
ptr += message.size ();
37
43
}
38
44
}
39
45
40
- return [channel, buf = std::move (buf), messages](facade::Connection* conn, string pattern) {
41
- size_t offset = channel.size ();
42
- for (std::string_view message : messages) {
43
- conn->SendPubMessageAsync ({std::move (pattern), buf, string_view{buf.get (), channel.size ()},
44
- string_view{buf.get () + offset, message.size ()}});
45
- offset += message.size ();
46
- }
46
+ return [channel, buf = std::move (buf), views = std::move (views)](facade::Connection* conn,
47
+ string pattern) {
48
+ string_view channel_view{buf.get (), channel.size ()};
49
+ for (std::string_view message_view : views)
50
+ conn->SendPubMessageAsync ({std::move (pattern), buf, channel_view, message_view});
47
51
};
48
52
}
49
53
0 commit comments