the tracer can now stop its tracing without disturbing the tracee

it's buggy. Next commit to fix it.

The problem is if the tracer exits while sending a message.
The local tracer will not get it full and will throw garbage
to the T in the tracee, leading to some bad things...
This commit is contained in:
Cedric Roux
2016-06-01 17:18:57 +02:00
parent 2966fae4a5
commit 2219fe54ef
+40 -5
View File
@@ -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);