aboutsummaryrefslogtreecommitdiff
path: root/Assistant/TransferQueue.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2012-08-29 16:30:40 -0400
committerGravatar Joey Hess <joey@kitenet.net>2012-08-29 16:30:40 -0400
commit8d32d54320d148e965f26d87d33694d7e8df5171 (patch)
tree1d50736fe9cbc3fd3b519d089cf152e90a5e6298 /Assistant/TransferQueue.hs
parentc21a9fe04a8848641a8d838a24d77cafe9af68e8 (diff)
make start button work on queued transfers
When multiple downloads of a key are queued, it starts the first, but leaves the other downloads in the queue. This ensures that we don't lose a queued download if the one that got started failed.
Diffstat (limited to 'Assistant/TransferQueue.hs')
-rw-r--r--Assistant/TransferQueue.hs29
1 files changed, 21 insertions, 8 deletions
diff --git a/Assistant/TransferQueue.hs b/Assistant/TransferQueue.hs
index ff202d11a..7d13406a6 100644
--- a/Assistant/TransferQueue.hs
+++ b/Assistant/TransferQueue.hs
@@ -15,6 +15,7 @@ module Assistant.TransferQueue (
queueTransferAt,
queueTransferWhenSmall,
getNextTransfer,
+ getMatchingTransfers,
dequeueTransfers,
) where
@@ -140,20 +141,32 @@ getNextTransfer q dstatus acceptable = atomically $ do
return $ Just r
else return Nothing
+{- Moves transfers matching a condition from the queue, to the
+ - currentTransfers map. -}
+getMatchingTransfers :: TransferQueue -> DaemonStatusHandle -> (Transfer -> Bool) -> IO [(Transfer, TransferInfo)]
+getMatchingTransfers q dstatus c = atomically $ do
+ ts <- dequeueTransfersSTM q c
+ unless (null ts) $
+ adjustTransfersSTM dstatus $ \m -> M.union m $ M.fromList ts
+ return ts
+
{- Removes transfers matching a condition from the queue, and returns the
- removed transfers. -}
dequeueTransfers :: TransferQueue -> DaemonStatusHandle -> (Transfer -> Bool) -> IO [(Transfer, TransferInfo)]
dequeueTransfers q dstatus c = do
- removed <- atomically $ do
- (removed, ls) <- partition (c . fst)
- <$> readTVar (queuelist q)
- void $ writeTVar (queuesize q) (length ls)
- void $ writeTVar (queuelist q) ls
- drain
- forM_ ls $ unGetTChan (queue q)
- return removed
+ removed <- atomically $ dequeueTransfersSTM q c
unless (null removed) $
notifyTransfer dstatus
return removed
+
+dequeueTransfersSTM :: TransferQueue -> (Transfer -> Bool) -> STM [(Transfer, TransferInfo)]
+dequeueTransfersSTM q c = do
+ (removed, ts) <- partition (c . fst)
+ <$> readTVar (queuelist q)
+ void $ writeTVar (queuesize q) (length ts)
+ void $ writeTVar (queuelist q) ts
+ drain
+ forM_ ts $ unGetTChan (queue q)
+ return removed
where
drain = maybe noop (const drain) =<< tryReadTChan (queue q)