Skip to content

Commit b6ac886

Browse files
Second improvement of TSAN flakiness on channel tests.
The flakiness rate is higher when cleanup handlers of multiple dispatch IO are invoked at the same time on the different queues. Consequently, let's use a single serial queue to close socket for EDOSocketChannel. PiperOrigin-RevId: 326268100
1 parent 1e41b4c commit b6ac886

File tree

1 file changed

+17
-1
lines changed

1 file changed

+17
-1
lines changed

Diff for: Channel/Sources/EDOSocket.m

+17-1
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,28 @@ static void edo_RunHandlerWithErrorInQueueWithBlock(int code, dispatch_queue_t q
6767

6868
#pragma mark - EDOSocket implementation
6969

70+
@interface EDOSocket ()
71+
72+
/** The global serial queue for handling dispatch I/O's cleanup handler and closing socket. */
73+
@property(class, atomic, readonly) dispatch_queue_t closeSocketQueue;
74+
75+
@end
76+
7077
@implementation EDOSocket {
7178
dispatch_fd_t _socket;
7279
}
7380

7481
@dynamic valid;
7582

83+
+ (dispatch_queue_t)closeSocketQueue {
84+
static dispatch_queue_t closeSocketQueue;
85+
static dispatch_once_t once_token;
86+
dispatch_once(&once_token, ^{
87+
closeSocketQueue = dispatch_queue_create("com.google.edo.CloseSocket", DISPATCH_QUEUE_SERIAL);
88+
});
89+
return closeSocketQueue;
90+
}
91+
7692
+ (nullable instancetype)socketWithTCPPort:(UInt16)port
7793
queue:(dispatch_queue_t _Nullable)queue
7894
error:(NSError *_Nullable *_Nullable)error {
@@ -125,7 +141,7 @@ - (nullable dispatch_io_t)releaseAsDispatchIO {
125141
return NULL;
126142
}
127143

128-
dispatch_queue_t queue = dispatch_queue_create("com.google.edo.SocketIO", DISPATCH_QUEUE_SERIAL);
144+
dispatch_queue_t queue = [self class].closeSocketQueue;
129145
dispatch_io_t channel = dispatch_io_create(DISPATCH_IO_STREAM, socket, queue, ^(int error) {
130146
if (error) {
131147
NSLog(@"Error (%d) when closing dispatch channel.", error);

0 commit comments

Comments
 (0)