diff options
author | Joey Hess <joey@kitenet.net> | 2013-06-20 21:10:16 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2013-06-20 22:25:41 -0400 |
commit | 1a171303b442351cf2b63038776f856902cce1dd (patch) | |
tree | 57fa532de533d111a76b8808253869026aae348e /Utility | |
parent | a6914b4761bbedc27a7199a5c05466fdd0edb905 (diff) |
assistant: On Linux, the expensive transfer scan is run niced.
This is a compromise. I would like to nice every thread except for the
webapp thread, but it's not practical to do so. That would need every
thread to run as a bound thread, which could add significant overhead.
And any forkIO would escape the nice level.
Diffstat (limited to 'Utility')
-rw-r--r-- | Utility/Batch.hs | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/Utility/Batch.hs b/Utility/Batch.hs new file mode 100644 index 000000000..38b588b34 --- /dev/null +++ b/Utility/Batch.hs @@ -0,0 +1,40 @@ +{- 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 + +#if defined(__LINUX__) || defined(__ANDROID__) +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 +#if defined(__LINUX__) || defined(__ANDROID__) +batch a = wait =<< batchthread + where + batchthread = asyncBound $ do + setProcessPriority 0 maxNice + a +#else +batch a = a +#endif + +maxNice :: Int +maxNice = 19 |