diff --git a/common/utils/T/local_tracer.c b/common/utils/T/local_tracer.c index f61df5a483741b1f7927ae9d075dc5f60a594f38..fb4cbd9a3eeefe7df1dbd7f32b85da93a97a01be 100644 --- a/common/utils/T/local_tracer.c +++ b/common/utils/T/local_tracer.c @@ -11,6 +11,7 @@ #include <inttypes.h> #include "T_defs.h" +#include "T_IDs.h" static T_cache_t *T_cache; static int T_busylist_head; @@ -23,7 +24,8 @@ typedef struct databuf { typedef struct { int socket_local; - int socket_remote; + volatile int socket_remote; + int remote_port; pthread_mutex_t lock; pthread_cond_t cond; databuf * volatile head, *tail; @@ -109,9 +111,15 @@ wait: process: b = buf; + if (f->socket_remote != -1) while (size) { int l = write(f->socket_remote, b, size); - if (l <= 0) { printf("forward error\n"); exit(1); } + if (l <= 0) { + printf("forward error\n"); + close(f->socket_remote); + f->socket_remote = -1; + break; + } size -= l; b += l; } @@ -124,23 +132,49 @@ process: static void *forward_remote_messages(void *_f) { forward_data *f = _f; - int from = f->socket_remote; - int to = f->socket_local; + int from; + int to; int l, len; char *b; char buf[1024]; + +again: + + /* Note: if the remote socket dies while a transfer is running + * then the state of the tracer will be totally messed up. + * If that ever happens, things are messed up anyway, so no big + * deal... (TODO: to be refined at some point, maybe) + */ while (1) { + from = f->socket_remote; + to = f->socket_local; len = read(from, buf, 1024); if (len <= 0) break; b = buf; while (len) { l = write(to, b, len); - if (l <= 0) break; + if (l <= 0) abort(); len -= l; b += l; } } + + /* socket died, let's stop all traces and wait for another tracer */ + buf[0] = 1; + if (write(to, buf, 1) != 1) abort(); + len = T_NUMBER_OF_IDS; + if (write(to, &len, sizeof(int)) != sizeof(int)) abort(); + l = 0; + while (len) { + if (write(to, &l, sizeof(int)) != sizeof(int)) abort(); + len--; + }; + + close(f->socket_remote); + f->socket_remote = get_connection("127.0.0.1", f->remote_port); + goto again; + return NULL; } @@ -161,6 +195,7 @@ static void *forwarder(int port, int s) printf("waiting for remote tracer on port %d\n", port); + f->remote_port = port; f->socket_remote = get_connection("127.0.0.1", port); new_thread(data_sender, f);