Skip to content

Commit cb654ad

Browse files
authored
Merge pull request #61 from yurivict/io-retry-EINTR
read/write wrappers to handle the case of interruption by system signals
2 parents 44e2398 + de00d98 commit cb654ad

File tree

1 file changed

+42
-18
lines changed

1 file changed

+42
-18
lines changed

libjack/client.c

+42-18
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,30 @@ init_cpu ()
118118

119119
#endif /* USE_DYNSIMD */
120120

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+
121145
const char *
122146
jack_get_tmpdir ()
123147
{
@@ -251,15 +275,15 @@ oop_client_deliver_request (void *ptr, jack_request_t *req)
251275
int wok, rok;
252276
jack_client_t *client = (jack_client_t*)ptr;
253277

254-
wok = (write (client->request_fd, req, sizeof(*req))
278+
wok = (write_retry (client->request_fd, req, sizeof(*req))
255279
== sizeof(*req));
256280

257281
/* if necessary, add variable length key data after a PropertyChange request
258282
*/
259283

260284
if (req->type == PropertyChangeNotify) {
261285
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) {
263287
jack_error ("cannot send property key of length %d to server",
264288
req->x.property.keylen);
265289
req->status = -1;
@@ -268,7 +292,7 @@ oop_client_deliver_request (void *ptr, jack_request_t *req)
268292
}
269293
}
270294

271-
rok = (read (client->request_fd, req, sizeof(*req))
295+
rok = (read_retry (client->request_fd, req, sizeof(*req))
272296
== sizeof(*req));
273297

274298
if (wok && rok) { /* everything OK? */
@@ -837,14 +861,14 @@ server_event_connect (jack_client_t *client, const char *server_name)
837861

838862
jack_uuid_copy (&req.client_id, client->control->uuid);
839863

840-
if (write (fd, &req, sizeof(req)) != sizeof(req)) {
864+
if (write_retry (fd, &req, sizeof(req)) != sizeof(req)) {
841865
jack_error ("cannot write event connect request to server (%s)",
842866
strerror (errno));
843867
close (fd);
844868
return -1;
845869
}
846870

847-
if (read (fd, &res, sizeof(res)) != sizeof(res)) {
871+
if (read_retry (fd, &res, sizeof(res)) != sizeof(res)) {
848872
jack_error ("cannot read event connect result from server (%s)",
849873
strerror (errno));
850874
close (fd);
@@ -1109,14 +1133,14 @@ jack_request_client (ClientType type,
11091133
snprintf (req.object_data, sizeof(req.object_data),
11101134
"%s", va->load_init);
11111135

1112-
if (write (*req_fd, &req, sizeof(req)) != sizeof(req)) {
1136+
if (write_retry (*req_fd, &req, sizeof(req)) != sizeof(req)) {
11131137
jack_error ("cannot send request to jack server (%s)",
11141138
strerror (errno));
11151139
*status |= (JackFailure | JackServerError);
11161140
goto fail;
11171141
}
11181142

1119-
if (read (*req_fd, res, sizeof(*res)) != sizeof(*res)) {
1143+
if (read_retry (*req_fd, res, sizeof(*res)) != sizeof(*res)) {
11201144

11211145
if (errno == 0) {
11221146
/* server shut the socket */
@@ -1512,7 +1536,7 @@ jack_internal_client_close (const char *client_name)
15121536
return;
15131537
}
15141538

1515-
if (write (fd, &req, sizeof(req)) != sizeof(req)) {
1539+
if (write_retry (fd, &req, sizeof(req)) != sizeof(req)) {
15161540
jack_error ("cannot deliver ClientUnload request to JACK "
15171541
"server.");
15181542
}
@@ -1648,7 +1672,7 @@ jack_session_notify (jack_client_t* client, const char *target, jack_session_eve
16481672

16491673
request.x.session.type = code;
16501674

1651-
if ( (write (client->request_fd, &request, sizeof(request))
1675+
if ( (write_retry (client->request_fd, &request, sizeof(request))
16521676
!= sizeof(request)) ) {
16531677
jack_error ("cannot send request type %d to server",
16541678
request.type);
@@ -1658,7 +1682,7 @@ jack_session_notify (jack_client_t* client, const char *target, jack_session_eve
16581682
while ( 1 ) {
16591683
jack_uuid_t uid;
16601684

1661-
if (read (client->request_fd, &uid, sizeof(uid)) != sizeof(uid)) {
1685+
if (read_retry (client->request_fd, &uid, sizeof(uid)) != sizeof(uid)) {
16621686
jack_error ("cannot read result for request type %d from"
16631687
" server (%s)", request.type, strerror (errno));
16641688
goto out;
@@ -1680,19 +1704,19 @@ jack_session_notify (jack_client_t* client, const char *target, jack_session_eve
16801704
break;
16811705
}
16821706

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)
16841708
!= JACK_CLIENT_NAME_SIZE) {
16851709
jack_error ("cannot read result for request type %d from"
16861710
" server (%s)", request.type, strerror (errno));
16871711
goto out;
16881712
}
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)
16901714
!= JACK_PORT_NAME_SIZE) {
16911715
jack_error ("cannot read result for request type %d from"
16921716
" server (%s)", request.type, strerror (errno));
16931717
goto out;
16941718
}
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) )
16961720
!= sizeof(retval[num_replies - 1].flags) ) {
16971721
jack_error ("cannot read result for request type %d from"
16981722
" server (%s)", request.type, strerror (errno));
@@ -1811,7 +1835,7 @@ jack_client_process_events (jack_client_t* client)
18111835
/* server has sent us an event. process the
18121836
* event and reply */
18131837

1814-
if (read (client->event_fd, &event, sizeof(event))
1838+
if (read_retry (client->event_fd, &event, sizeof(event))
18151839
!= sizeof(event)) {
18161840
jack_error ("cannot read server event (%s)",
18171841
strerror (errno));
@@ -1821,7 +1845,7 @@ jack_client_process_events (jack_client_t* client)
18211845
if (event.type == PropertyChange) {
18221846
if (event.y.key_size) {
18231847
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) !=
18251849
event.y.key_size) {
18261850
jack_error ("cannot read property change key (%s)",
18271851
strerror (errno));
@@ -1940,7 +1964,7 @@ jack_client_process_events (jack_client_t* client)
19401964
DEBUG ("client has dealt with the event, writing "
19411965
"response on event fd");
19421966

1943-
if (write (client->event_fd, &status, sizeof(status))
1967+
if (write_retry (client->event_fd, &status, sizeof(status))
19441968
!= sizeof(status)) {
19451969
jack_error ("cannot send event response to "
19461970
"engine (%s)", strerror (errno));
@@ -1960,7 +1984,7 @@ jack_wake_next_client (jack_client_t* client)
19601984
int pret = 0;
19611985
char c = 0;
19621986

1963-
if (write (client->graph_next_fd, &c, sizeof(c))
1987+
if (write_retry (client->graph_next_fd, &c, sizeof(c))
19641988
!= sizeof(c)) {
19651989
DEBUG ("cannot write byte to fd %d", client->graph_next_fd);
19661990
jack_error ("cannot continue execution of the "
@@ -1988,7 +2012,7 @@ jack_wake_next_client (jack_client_t* client)
19882012
}
19892013

19902014
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))
19922016
!= sizeof(c)) {
19932017
jack_error ("cannot complete execution of the "
19942018
"processing graph (%s)", strerror (errno));

0 commit comments

Comments
 (0)