19981191e2d9d17be606d9358570118a6e36cc11
15 struct list_head buffers
= LIST_HEAD_INIT(buffers
);
28 int file_fd
; /* output file */
30 struct list_head list
;
35 int add_buffer(pid_t pid
, char *bufname
)
37 struct buffer_info
*buf
;
44 buf
= (struct buffer_info
*) malloc(sizeof(struct buffer_info
));
46 ERR("add_buffer: insufficient memory");
54 asprintf(&send_msg
, "get_shmid %s", buf
->name
);
55 send_message(pid
, send_msg
, &received_msg
);
57 DBG("got buffer name %s", buf
->name
);
59 result
= sscanf(received_msg
, "%d", &buf
->shmid
);
61 ERR("unable to parse response to get_shmid");
65 DBG("got shmid %d", buf
->shmid
);
68 asprintf(&send_msg
, "get_n_subbufs %s", buf
->name
);
69 send_message(pid
, send_msg
, &received_msg
);
72 result
= sscanf(received_msg
, "%d", &buf
->n_subbufs
);
74 ERR("unable to parse response to get_n_subbufs");
78 DBG("got n_subbufs %d", buf
->n_subbufs
);
81 asprintf(&send_msg
, "get_subbuf_size %s", buf
->name
);
82 send_message(pid
, send_msg
, &received_msg
);
85 result
= sscanf(received_msg
, "%d", &buf
->subbuf_size
);
87 ERR("unable to parse response to get_subbuf_size");
91 DBG("got subbuf_size %d", buf
->subbuf_size
);
94 buf
->mem
= shmat(buf
->shmid
, NULL
, 0);
95 if(buf
->mem
== (void *) 0) {
99 DBG("successfully attached memory");
101 /* open file for output */
102 asprintf(&tmp
, "/tmp/trace/%s_0", buf
->name
);
103 result
= fd
= open(tmp
, O_WRONLY
| O_CREAT
| O_TRUNC
, 00600);
111 list_add(&buf
->list
, &buffers
);
116 int get_subbuffer(struct buffer_info
*buf
)
124 asprintf(&send_msg
, "get_subbuffer %s", buf
->name
);
125 result
= send_message(buf
->pid
, send_msg
, &received_msg
);
127 ERR("get_subbuffer: send_message failed");
132 result
= sscanf(received_msg
, "%as %ld", &rep_code
, &buf
->consumed_old
);
134 ERR("unable to parse response to get_subbuffer");
139 if(!strcmp(rep_code
, "OK")) {
140 DBG("got subbuffer %s", buf
->name
);
144 DBG("did not get subbuffer %s", buf
->name
);
152 int put_subbuffer(struct buffer_info
*buf
)
160 asprintf(&send_msg
, "put_subbuffer %s %ld", buf
->name
, buf
->consumed_old
);
161 result
= send_message(buf
->pid
, send_msg
, &received_msg
);
163 ERR("put_subbuffer: send_message failed");
168 result
= sscanf(received_msg
, "%as", &rep_code
);
170 ERR("unable to parse response to put_subbuffer");
175 if(!strcmp(rep_code
, "OK")) {
176 DBG("subbuffer put %s", buf
->name
);
180 ERR("invalid response to put_subbuffer");
187 ssize_t
patient_write(int fd
, const void *buf
, size_t count
)
189 const char *bufc
= (const char *) buf
;
193 result
= write(fd
, bufc
, count
);
205 return bufc
-(const char *)buf
;
208 int main(int argc
, char **argv
)
210 struct ustcomm_ustd ustd
;
213 result
= ustcomm_init_ustd(&ustd
);
215 ERR("failed to initialize socket");
222 struct buffer_info
*buf
;
224 /* 1. check for requests on our public socket */
225 result
= ustcomm_ustd_recv_message(&ustd
, &recvbuf
, NULL
, 100);
227 ERR("error in ustcomm_ustd_recv_message");
231 if(!strncmp(recvbuf
, "collect", 7)) {
236 result
= sscanf(recvbuf
, "%*s %d %50as", &pid
, &bufname
);
238 fprintf(stderr
, "parsing error: %s\n", recvbuf
);
241 result
= add_buffer(pid
, bufname
);
243 ERR("error in add_buffer");
251 /* 2. try to consume data from tracing apps */
252 list_for_each_entry(buf
, &buffers
, list
) {
253 result
= get_subbuffer(buf
);
255 ERR("error getting subbuffer");
261 /* write data to file */
262 //result = write(buf->file_fd, buf->, );
263 result
= patient_write(buf
->file_fd
, buf
->mem
+ (buf
->consumed_old
& (buf
->n_subbufs
* buf
->subbuf_size
-1)), buf
->subbuf_size
);
266 /* FIXME: maybe drop this trace */
269 result
= put_subbuffer(buf
);
271 ERR("error putting subbuffer");
This page took 0.045778 seconds and 4 git commands to generate.