| @@ -118,6 +118,30 @@ init_cpu () | |||||
| #endif /* USE_DYNSIMD */ | #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 * | const char * | ||||
| jack_get_tmpdir () | jack_get_tmpdir () | ||||
| { | { | ||||
| @@ -251,7 +275,7 @@ oop_client_deliver_request (void *ptr, jack_request_t *req) | |||||
| int wok, rok; | int wok, rok; | ||||
| jack_client_t *client = (jack_client_t*)ptr; | 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)); | == sizeof(*req)); | ||||
| /* if necessary, add variable length key data after a PropertyChange request | /* 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->type == PropertyChangeNotify) { | ||||
| if (req->x.property.keylen) { | 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", | jack_error ("cannot send property key of length %d to server", | ||||
| req->x.property.keylen); | req->x.property.keylen); | ||||
| req->status = -1; | 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)); | == sizeof(*req)); | ||||
| if (wok && rok) { /* everything OK? */ | 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); | 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)", | jack_error ("cannot write event connect request to server (%s)", | ||||
| strerror (errno)); | strerror (errno)); | ||||
| close (fd); | close (fd); | ||||
| return -1; | 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)", | jack_error ("cannot read event connect result from server (%s)", | ||||
| strerror (errno)); | strerror (errno)); | ||||
| close (fd); | close (fd); | ||||
| @@ -1109,14 +1133,14 @@ jack_request_client (ClientType type, | |||||
| snprintf (req.object_data, sizeof(req.object_data), | snprintf (req.object_data, sizeof(req.object_data), | ||||
| "%s", va->load_init); | "%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)", | jack_error ("cannot send request to jack server (%s)", | ||||
| strerror (errno)); | strerror (errno)); | ||||
| *status |= (JackFailure | JackServerError); | *status |= (JackFailure | JackServerError); | ||||
| goto fail; | goto fail; | ||||
| } | } | ||||
| if (read (*req_fd, res, sizeof(*res)) != sizeof(*res)) { | |||||
| if (read_retry (*req_fd, res, sizeof(*res)) != sizeof(*res)) { | |||||
| if (errno == 0) { | if (errno == 0) { | ||||
| /* server shut the socket */ | /* server shut the socket */ | ||||
| @@ -1512,7 +1536,7 @@ jack_internal_client_close (const char *client_name) | |||||
| return; | 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 " | jack_error ("cannot deliver ClientUnload request to JACK " | ||||
| "server."); | "server."); | ||||
| } | } | ||||
| @@ -1648,7 +1672,7 @@ jack_session_notify (jack_client_t* client, const char *target, jack_session_eve | |||||
| request.x.session.type = code; | request.x.session.type = code; | ||||
| if ( (write (client->request_fd, &request, sizeof(request)) | |||||
| if ( (write_retry (client->request_fd, &request, sizeof(request)) | |||||
| != sizeof(request)) ) { | != sizeof(request)) ) { | ||||
| jack_error ("cannot send request type %d to server", | jack_error ("cannot send request type %d to server", | ||||
| request.type); | request.type); | ||||
| @@ -1658,7 +1682,7 @@ jack_session_notify (jack_client_t* client, const char *target, jack_session_eve | |||||
| while ( 1 ) { | while ( 1 ) { | ||||
| jack_uuid_t uid; | 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" | jack_error ("cannot read result for request type %d from" | ||||
| " server (%s)", request.type, strerror (errno)); | " server (%s)", request.type, strerror (errno)); | ||||
| goto out; | goto out; | ||||
| @@ -1680,19 +1704,19 @@ jack_session_notify (jack_client_t* client, const char *target, jack_session_eve | |||||
| break; | 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_CLIENT_NAME_SIZE) { | ||||
| jack_error ("cannot read result for request type %d from" | jack_error ("cannot read result for request type %d from" | ||||
| " server (%s)", request.type, strerror (errno)); | " server (%s)", request.type, strerror (errno)); | ||||
| goto out; | 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_PORT_NAME_SIZE) { | ||||
| jack_error ("cannot read result for request type %d from" | jack_error ("cannot read result for request type %d from" | ||||
| " server (%s)", request.type, strerror (errno)); | " server (%s)", request.type, strerror (errno)); | ||||
| goto out; | 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) ) { | != sizeof(retval[num_replies - 1].flags) ) { | ||||
| jack_error ("cannot read result for request type %d from" | jack_error ("cannot read result for request type %d from" | ||||
| " server (%s)", request.type, strerror (errno)); | " 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 | /* server has sent us an event. process the | ||||
| * event and reply */ | * event and reply */ | ||||
| if (read (client->event_fd, &event, sizeof(event)) | |||||
| if (read_retry (client->event_fd, &event, sizeof(event)) | |||||
| != sizeof(event)) { | != sizeof(event)) { | ||||
| jack_error ("cannot read server event (%s)", | jack_error ("cannot read server event (%s)", | ||||
| strerror (errno)); | strerror (errno)); | ||||
| @@ -1821,7 +1845,7 @@ jack_client_process_events (jack_client_t* client) | |||||
| if (event.type == PropertyChange) { | if (event.type == PropertyChange) { | ||||
| if (event.y.key_size) { | if (event.y.key_size) { | ||||
| key = (char*)malloc (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) { | event.y.key_size) { | ||||
| jack_error ("cannot read property change key (%s)", | jack_error ("cannot read property change key (%s)", | ||||
| strerror (errno)); | strerror (errno)); | ||||
| @@ -1940,7 +1964,7 @@ jack_client_process_events (jack_client_t* client) | |||||
| DEBUG ("client has dealt with the event, writing " | DEBUG ("client has dealt with the event, writing " | ||||
| "response on event fd"); | "response on event fd"); | ||||
| if (write (client->event_fd, &status, sizeof(status)) | |||||
| if (write_retry (client->event_fd, &status, sizeof(status)) | |||||
| != sizeof(status)) { | != sizeof(status)) { | ||||
| jack_error ("cannot send event response to " | jack_error ("cannot send event response to " | ||||
| "engine (%s)", strerror (errno)); | "engine (%s)", strerror (errno)); | ||||
| @@ -1960,7 +1984,7 @@ jack_wake_next_client (jack_client_t* client) | |||||
| int pret = 0; | int pret = 0; | ||||
| char c = 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)) { | != sizeof(c)) { | ||||
| DEBUG ("cannot write byte to fd %d", client->graph_next_fd); | DEBUG ("cannot write byte to fd %d", client->graph_next_fd); | ||||
| jack_error ("cannot continue execution of the " | 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 (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)) { | != sizeof(c)) { | ||||
| jack_error ("cannot complete execution of the " | jack_error ("cannot complete execution of the " | ||||
| "processing graph (%s)", strerror (errno)); | "processing graph (%s)", strerror (errno)); | ||||