From 284e199aabf3b1149ec24f1aa16e9bed06ec7e91 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Wed, 3 Dec 2008 23:44:02 +0100 Subject: [PATCH] Compensate for pipeline buffering in upload presentation. --- daemon/fnet-dc.c | 3 +++ daemon/net.h | 1 + daemon/transfer.c | 13 +++++++++---- daemon/transfer.h | 2 +- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/daemon/fnet-dc.c b/daemon/fnet-dc.c index afd13b3..36ddb14 100644 --- a/daemon/fnet-dc.c +++ b/daemon/fnet-dc.c @@ -2762,6 +2762,7 @@ static void peerdetach(struct dcpeer *peer) { CBUNREG(peer->transfer, trans_filterout, peer); CBUNREG(peer->transfer, trans_destroy, peer); + peer->trpipe->pnext = NULL; closesock(peer->trpipe); quitsock(peer->trpipe); peer->trpipe = NULL; @@ -2828,6 +2829,7 @@ static void transwrite(struct socket *sk, struct dcpeer *peer) return; } dctransgotdata(peer->transfer, peer); + sockread(peer->trpipe); } static void trpiperead(struct socket *sk, struct dcpeer *peer) @@ -2854,6 +2856,7 @@ static struct socket *mktrpipe(struct dcpeer *peer) struct socket *sk; sk = netsockpipe(); + sk->pnext = peer->sk; sk->data = peer; sk->readcb = (void (*)(struct socket *, void *))trpiperead; sk->writecb = (void (*)(struct socket *, void *))trpipewrite; diff --git a/daemon/net.h b/daemon/net.h index be0156e..cad1ed0 100644 --- a/daemon/net.h +++ b/daemon/net.h @@ -114,5 +114,6 @@ int getucred(struct socket *sk, uid_t *uid, gid_t *gid); int sockfamily(struct socket *sk); void quitsock(struct socket *sk); void socksetdebug(struct socket *sk, int level, char *nm, ...); +void sockread(struct socket *sk); #endif diff --git a/daemon/transfer.c b/daemon/transfer.c index 177353c..62e81d6 100644 --- a/daemon/transfer.c +++ b/daemon/transfer.c @@ -130,16 +130,21 @@ static void localread(struct socket *sk, struct transfer *transfer) { void *buf; size_t blen; + off_t curpos; if((transfer->datapipe != NULL) && (sockqueueleft(transfer->datapipe) > 0)) { buf = sockgetinbuf(sk, &blen); - if((transfer->endpos >= 0) && (transfer->curpos + blen > transfer->endpos)) - blen = transfer->endpos - transfer->curpos; + if((transfer->endpos >= 0) && (transfer->localpos + blen > transfer->endpos)) + blen = transfer->endpos - transfer->localpos; sockqueue(transfer->datapipe, buf, blen); free(buf); time(&transfer->activity); - transfer->curpos += blen; + transfer->localpos += blen; bytesupload += blen; + } + curpos = transfer->localpos - socktqueuesize(transfer->datapipe); + if(curpos != transfer->curpos) { + transfer->curpos = curpos; CBCHAINDOCB(transfer, trans_p, transfer); } } @@ -306,7 +311,7 @@ static void transexpire(int cancelled, struct transfer *transfer) void transferprepul(struct transfer *transfer, off_t size, off_t start, off_t end, struct socket *lesk) { transfersetsize(transfer, size); - transfer->curpos = start; + transfer->curpos = transfer->localpos = start; transfer->endpos = end; transfersetlocalend(transfer, lesk); } diff --git a/daemon/transfer.h b/daemon/transfer.h index aa3e837..5a0bea1 100644 --- a/daemon/transfer.h +++ b/daemon/transfer.h @@ -62,7 +62,7 @@ struct transfer wchar_t *path; uid_t owner; int state, dir, error; - off_t size, curpos, endpos; + off_t size, curpos, endpos, localpos; struct fnetnode *fn; struct socket *localend, *datapipe; struct wcspair *args; -- 2.11.0