[util] Use magma_read_notification_channel2 for inflightlist
Skip calling if more data not available.
Change-Id: I06211d6bab321b3207f5748f79d9eb103caa86ce
Reviewed-on: https://fuchsia-review.googlesource.com/c/third_party/mesa/+/464317
Reviewed-by: John Bauman <jbauman@google.com>
diff --git a/src/util/inflight_list.c b/src/util/inflight_list.c
index bab3933..ed3d75e 100644
--- a/src/util/inflight_list.c
+++ b/src/util/inflight_list.c
@@ -61,7 +61,7 @@
}
list->wait_ = wait_notification_channel;
- list->read_ = magma_read_notification_channel;
+ list->read_ = magma_read_notification_channel2;
u_vector_init(&list->buffers_, sizeof(uint64_t), sizeof(uint64_t) * 8 /* initial byte size */);
list->size_ = 0;
return list;
@@ -188,9 +188,11 @@
void InflightList_update(struct InflightList* list, magma_connection_t connection)
{
uint64_t bytes_available = 0;
+ magma_bool_t more_data = false;
while (true) {
magma_status_t status =
- list->read_(connection, list->notification_buffer, sizeof(list->notification_buffer), &bytes_available);
+ list->read_(connection, list->notification_buffer, sizeof(list->notification_buffer),
+ &bytes_available, &more_data);
if (status != MAGMA_STATUS_OK) {
return;
}
@@ -201,5 +203,7 @@
assert(InflightList_is_inflight(list, list->notification_buffer[i]));
InflightList_remove(list, list->notification_buffer[i]);
}
+ if (!more_data)
+ return;
}
}
diff --git a/src/util/inflight_list.h b/src/util/inflight_list.h
index 980d4ac..7ac68ff 100644
--- a/src/util/inflight_list.h
+++ b/src/util/inflight_list.h
@@ -41,7 +41,8 @@
typedef magma_status_t (*read_notification_channel_t)(magma_connection_t connection, void* buffer,
uint64_t buffer_size,
- uint64_t* buffer_size_out);
+ uint64_t* buffer_size_out,
+ magma_bool_t* more_data_out);
struct InflightList {
wait_notification_channel_t wait_;
diff --git a/src/util/tests/inflight_list/test_inflight_list.cpp b/src/util/tests/inflight_list/test_inflight_list.cpp
index 66258dd..1b4ad54 100644
--- a/src/util/tests/inflight_list/test_inflight_list.cpp
+++ b/src/util/tests/inflight_list/test_inflight_list.cpp
@@ -62,7 +62,8 @@
}
static magma_status_t read_notification_channel(magma_connection_t connection, void* buffer,
- uint64_t buffer_size, uint64_t* buffer_size_out)
+ uint64_t buffer_size, uint64_t* buffer_size_out,
+ magma_bool_t* more_data_out)
{
uint32_t buffer_actual_size;
zx_status_t status = static_cast<TestConnection*>(connection)
@@ -70,6 +71,10 @@
.read(0, buffer, nullptr, buffer_size, 0, &buffer_actual_size, nullptr);
if (status == ZX_OK) {
*buffer_size_out = buffer_actual_size;
+ status = static_cast<TestConnection*>(connection)
+ ->channel[0]
+ .read(0, buffer, nullptr, 0, 0, &buffer_actual_size, nullptr);
+ *more_data_out = status == ZX_ERR_BUFFER_TOO_SMALL;
return MAGMA_STATUS_OK;
}
return MAGMA_STATUS_INTERNAL_ERROR;
@@ -173,15 +178,18 @@
std::vector<magma_system_exec_resource> resource;
resource.push_back({.buffer_id = buffer_id});
resource.push_back({.buffer_id = buffer_id + 1});
+ resource.push_back({.buffer_id = buffer_id + 2});
InflightList_AddAndUpdate(list_, &connection, resource.data(), resource.size());
EXPECT_TRUE(InflightList_is_inflight(list_, buffer_id));
EXPECT_TRUE(InflightList_is_inflight(list_, buffer_id + 1));
+ EXPECT_TRUE(InflightList_is_inflight(list_, buffer_id + 2));
EXPECT_EQ(MAGMA_STATUS_TIMED_OUT,
InflightList_WaitForBuffer(list_, &connection, buffer_id, 0 /*timeout_ns*/));
EXPECT_TRUE(InflightList_is_inflight(list_, buffer_id));
EXPECT_TRUE(InflightList_is_inflight(list_, buffer_id + 1));
+ EXPECT_TRUE(InflightList_is_inflight(list_, buffer_id + 2));
uint64_t value = buffer_id;
connection.channel[1].write(0, &value, sizeof(value), nullptr, 0);
@@ -194,15 +202,19 @@
EXPECT_FALSE(InflightList_is_inflight(list_, buffer_id));
EXPECT_TRUE(InflightList_is_inflight(list_, buffer_id + 1));
+ EXPECT_TRUE(InflightList_is_inflight(list_, buffer_id + 2));
EXPECT_EQ(MAGMA_STATUS_OK, InflightList_WaitForBuffer(list_, &connection, buffer_id, 0));
value = buffer_id + 1;
connection.channel[1].write(0, &value, sizeof(value), nullptr, 0);
+ value = buffer_id + 2;
+ connection.channel[1].write(0, &value, sizeof(value), nullptr, 0);
EXPECT_EQ(MAGMA_STATUS_OK,
InflightList_WaitForBuffer(list_, &connection, buffer_id + 1, 0 /*timeout_ns*/));
EXPECT_FALSE(InflightList_is_inflight(list_, buffer_id));
EXPECT_FALSE(InflightList_is_inflight(list_, buffer_id + 1));
+ EXPECT_FALSE(InflightList_is_inflight(list_, buffer_id + 2));
}