Compensate for pipeline buffering in upload presentation.
authorFredrik Tolf <fredrik@dolda2000.com>
Wed, 3 Dec 2008 22:44:02 +0000 (23:44 +0100)
committerFredrik Tolf <fredrik@dolda2000.com>
Wed, 3 Dec 2008 22:44:02 +0000 (23:44 +0100)
daemon/fnet-dc.c
daemon/net.h
daemon/transfer.c
daemon/transfer.h

index afd13b3..36ddb14 100644 (file)
@@ -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;
index be0156e..cad1ed0 100644 (file)
@@ -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
index 177353c..62e81d6 100644 (file)
@@ -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);
 }
index aa3e837..5a0bea1 100644 (file)
@@ -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;