Skip to content

Commit 3ab471d

Browse files
committed
refactor(container): use span instead of data+size in async_byte_queue
1 parent eb6d7d7 commit 3ab471d

File tree

5 files changed

+34
-37
lines changed

5 files changed

+34
-37
lines changed

src/quick-lint-js/container/async-byte-queue.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <cstring>
88
#include <quick-lint-js/container/async-byte-queue.h>
99
#include <quick-lint-js/port/memory-resource.h>
10+
#include <quick-lint-js/port/span.h>
1011
#include <quick-lint-js/port/thread.h>
1112
#include <quick-lint-js/util/narrow-cast.h>
1213
#include <quick-lint-js/util/pointer.h>
@@ -52,8 +53,9 @@ void async_byte_queue::commit() {
5253
string8 async_byte_queue::take_committed_string8() {
5354
string8 result;
5455
this->take_committed(
55-
[&result](const std::byte* data, std::size_t size) -> void {
56-
result.append(reinterpret_cast<const char8*>(data), size);
56+
[&result](span<const std::byte> data) -> void {
57+
result.append(reinterpret_cast<const char8*>(data.data()),
58+
narrow_cast<std::size_t>(data.size()));
5759
},
5860
[]() {});
5961
return result;

src/quick-lint-js/container/async-byte-queue.h

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
#include <quick-lint-js/port/char8.h>
1010
#include <quick-lint-js/port/max-align.h>
1111
#include <quick-lint-js/port/memory-resource.h>
12+
#include <quick-lint-js/port/span.h>
1213
#include <quick-lint-js/port/thread.h>
14+
#include <quick-lint-js/util/narrow-cast.h>
1315
#include <utility>
1416

1517
namespace quick_lint_js {
@@ -148,9 +150,9 @@ void async_byte_queue::take_committed(ChunkFunc&& chunk_callback,
148150
chunk* last_chunk;
149151
{
150152
std::unique_lock<mutex> lock(this->mutex_);
151-
auto call_chunk_callback = [&](const std::byte* data, size_type size) {
153+
auto call_chunk_callback = [&](span<const std::byte> data) {
152154
lock.unlock();
153-
chunk_callback(data, size);
155+
chunk_callback(data);
154156
lock.lock();
155157
};
156158

@@ -161,8 +163,9 @@ void async_byte_queue::take_committed(ChunkFunc&& chunk_callback,
161163
// NOTE[committed_index-data_size].
162164
while (c->next) {
163165
size_type old_data_size = c->data_size;
164-
call_chunk_callback(&c->capacity_begin()[c->begin_index],
165-
c->data_size - c->begin_index);
166+
call_chunk_callback(span<const std::byte>(
167+
&c->capacity_begin()[c->begin_index],
168+
narrow_cast<span_size>(c->data_size - c->begin_index)));
166169

167170
// These shouldn't be changed by the callback or by the writer thread.
168171
QLJS_ASSERT(c->data_size == old_data_size);
@@ -172,8 +175,9 @@ void async_byte_queue::take_committed(ChunkFunc&& chunk_callback,
172175
}
173176

174177
size_type old_committed_index = c->committed_index;
175-
call_chunk_callback(&c->capacity_begin()[c->begin_index],
176-
old_committed_index - c->begin_index);
178+
call_chunk_callback(span<const std::byte>(
179+
&c->capacity_begin()[c->begin_index],
180+
narrow_cast<span_size>(old_committed_index - c->begin_index)));
177181
c->begin_index = old_committed_index;
178182
// NOTE(strager): Because call_chunk_callback unlocks the mutex,
179183
// c->committed_index and c->next might change.

src/quick-lint-js/debug/debug-server.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,16 @@ class trace_flusher_websocket_backend final : public trace_flusher_backend {
7070
}
7171

7272
queue.take_committed(
73-
[&](const std::byte *data, std::size_t size) {
73+
[&](span<const std::byte> data) {
7474
// FIXME(strager): ::mg_send fails if size is 0. We shouldn't need
7575
// this size check, but async_byte_queue gives us empty chunks for
7676
// some reason. We should make async_byte_queue not give us empty
7777
// chunks.
78-
if (size > 0) {
79-
int ok = ::mg_send(this->connection_, data, size);
78+
if (!data.empty()) {
79+
int ok = ::mg_send(this->connection_, data.data(),
80+
narrow_cast<std::size_t>(data.size()));
8081
QLJS_ASSERT(ok);
81-
total_message_size += size;
82+
total_message_size += narrow_cast<std::size_t>(data.size());
8283
}
8384
},
8485
[] {});

src/quick-lint-js/logging/trace-flusher.cpp

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -217,11 +217,9 @@ void trace_flusher::flush_one_thread_sync(std::unique_lock<mutex>&,
217217
registered_thread& t) {
218218
// TODO(strager): Use writev if supported.
219219
t.stream_queue.take_committed(
220-
[&](const std::byte* data, std::size_t size) {
220+
[&](span<const std::byte> data) {
221221
for (trace_flusher_backend* backend : this->backends_) {
222-
backend->trace_thread_write_data(
223-
t.thread_index,
224-
span<const std::byte>(data, narrow_cast<span_size>(size)));
222+
backend->trace_thread_write_data(t.thread_index, data);
225223
}
226224
},
227225
[] {});
@@ -257,10 +255,8 @@ void trace_flusher::write_thread_header_to_backend(
257255
});
258256
temp_queue.commit();
259257
temp_queue.take_committed(
260-
[&](const std::byte* data, std::size_t size) {
261-
backend->trace_thread_write_data(
262-
t.thread_index,
263-
span<const std::byte>(data, narrow_cast<span_size>(size)));
258+
[&](span<const std::byte> data) {
259+
backend->trace_thread_write_data(t.thread_index, data);
264260
},
265261
[] {});
266262
}

test/test-async-byte-queue.cpp

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -213,30 +213,24 @@ TEST(test_async_byte_queue,
213213
std::fill_n(chunk_2, q.default_chunk_size, u8'c');
214214
q.commit();
215215

216-
struct chunk {
217-
const std::byte* data;
218-
async_byte_queue::size_type size;
219-
};
220-
std::vector<chunk> chunks;
216+
std::vector<span<const std::byte>> chunks;
221217
bool finalize_called = false;
222218
q.take_committed(
223-
[&](const std::byte* data, async_byte_queue::size_type size) {
224-
chunks.push_back(chunk{.data = data, .size = size});
225-
},
219+
[&](span<const std::byte> data) { chunks.push_back(data); },
226220
[&]() {
227221
ASSERT_EQ(chunks.size(), 3);
228222

229-
EXPECT_EQ(chunks[0].size, q.default_chunk_size);
230-
EXPECT_EQ(chunks[0].data, reinterpret_cast<std::byte*>(chunk_0));
231-
EXPECT_EQ(static_cast<char8>(chunks[0].data[0]), u8'a');
223+
EXPECT_EQ(chunks[0].size(), q.default_chunk_size);
224+
EXPECT_EQ(chunks[0].data(), reinterpret_cast<std::byte*>(chunk_0));
225+
EXPECT_EQ(static_cast<char8>(chunks[0][0]), u8'a');
232226

233-
EXPECT_EQ(chunks[1].size, q.default_chunk_size);
234-
EXPECT_EQ(chunks[1].data, reinterpret_cast<std::byte*>(chunk_1));
235-
EXPECT_EQ(static_cast<char8>(chunks[1].data[0]), u8'b');
227+
EXPECT_EQ(chunks[1].size(), q.default_chunk_size);
228+
EXPECT_EQ(chunks[1].data(), reinterpret_cast<std::byte*>(chunk_1));
229+
EXPECT_EQ(static_cast<char8>(chunks[1][0]), u8'b');
236230

237-
EXPECT_EQ(chunks[2].size, q.default_chunk_size / 4);
238-
EXPECT_EQ(chunks[2].data, reinterpret_cast<std::byte*>(chunk_2));
239-
EXPECT_EQ(static_cast<char8>(chunks[2].data[0]), u8'c');
231+
EXPECT_EQ(chunks[2].size(), q.default_chunk_size / 4);
232+
EXPECT_EQ(chunks[2].data(), reinterpret_cast<std::byte*>(chunk_2));
233+
EXPECT_EQ(static_cast<char8>(chunks[2][0]), u8'c');
240234

241235
finalize_called = true;
242236
});

0 commit comments

Comments
 (0)