8205ed2b2b5e3c77cc6fa9ecae56e2c2ef7ed0ae
16 struct list_head buffers
= LIST_HEAD_INIT(buffers
);
29 int file_fd
; /* output file */
31 struct list_head list
;
36 /* return value: 0 = subbuffer is finished, it won't produce data anymore
37 * 1 = got subbuffer successfully
41 int get_subbuffer(struct buffer_info
*buf
)
49 asprintf(&send_msg
, "get_subbuffer %s", buf
->name
);
50 result
= send_message(buf
->pid
, send_msg
, &received_msg
);
52 ERR("get_subbuffer: send_message failed");
57 result
= sscanf(received_msg
, "%as %ld", &rep_code
, &buf
->consumed_old
);
58 if(result
!= 2 && result
!= 1) {
59 ERR("unable to parse response to get_subbuffer");
63 DBG("received msg is %s", received_msg
);
65 if(!strcmp(rep_code
, "OK")) {
66 DBG("got subbuffer %s", buf
->name
);
69 else if(nth_token_is(received_msg
, "END", 0) == 1) {
73 DBG("error getting subbuffer %s", buf
->name
);
77 /* FIMXE: free correctly the stuff */
83 int put_subbuffer(struct buffer_info
*buf
)
91 asprintf(&send_msg
, "put_subbuffer %s %ld", buf
->name
, buf
->consumed_old
);
92 result
= send_message(buf
->pid
, send_msg
, &received_msg
);
94 ERR("put_subbuffer: send_message failed");
99 result
= sscanf(received_msg
, "%as", &rep_code
);
101 ERR("unable to parse response to put_subbuffer");
106 if(!strcmp(rep_code
, "OK")) {
107 DBG("subbuffer put %s", buf
->name
);
111 ERR("invalid response to put_subbuffer");
118 ssize_t
patient_write(int fd
, const void *buf
, size_t count
)
120 const char *bufc
= (const char *) buf
;
124 result
= write(fd
, bufc
, count
);
136 return bufc
-(const char *)buf
;
139 void *consumer_thread(void *arg
)
141 struct buffer_info
*buf
= (struct buffer_info
*) arg
;
145 result
= get_subbuffer(buf
);
147 ERR("error getting subbuffer");
155 /* write data to file */
156 result
= patient_write(buf
->file_fd
, buf
->mem
+ (buf
->consumed_old
& (buf
->n_subbufs
* buf
->subbuf_size
-1)), buf
->subbuf_size
);
159 /* FIXME: maybe drop this trace */
162 result
= put_subbuffer(buf
);
164 ERR("error putting subbuffer");
169 DBG("thread for buffer %s is stopping", buf
->name
);
174 int add_buffer(pid_t pid
, char *bufname
)
176 struct buffer_info
*buf
;
184 buf
= (struct buffer_info
*) malloc(sizeof(struct buffer_info
));
186 ERR("add_buffer: insufficient memory");
194 asprintf(&send_msg
, "get_shmid %s", buf
->name
);
195 send_message(pid
, send_msg
, &received_msg
);
197 DBG("got buffer name %s", buf
->name
);
199 result
= sscanf(received_msg
, "%d", &buf
->shmid
);
201 ERR("unable to parse response to get_shmid");
205 DBG("got shmid %d", buf
->shmid
);
208 asprintf(&send_msg
, "get_n_subbufs %s", buf
->name
);
209 send_message(pid
, send_msg
, &received_msg
);
212 result
= sscanf(received_msg
, "%d", &buf
->n_subbufs
);
214 ERR("unable to parse response to get_n_subbufs");
218 DBG("got n_subbufs %d", buf
->n_subbufs
);
220 /* get subbuf size */
221 asprintf(&send_msg
, "get_subbuf_size %s", buf
->name
);
222 send_message(pid
, send_msg
, &received_msg
);
225 result
= sscanf(received_msg
, "%d", &buf
->subbuf_size
);
227 ERR("unable to parse response to get_subbuf_size");
231 DBG("got subbuf_size %d", buf
->subbuf_size
);
234 buf
->mem
= shmat(buf
->shmid
, NULL
, 0);
235 if(buf
->mem
== (void *) 0) {
239 DBG("successfully attached memory");
241 /* open file for output */
242 asprintf(&tmp
, "/tmp/trace/%s_0", buf
->name
);
243 result
= fd
= open(tmp
, O_WRONLY
| O_CREAT
| O_TRUNC
, 00600);
251 //list_add(&buf->list, &buffers);
253 pthread_create(&thr
, NULL
, consumer_thread
, buf
);
258 int main(int argc
, char **argv
)
260 struct ustcomm_ustd ustd
;
263 result
= ustcomm_init_ustd(&ustd
);
265 ERR("failed to initialize socket");
273 /* check for requests on our public socket */
274 result
= ustcomm_ustd_recv_message(&ustd
, &recvbuf
, NULL
, 100);
276 ERR("error in ustcomm_ustd_recv_message");
280 if(!strncmp(recvbuf
, "collect", 7)) {
285 result
= sscanf(recvbuf
, "%*s %d %50as", &pid
, &bufname
);
287 fprintf(stderr
, "parsing error: %s\n", recvbuf
);
290 result
= add_buffer(pid
, bufname
);
292 ERR("error in add_buffer");
This page took 0.046489 seconds and 4 git commands to generate.