From de00d982941e28db328e8af48eee8ea4dec03401 Mon Sep 17 00:00:00 2001 From: Yuri Date: Tue, 10 Jan 2017 14:57:41 -0800 Subject: read/write wrappers to handle the case of interruption by system signals --- libjack/client.c | 60 +++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 18 deletions(-) diff --git a/libjack/client.c b/libjack/client.c index 221d0c4..ac619c6 100644 --- a/libjack/client.c +++ b/libjack/client.c @@ -118,6 +118,30 @@ init_cpu () #endif /* USE_DYNSIMD */ +/* + * The following read/write wrappers handle the case of interruption + * by system signals: + */ +static int +read_retry(int fd, void *dst, int size) +{ + int error; + do { + error = read(fd, dst, size); + } while (error == -1 && errno == EINTR); + return (error); +} + +static int +write_retry(int fd, const void *src, int size) +{ + int error; + do { + error = write(fd, src, size); + } while (error == -1 && errno == EINTR); + return (error); +} + const char * jack_get_tmpdir () { @@ -251,7 +275,7 @@ oop_client_deliver_request (void *ptr, jack_request_t *req) int wok, rok; jack_client_t *client = (jack_client_t*)ptr; - wok = (write (client->request_fd, req, sizeof(*req)) + wok = (write_retry (client->request_fd, req, sizeof(*req)) == sizeof(*req)); /* if necessary, add variable length key data after a PropertyChange request @@ -259,7 +283,7 @@ oop_client_deliver_request (void *ptr, jack_request_t *req) if (req->type == PropertyChangeNotify) { if (req->x.property.keylen) { - if (write (client->request_fd, req->x.property.key, req->x.property.keylen) != req->x.property.keylen) { + if (write_retry (client->request_fd, req->x.property.key, req->x.property.keylen) != req->x.property.keylen) { jack_error ("cannot send property key of length %d to server", req->x.property.keylen); req->status = -1; @@ -268,7 +292,7 @@ oop_client_deliver_request (void *ptr, jack_request_t *req) } } - rok = (read (client->request_fd, req, sizeof(*req)) + rok = (read_retry (client->request_fd, req, sizeof(*req)) == sizeof(*req)); if (wok && rok) { /* everything OK? */ @@ -837,14 +861,14 @@ server_event_connect (jack_client_t *client, const char *server_name) jack_uuid_copy (&req.client_id, client->control->uuid); - if (write (fd, &req, sizeof(req)) != sizeof(req)) { + if (write_retry (fd, &req, sizeof(req)) != sizeof(req)) { jack_error ("cannot write event connect request to server (%s)", strerror (errno)); close (fd); return -1; } - if (read (fd, &res, sizeof(res)) != sizeof(res)) { + if (read_retry (fd, &res, sizeof(res)) != sizeof(res)) { jack_error ("cannot read event connect result from server (%s)", strerror (errno)); close (fd); @@ -1109,14 +1133,14 @@ jack_request_client (ClientType type, snprintf (req.object_data, sizeof(req.object_data), "%s", va->load_init); - if (write (*req_fd, &req, sizeof(req)) != sizeof(req)) { + if (write_retry (*req_fd, &req, sizeof(req)) != sizeof(req)) { jack_error ("cannot send request to jack server (%s)", strerror (errno)); *status |= (JackFailure | JackServerError); goto fail; } - if (read (*req_fd, res, sizeof(*res)) != sizeof(*res)) { + if (read_retry (*req_fd, res, sizeof(*res)) != sizeof(*res)) { if (errno == 0) { /* server shut the socket */ @@ -1512,7 +1536,7 @@ jack_internal_client_close (const char *client_name) return; } - if (write (fd, &req, sizeof(req)) != sizeof(req)) { + if (write_retry (fd, &req, sizeof(req)) != sizeof(req)) { jack_error ("cannot deliver ClientUnload request to JACK " "server."); } @@ -1648,7 +1672,7 @@ jack_session_notify (jack_client_t* client, const char *target, jack_session_eve request.x.session.type = code; - if ( (write (client->request_fd, &request, sizeof(request)) + if ( (write_retry (client->request_fd, &request, sizeof(request)) != sizeof(request)) ) { jack_error ("cannot send request type %d to server", request.type); @@ -1658,7 +1682,7 @@ jack_session_notify (jack_client_t* client, const char *target, jack_session_eve while ( 1 ) { jack_uuid_t uid; - if (read (client->request_fd, &uid, sizeof(uid)) != sizeof(uid)) { + if (read_retry (client->request_fd, &uid, sizeof(uid)) != sizeof(uid)) { jack_error ("cannot read result for request type %d from" " server (%s)", request.type, strerror (errno)); goto out; @@ -1680,19 +1704,19 @@ jack_session_notify (jack_client_t* client, const char *target, jack_session_eve break; } - if (read (client->request_fd, (char*)retval[num_replies - 1].client_name, JACK_CLIENT_NAME_SIZE) + if (read_retry (client->request_fd, (char*)retval[num_replies - 1].client_name, JACK_CLIENT_NAME_SIZE) != JACK_CLIENT_NAME_SIZE) { jack_error ("cannot read result for request type %d from" " server (%s)", request.type, strerror (errno)); goto out; } - if (read (client->request_fd, (char*)retval[num_replies - 1].command, JACK_PORT_NAME_SIZE) + if (read_retry (client->request_fd, (char*)retval[num_replies - 1].command, JACK_PORT_NAME_SIZE) != JACK_PORT_NAME_SIZE) { jack_error ("cannot read result for request type %d from" " server (%s)", request.type, strerror (errno)); goto out; } - if (read (client->request_fd, &retval[num_replies - 1].flags, sizeof(retval[num_replies - 1].flags) ) + if (read_retry (client->request_fd, &retval[num_replies - 1].flags, sizeof(retval[num_replies - 1].flags) ) != sizeof(retval[num_replies - 1].flags) ) { jack_error ("cannot read result for request type %d from" " server (%s)", request.type, strerror (errno)); @@ -1811,7 +1835,7 @@ jack_client_process_events (jack_client_t* client) /* server has sent us an event. process the * event and reply */ - if (read (client->event_fd, &event, sizeof(event)) + if (read_retry (client->event_fd, &event, sizeof(event)) != sizeof(event)) { jack_error ("cannot read server event (%s)", strerror (errno)); @@ -1821,7 +1845,7 @@ jack_client_process_events (jack_client_t* client) if (event.type == PropertyChange) { if (event.y.key_size) { key = (char*)malloc (event.y.key_size); - if (read (client->event_fd, key, event.y.key_size) != + if (read_retry (client->event_fd, key, event.y.key_size) != event.y.key_size) { jack_error ("cannot read property change key (%s)", strerror (errno)); @@ -1940,7 +1964,7 @@ jack_client_process_events (jack_client_t* client) DEBUG ("client has dealt with the event, writing " "response on event fd"); - if (write (client->event_fd, &status, sizeof(status)) + if (write_retry (client->event_fd, &status, sizeof(status)) != sizeof(status)) { jack_error ("cannot send event response to " "engine (%s)", strerror (errno)); @@ -1960,7 +1984,7 @@ jack_wake_next_client (jack_client_t* client) int pret = 0; char c = 0; - if (write (client->graph_next_fd, &c, sizeof(c)) + if (write_retry (client->graph_next_fd, &c, sizeof(c)) != sizeof(c)) { DEBUG ("cannot write byte to fd %d", client->graph_next_fd); jack_error ("cannot continue execution of the " @@ -1988,7 +2012,7 @@ jack_wake_next_client (jack_client_t* client) } if (pret > 0 && (pfds[0].revents & POLLIN)) { - if (read (client->graph_wait_fd, &c, sizeof(c)) + if (read_retry (client->graph_wait_fd, &c, sizeof(c)) != sizeof(c)) { jack_error ("cannot complete execution of the " "processing graph (%s)", strerror (errno)); -- cgit v1.2.1