diff options
author | Joey Hess <joey@kitenet.net> | 2012-08-29 16:30:40 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2012-08-29 16:30:40 -0400 |
commit | 8d32d54320d148e965f26d87d33694d7e8df5171 (patch) | |
tree | 1d50736fe9cbc3fd3b519d089cf152e90a5e6298 /Assistant/TransferQueue.hs | |
parent | c21a9fe04a8848641a8d838a24d77cafe9af68e8 (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.hs | 29 |
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) |