@@ -118,6 +118,30 @@ init_cpu ()
118
118
119
119
#endif /* USE_DYNSIMD */
120
120
121
+ /*
122
+ * The following read/write wrappers handle the case of interruption
123
+ * by system signals:
124
+ */
125
+ static int
126
+ read_retry (int fd , void * dst , int size )
127
+ {
128
+ int error ;
129
+ do {
130
+ error = read (fd , dst , size );
131
+ } while (error == -1 && errno == EINTR );
132
+ return (error );
133
+ }
134
+
135
+ static int
136
+ write_retry (int fd , const void * src , int size )
137
+ {
138
+ int error ;
139
+ do {
140
+ error = write (fd , src , size );
141
+ } while (error == -1 && errno == EINTR );
142
+ return (error );
143
+ }
144
+
121
145
const char *
122
146
jack_get_tmpdir ()
123
147
{
@@ -251,15 +275,15 @@ oop_client_deliver_request (void *ptr, jack_request_t *req)
251
275
int wok , rok ;
252
276
jack_client_t * client = (jack_client_t * )ptr ;
253
277
254
- wok = (write (client -> request_fd , req , sizeof (* req ))
278
+ wok = (write_retry (client -> request_fd , req , sizeof (* req ))
255
279
== sizeof (* req ));
256
280
257
281
/* if necessary, add variable length key data after a PropertyChange request
258
282
*/
259
283
260
284
if (req -> type == PropertyChangeNotify ) {
261
285
if (req -> x .property .keylen ) {
262
- if (write (client -> request_fd , req -> x .property .key , req -> x .property .keylen ) != req -> x .property .keylen ) {
286
+ if (write_retry (client -> request_fd , req -> x .property .key , req -> x .property .keylen ) != req -> x .property .keylen ) {
263
287
jack_error ("cannot send property key of length %d to server" ,
264
288
req -> x .property .keylen );
265
289
req -> status = -1 ;
@@ -268,7 +292,7 @@ oop_client_deliver_request (void *ptr, jack_request_t *req)
268
292
}
269
293
}
270
294
271
- rok = (read (client -> request_fd , req , sizeof (* req ))
295
+ rok = (read_retry (client -> request_fd , req , sizeof (* req ))
272
296
== sizeof (* req ));
273
297
274
298
if (wok && rok ) { /* everything OK? */
@@ -837,14 +861,14 @@ server_event_connect (jack_client_t *client, const char *server_name)
837
861
838
862
jack_uuid_copy (& req .client_id , client -> control -> uuid );
839
863
840
- if (write (fd , & req , sizeof (req )) != sizeof (req )) {
864
+ if (write_retry (fd , & req , sizeof (req )) != sizeof (req )) {
841
865
jack_error ("cannot write event connect request to server (%s)" ,
842
866
strerror (errno ));
843
867
close (fd );
844
868
return -1 ;
845
869
}
846
870
847
- if (read (fd , & res , sizeof (res )) != sizeof (res )) {
871
+ if (read_retry (fd , & res , sizeof (res )) != sizeof (res )) {
848
872
jack_error ("cannot read event connect result from server (%s)" ,
849
873
strerror (errno ));
850
874
close (fd );
@@ -1109,14 +1133,14 @@ jack_request_client (ClientType type,
1109
1133
snprintf (req .object_data , sizeof (req .object_data ),
1110
1134
"%s" , va -> load_init );
1111
1135
1112
- if (write (* req_fd , & req , sizeof (req )) != sizeof (req )) {
1136
+ if (write_retry (* req_fd , & req , sizeof (req )) != sizeof (req )) {
1113
1137
jack_error ("cannot send request to jack server (%s)" ,
1114
1138
strerror (errno ));
1115
1139
* status |= (JackFailure | JackServerError );
1116
1140
goto fail ;
1117
1141
}
1118
1142
1119
- if (read (* req_fd , res , sizeof (* res )) != sizeof (* res )) {
1143
+ if (read_retry (* req_fd , res , sizeof (* res )) != sizeof (* res )) {
1120
1144
1121
1145
if (errno == 0 ) {
1122
1146
/* server shut the socket */
@@ -1512,7 +1536,7 @@ jack_internal_client_close (const char *client_name)
1512
1536
return ;
1513
1537
}
1514
1538
1515
- if (write (fd , & req , sizeof (req )) != sizeof (req )) {
1539
+ if (write_retry (fd , & req , sizeof (req )) != sizeof (req )) {
1516
1540
jack_error ("cannot deliver ClientUnload request to JACK "
1517
1541
"server." );
1518
1542
}
@@ -1648,7 +1672,7 @@ jack_session_notify (jack_client_t* client, const char *target, jack_session_eve
1648
1672
1649
1673
request .x .session .type = code ;
1650
1674
1651
- if ( (write (client -> request_fd , & request , sizeof (request ))
1675
+ if ( (write_retry (client -> request_fd , & request , sizeof (request ))
1652
1676
!= sizeof (request )) ) {
1653
1677
jack_error ("cannot send request type %d to server" ,
1654
1678
request .type );
@@ -1658,7 +1682,7 @@ jack_session_notify (jack_client_t* client, const char *target, jack_session_eve
1658
1682
while ( 1 ) {
1659
1683
jack_uuid_t uid ;
1660
1684
1661
- if (read (client -> request_fd , & uid , sizeof (uid )) != sizeof (uid )) {
1685
+ if (read_retry (client -> request_fd , & uid , sizeof (uid )) != sizeof (uid )) {
1662
1686
jack_error ("cannot read result for request type %d from"
1663
1687
" server (%s)" , request .type , strerror (errno ));
1664
1688
goto out ;
@@ -1680,19 +1704,19 @@ jack_session_notify (jack_client_t* client, const char *target, jack_session_eve
1680
1704
break ;
1681
1705
}
1682
1706
1683
- if (read (client -> request_fd , (char * )retval [num_replies - 1 ].client_name , JACK_CLIENT_NAME_SIZE )
1707
+ if (read_retry (client -> request_fd , (char * )retval [num_replies - 1 ].client_name , JACK_CLIENT_NAME_SIZE )
1684
1708
!= JACK_CLIENT_NAME_SIZE ) {
1685
1709
jack_error ("cannot read result for request type %d from"
1686
1710
" server (%s)" , request .type , strerror (errno ));
1687
1711
goto out ;
1688
1712
}
1689
- if (read (client -> request_fd , (char * )retval [num_replies - 1 ].command , JACK_PORT_NAME_SIZE )
1713
+ if (read_retry (client -> request_fd , (char * )retval [num_replies - 1 ].command , JACK_PORT_NAME_SIZE )
1690
1714
!= JACK_PORT_NAME_SIZE ) {
1691
1715
jack_error ("cannot read result for request type %d from"
1692
1716
" server (%s)" , request .type , strerror (errno ));
1693
1717
goto out ;
1694
1718
}
1695
- if (read (client -> request_fd , & retval [num_replies - 1 ].flags , sizeof (retval [num_replies - 1 ].flags ) )
1719
+ if (read_retry (client -> request_fd , & retval [num_replies - 1 ].flags , sizeof (retval [num_replies - 1 ].flags ) )
1696
1720
!= sizeof (retval [num_replies - 1 ].flags ) ) {
1697
1721
jack_error ("cannot read result for request type %d from"
1698
1722
" server (%s)" , request .type , strerror (errno ));
@@ -1811,7 +1835,7 @@ jack_client_process_events (jack_client_t* client)
1811
1835
/* server has sent us an event. process the
1812
1836
* event and reply */
1813
1837
1814
- if (read (client -> event_fd , & event , sizeof (event ))
1838
+ if (read_retry (client -> event_fd , & event , sizeof (event ))
1815
1839
!= sizeof (event )) {
1816
1840
jack_error ("cannot read server event (%s)" ,
1817
1841
strerror (errno ));
@@ -1821,7 +1845,7 @@ jack_client_process_events (jack_client_t* client)
1821
1845
if (event .type == PropertyChange ) {
1822
1846
if (event .y .key_size ) {
1823
1847
key = (char * )malloc (event .y .key_size );
1824
- if (read (client -> event_fd , key , event .y .key_size ) !=
1848
+ if (read_retry (client -> event_fd , key , event .y .key_size ) !=
1825
1849
event .y .key_size ) {
1826
1850
jack_error ("cannot read property change key (%s)" ,
1827
1851
strerror (errno ));
@@ -1940,7 +1964,7 @@ jack_client_process_events (jack_client_t* client)
1940
1964
DEBUG ("client has dealt with the event, writing "
1941
1965
"response on event fd" );
1942
1966
1943
- if (write (client -> event_fd , & status , sizeof (status ))
1967
+ if (write_retry (client -> event_fd , & status , sizeof (status ))
1944
1968
!= sizeof (status )) {
1945
1969
jack_error ("cannot send event response to "
1946
1970
"engine (%s)" , strerror (errno ));
@@ -1960,7 +1984,7 @@ jack_wake_next_client (jack_client_t* client)
1960
1984
int pret = 0 ;
1961
1985
char c = 0 ;
1962
1986
1963
- if (write (client -> graph_next_fd , & c , sizeof (c ))
1987
+ if (write_retry (client -> graph_next_fd , & c , sizeof (c ))
1964
1988
!= sizeof (c )) {
1965
1989
DEBUG ("cannot write byte to fd %d" , client -> graph_next_fd );
1966
1990
jack_error ("cannot continue execution of the "
@@ -1988,7 +2012,7 @@ jack_wake_next_client (jack_client_t* client)
1988
2012
}
1989
2013
1990
2014
if (pret > 0 && (pfds [0 ].revents & POLLIN )) {
1991
- if (read (client -> graph_wait_fd , & c , sizeof (c ))
2015
+ if (read_retry (client -> graph_wait_fd , & c , sizeof (c ))
1992
2016
!= sizeof (c )) {
1993
2017
jack_error ("cannot complete execution of the "
1994
2018
"processing graph (%s)" , strerror (errno ));
0 commit comments