@@ -91,10 +91,10 @@ struct Descriptor {
9191static uintptr_t sock_send_data (void * desc , struct LDKu8slice data , bool resume_read ) {
9292 struct Descriptor * descriptor = (struct Descriptor * )desc ;
9393 ssize_t write_count = send (descriptor -> fd , data .data , data .datalen , MSG_NOSIGNAL );
94- bool pause_read = false;
95- if (write_count <= 0 ) {
94+ bool more_to_write = false;
95+ if (data . datalen > 0 && write_count <= 0 ) {
9696 if (errno == EAGAIN || errno == EWOULDBLOCK ) {
97- pause_read = true;
97+ more_to_write = true;
9898 write_count = 0 ;
9999 } else {
100100 shutdown (descriptor -> fd , SHUT_RDWR );
@@ -103,23 +103,30 @@ static uintptr_t sock_send_data(void* desc, struct LDKu8slice data, bool resume_
103103 return 0 ;
104104 }
105105 } else if (write_count < data .datalen ) {
106- pause_read = true;
106+ more_to_write = true;
107107 }
108- if (pause_read || resume_read ) {
109- int lockres = pthread_mutex_lock (& descriptor -> handler -> sockets_mutex );
110- assert (lockres == 0 );
111- for (int i = 0 ; i < descriptor -> handler -> sockcount ; i ++ ) {
112- if (descriptor -> handler -> pollfds [i ].fd == descriptor -> fd ) {
113- if (pause_read ) {
114- descriptor -> handler -> pollfds [i ].events = POLLOUT ;
115- } else {
116- descriptor -> handler -> pollfds [i ].events = POLLIN ;
117- }
118- break ;
108+
109+ int lockres = pthread_mutex_lock (& descriptor -> handler -> sockets_mutex );
110+ assert (lockres == 0 );
111+ bool events_changed = false;
112+ for (int i = 0 ; i < descriptor -> handler -> sockcount ; i ++ ) {
113+ if (descriptor -> handler -> pollfds [i ].fd == descriptor -> fd ) {
114+ short events_desired = 0 ;
115+ if (resume_read ) {
116+ events_desired |= POLLIN ;
117+ }
118+ if (more_to_write ) {
119+ events_desired |= POLLOUT ;
119120 }
121+ events_changed = descriptor -> handler -> pollfds [i ].events != events_desired ;
122+ descriptor -> handler -> pollfds [i ].events = events_desired ;
123+ break ;
120124 }
121- lockres = pthread_mutex_unlock (& descriptor -> handler -> sockets_mutex );
122- assert (lockres == 0 );
125+ }
126+ lockres = pthread_mutex_unlock (& descriptor -> handler -> sockets_mutex );
127+ assert (lockres == 0 );
128+
129+ if (events_changed ) {
123130 uint8_t dummy = 0 ;
124131 write (descriptor -> handler -> pipefds [1 ], & dummy , 1 );
125132 }
@@ -261,20 +268,11 @@ static void *sock_thread_fn(void* arg) {
261268 .data = readbuf ,
262269 .datalen = readlen ,
263270 };
264- LDKCResult_boolPeerHandleErrorZ res = PeerManager_read_event (& handler -> ldk_peer_manager , & descriptor , data );
265- if (res .result_ok ) {
266- if (* res .contents .result ) {
267- lockres = pthread_mutex_lock (& handler -> sockets_mutex );
268- assert (lockres == 0 );
269- assert (handler -> pollfds [i ].fd == pollfds [i ].fd ); // Only we change fd order!
270- handler -> pollfds [i ].events = POLLOUT ;
271- lockres = pthread_mutex_unlock (& handler -> sockets_mutex );
272- assert (lockres == 0 );
273- }
274- } else {
271+ LDKCResult_NonePeerHandleErrorZ res = PeerManager_read_event (& handler -> ldk_peer_manager , & descriptor , data );
272+ if (!res .result_ok ) {
275273 close_socks [close_socks_count ++ ] = i ;
276274 }
277- CResult_boolPeerHandleErrorZ_free (res );
275+ CResult_NonePeerHandleErrorZ_free (res );
278276 }
279277 }
280278 if (pollfds [i ].revents & POLLOUT ) {
0 commit comments