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:
@@ -11,6 +11,7 @@
|
|||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
|
||||||
#include "T_defs.h"
|
#include "T_defs.h"
|
||||||
|
#include "T_IDs.h"
|
||||||
|
|
||||||
static T_cache_t *T_cache;
|
static T_cache_t *T_cache;
|
||||||
static int T_busylist_head;
|
static int T_busylist_head;
|
||||||
@@ -23,7 +24,8 @@ typedef struct databuf {
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int socket_local;
|
int socket_local;
|
||||||
int socket_remote;
|
volatile int socket_remote;
|
||||||
|
int remote_port;
|
||||||
pthread_mutex_t lock;
|
pthread_mutex_t lock;
|
||||||
pthread_cond_t cond;
|
pthread_cond_t cond;
|
||||||
databuf * volatile head, *tail;
|
databuf * volatile head, *tail;
|
||||||
@@ -109,9 +111,15 @@ wait:
|
|||||||
|
|
||||||
process:
|
process:
|
||||||
b = buf;
|
b = buf;
|
||||||
|
if (f->socket_remote != -1)
|
||||||
while (size) {
|
while (size) {
|
||||||
int l = write(f->socket_remote, b, 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;
|
size -= l;
|
||||||
b += l;
|
b += l;
|
||||||
}
|
}
|
||||||
@@ -124,23 +132,49 @@ process:
|
|||||||
static void *forward_remote_messages(void *_f)
|
static void *forward_remote_messages(void *_f)
|
||||||
{
|
{
|
||||||
forward_data *f = _f;
|
forward_data *f = _f;
|
||||||
int from = f->socket_remote;
|
int from;
|
||||||
int to = f->socket_local;
|
int to;
|
||||||
int l, len;
|
int l, len;
|
||||||
char *b;
|
char *b;
|
||||||
char buf[1024];
|
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) {
|
while (1) {
|
||||||
|
from = f->socket_remote;
|
||||||
|
to = f->socket_local;
|
||||||
len = read(from, buf, 1024);
|
len = read(from, buf, 1024);
|
||||||
if (len <= 0) break;
|
if (len <= 0) break;
|
||||||
b = buf;
|
b = buf;
|
||||||
|
|
||||||
while (len) {
|
while (len) {
|
||||||
l = write(to, b, len);
|
l = write(to, b, len);
|
||||||
if (l <= 0) break;
|
if (l <= 0) abort();
|
||||||
len -= l;
|
len -= l;
|
||||||
b += 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;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,6 +195,7 @@ static void *forwarder(int port, int s)
|
|||||||
|
|
||||||
printf("waiting for remote tracer on port %d\n", port);
|
printf("waiting for remote tracer on port %d\n", port);
|
||||||
|
|
||||||
|
f->remote_port = port;
|
||||||
f->socket_remote = get_connection("127.0.0.1", port);
|
f->socket_remote = get_connection("127.0.0.1", port);
|
||||||
|
|
||||||
new_thread(data_sender, f);
|
new_thread(data_sender, f);
|
||||||
|
|||||||
Reference in New Issue
Block a user