2013-06-21 01:10:16 +00:00
|
|
|
{- Running a long or expensive batch operation niced.
|
|
|
|
-
|
|
|
|
- Copyright 2013 Joey Hess <joey@kitenet.net>
|
|
|
|
-
|
|
|
|
- Licensed under the GNU GPL version 3 or higher.
|
|
|
|
-}
|
|
|
|
|
|
|
|
{-# LANGUAGE CPP #-}
|
|
|
|
|
|
|
|
module Utility.Batch where
|
|
|
|
|
2013-06-21 17:09:09 +00:00
|
|
|
#if defined(linux_HOST_OS) || defined(__ANDROID__)
|
2013-06-21 01:10:16 +00:00
|
|
|
import Control.Concurrent.Async
|
|
|
|
import System.Posix.Process
|
|
|
|
#endif
|
|
|
|
|
|
|
|
{- Runs an operation, at batch priority.
|
|
|
|
-
|
|
|
|
- This is done by running it in a bound thread, which on Linux can be set
|
|
|
|
- to have a different nice level than the rest of the program. Note that
|
|
|
|
- due to running in a bound thread, some operations may be more expensive
|
|
|
|
- to perform. Also note that if the action calls forkIO or forkOS itself,
|
|
|
|
- that will make a new thread that does not have the batch priority.
|
|
|
|
-
|
|
|
|
- POSIX threads do not support separate nice levels, so on other operating
|
|
|
|
- systems, the action is simply ran.
|
|
|
|
-}
|
|
|
|
batch :: IO a -> IO a
|
2013-06-21 17:09:09 +00:00
|
|
|
#if defined(linux_HOST_OS) || defined(__ANDROID__)
|
2013-06-21 01:10:16 +00:00
|
|
|
batch a = wait =<< batchthread
|
|
|
|
where
|
|
|
|
batchthread = asyncBound $ do
|
|
|
|
setProcessPriority 0 maxNice
|
|
|
|
a
|
|
|
|
#else
|
|
|
|
batch a = a
|
|
|
|
#endif
|
|
|
|
|
|
|
|
maxNice :: Int
|
|
|
|
maxNice = 19
|