#include "ustd.h"
#include "localerr.h"
#include "ustcomm.h"
+#include "share.h"
/* return value: 0 = subbuffer is finished, it won't produce data anymore
* 1 = got subbuffer successfully
int get_subbuffer(struct buffer_info *buf)
{
- char *send_msg;
- char *received_msg;
- char *rep_code;
+ char *send_msg=NULL;
+ char *received_msg=NULL;
+ char *rep_code=NULL;
int retval;
int result;
asprintf(&send_msg, "get_subbuffer %s", buf->name);
result = ustcomm_send_request(&buf->conn, send_msg, &received_msg);
- free(send_msg);
if(test_sigpipe()) {
WARN("process %d destroyed before we could connect to it", buf->pid);
- return GET_SUBBUF_DONE;
+ retval = GET_SUBBUF_DONE;
+ goto end;
}
else if(result < 0) {
ERR("get_subbuffer: ustcomm_send_request failed");
- return -1;
- }
- else if(result == 0) {
- DBG("app died while being traced");
- return GET_SUBBUF_DIED;
+ retval = -1;
+ goto end;
}
result = sscanf(received_msg, "%as %ld", &rep_code, &buf->consumed_old);
if(result != 2 && result != 1) {
ERR("unable to parse response to get_subbuffer");
- return -1;
+ retval = -1;
+ goto end_rep;
}
DBG("received msg is %s", received_msg);
retval = GET_SUBBUF_OK;
}
else if(nth_token_is(received_msg, "END", 0) == 1) {
- return GET_SUBBUF_DONE;
+ retval = GET_SUBBUF_DONE;
+ goto end_rep;
}
else {
DBG("error getting subbuffer %s", buf->name);
}
/* FIMXE: free correctly the stuff */
- free(received_msg);
- free(rep_code);
+end_rep:
+ if(rep_code)
+ free(rep_code);
+end:
+ if(send_msg)
+ free(send_msg);
+ if(received_msg)
+ free(received_msg);
+
return retval;
}
int put_subbuffer(struct buffer_info *buf)
{
- char *send_msg;
- char *received_msg;
- char *rep_code;
+ char *send_msg=NULL;
+ char *received_msg=NULL;
+ char *rep_code=NULL;
int retval;
int result;
asprintf(&send_msg, "put_subbuffer %s %ld", buf->name, buf->consumed_old);
result = ustcomm_send_request(&buf->conn, send_msg, &received_msg);
+ if(result < 0 && errno == ECONNRESET) {
+ retval = PUT_SUBBUF_DIED;
+ goto end;
+ }
if(result < 0) {
ERR("put_subbuffer: send_message failed");
- return -1;
+ retval = -1;
+ goto end;
}
- free(send_msg);
result = sscanf(received_msg, "%as", &rep_code);
if(result != 1) {
ERR("unable to parse response to put_subbuffer");
- return -1;
+ retval = -1;
+ goto end_rep;
}
- free(received_msg);
if(!strcmp(rep_code, "OK")) {
DBG("subbuffer put %s", buf->name);
}
else {
DBG("put_subbuffer: received error, we were pushed");
- return PUT_SUBBUF_PUSHED;
+ retval = PUT_SUBBUF_PUSHED;
+ goto end_rep;
}
- free(rep_code);
- return retval;
-}
+end_rep:
+ if(rep_code)
+ free(rep_code);
-/* This write is patient because it restarts if it was incomplete.
- */
+end:
+ if(send_msg)
+ free(send_msg);
+ if(received_msg)
+ free(received_msg);
-ssize_t patient_write(int fd, const void *buf, size_t count)
-{
- const char *bufc = (const char *) buf;
- int result;
-
- for(;;) {
- result = write(fd, bufc, count);
- if(result <= 0) {
- return result;
- }
- count -= result;
- bufc += result;
-
- if(count == 0) {
- break;
- }
- }
-
- return bufc-(const char *)buf;
+ return retval;
}
void decrement_active_buffers(void *arg)
WARN("application died while putting subbuffer");
/* FIXME: probably need to skip the first subbuffer in finish_consuming_dead_subbuffer */
finish_consuming_dead_subbuffer(buf);
+ break;
}
else if(result == PUT_SUBBUF_OK) {
}