net: speed up select fdwatch lookups
This commit is contained in:
@@ -308,6 +308,46 @@ void TestFdwatchBackendMetadata()
|
||||
|
||||
fdwatch_delete(fdw);
|
||||
}
|
||||
|
||||
void TestFdwatchSlotReuseAfterDelete()
|
||||
{
|
||||
int sockets_a[2] = { -1, -1 };
|
||||
int sockets_b[2] = { -1, -1 };
|
||||
Expect(socketpair(AF_UNIX, SOCK_STREAM, 0, sockets_a) == 0, "socketpair A failed");
|
||||
Expect(socketpair(AF_UNIX, SOCK_STREAM, 0, sockets_b) == 0, "socketpair B failed");
|
||||
|
||||
LPFDWATCH fdw = fdwatch_new(64);
|
||||
Expect(fdw != nullptr, "fdwatch_new for slot reuse failed");
|
||||
|
||||
int marker_a = 11;
|
||||
int marker_b = 22;
|
||||
|
||||
fdwatch_add_fd(fdw, sockets_a[1], &marker_a, FDW_READ, false);
|
||||
fdwatch_add_fd(fdw, sockets_b[1], &marker_b, FDW_READ, false);
|
||||
fdwatch_del_fd(fdw, sockets_a[1]);
|
||||
|
||||
const uint8_t byte = 0x51;
|
||||
Expect(write(sockets_b[0], &byte, sizeof(byte)) == sizeof(byte), "socketpair B write failed");
|
||||
|
||||
timeval timeout {};
|
||||
timeout.tv_sec = 0;
|
||||
timeout.tv_usec = 200000;
|
||||
|
||||
const int num_events = fdwatch(fdw, &timeout);
|
||||
Expect(num_events == 1, "Expected one read event after slot reuse");
|
||||
Expect(fdwatch_get_client_data(fdw, 0) == &marker_b, "Unexpected client data after slot reuse");
|
||||
Expect(fdwatch_check_event(fdw, sockets_b[1], 0) == FDW_READ, "Expected FDW_READ after slot reuse");
|
||||
|
||||
uint8_t read_back = 0;
|
||||
Expect(read(sockets_b[1], &read_back, sizeof(read_back)) == sizeof(read_back), "socketpair B read failed");
|
||||
Expect(read_back == byte, "Read payload mismatch after slot reuse");
|
||||
|
||||
fdwatch_delete(fdw);
|
||||
close(sockets_a[0]);
|
||||
close(sockets_a[1]);
|
||||
close(sockets_b[0]);
|
||||
close(sockets_b[1]);
|
||||
}
|
||||
}
|
||||
|
||||
int main()
|
||||
@@ -319,6 +359,7 @@ int main()
|
||||
TestSocketAuthWireFlow();
|
||||
TestFdwatchBackendMetadata();
|
||||
TestFdwatchReadAndOneshotWrite();
|
||||
TestFdwatchSlotReuseAfterDelete();
|
||||
std::cout << "metin smoke tests passed\n";
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user