projects
/
ust.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ust-consumerd: fix exit race crashes
[ust.git]
/
libustconsumer
/
libustconsumer.c
diff --git
a/libustconsumer/libustconsumer.c
b/libustconsumer/libustconsumer.c
index eaee1fa61f358b6ec3145818ae5347994fcb6249..abf21d801ca1473fd8b1b3c1453636361fc0199a 100644
(file)
--- a/
libustconsumer/libustconsumer.c
+++ b/
libustconsumer/libustconsumer.c
@@
-34,7
+34,7
@@
#include <ust/ustconsumer.h>
#include "lowlevel.h"
#include <ust/ustconsumer.h>
#include "lowlevel.h"
-#include "usterr.h"
+#include "usterr
_signal_safe
.h"
#include "ustcomm.h"
#define GET_SUBBUF_OK 1
#include "ustcomm.h"
#define GET_SUBBUF_OK 1
@@
-477,6
+477,8
@@
int consumer_loop(struct ustconsumer_instance *instance, struct buffer_info *buf
DBG("App died while being traced");
finish_consuming_dead_subbuffer(instance->callbacks, buf);
break;
DBG("App died while being traced");
finish_consuming_dead_subbuffer(instance->callbacks, buf);
break;
+ } else if (read_result == -1 && errno == EINTR) {
+ continue;
}
if(instance->callbacks->on_read_subbuffer)
}
if(instance->callbacks->on_read_subbuffer)
@@
-783,8
+785,11
@@
int ustconsumer_stop_instance(struct ustconsumer_instance *instance, int send_ms
struct sockaddr_un addr;
struct sockaddr_un addr;
+socket_again:
result = fd = socket(PF_UNIX, SOCK_STREAM, 0);
if(result == -1) {
result = fd = socket(PF_UNIX, SOCK_STREAM, 0);
if(result == -1) {
+ if (errno == EINTR)
+ goto socket_again;
PERROR("socket");
return 1;
}
PERROR("socket");
return 1;
}
@@
-794,13
+799,21
@@
int ustconsumer_stop_instance(struct ustconsumer_instance *instance, int send_ms
strncpy(addr.sun_path, instance->sock_path, UNIX_PATH_MAX);
addr.sun_path[UNIX_PATH_MAX-1] = '\0';
strncpy(addr.sun_path, instance->sock_path, UNIX_PATH_MAX);
addr.sun_path[UNIX_PATH_MAX-1] = '\0';
+connect_again:
result = connect(fd, (struct sockaddr *)&addr, sizeof(addr));
if(result == -1) {
result = connect(fd, (struct sockaddr *)&addr, sizeof(addr));
if(result == -1) {
+ if (errno == EINTR)
+ goto connect_again;
PERROR("connect");
}
PERROR("connect");
}
- while(bytes != sizeof(msg))
- bytes += send(fd, msg, sizeof(msg), 0);
+ while(bytes != sizeof(msg)) {
+ int inc = send(fd, msg, sizeof(msg), 0);
+ if (inc < 0 && errno != EINTR)
+ break;
+ else
+ bytes += inc;
+ }
close(fd);
close(fd);
This page took
0.023221 seconds
and
4
git commands to generate.