#include <ust/ustconsumer.h>
#include "lowlevel.h"
-#include "usterr.h"
+#include "usterr_signal_safe.h"
#include "ustcomm.h"
#define GET_SUBBUF_OK 1
pthread_mutex_unlock(&instance->mutex);
}
-static int get_pidunique(int sock, s64 *pidunique)
+static int get_pidunique(int sock, int64_t *pidunique)
{
struct ustcomm_header _send_hdr, *send_hdr;
struct ustcomm_header _recv_hdr, *recv_hdr;
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)
int result;
sigset_t sigset;
+ pthread_mutex_lock(&args->instance->mutex);
+ args->instance->active_threads++;
+ pthread_mutex_unlock(&args->instance->mutex);
+
if(args->instance->callbacks->on_new_thread)
args->instance->callbacks->on_new_thread(args->instance->callbacks);
if(args->instance->callbacks->on_close_thread)
args->instance->callbacks->on_close_thread(args->instance->callbacks);
+ pthread_mutex_lock(&args->instance->mutex);
+ args->instance->active_threads--;
+ pthread_mutex_unlock(&args->instance->mutex);
+
free((void *)args->channel);
free(args);
return NULL;
if (instance->quit_program) {
pthread_mutex_lock(&instance->mutex);
- if(instance->active_buffers == 0) {
+ if (instance->active_buffers == 0 && instance->active_threads == 0) {
pthread_mutex_unlock(&instance->mutex);
break;
}
struct sockaddr_un addr;
+socket_again:
result = fd = socket(PF_UNIX, SOCK_STREAM, 0);
if(result == -1) {
+ if (errno == EINTR)
+ goto socket_again;
PERROR("socket");
return 1;
}
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) {
+ if (errno == EINTR)
+ goto connect_again;
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);