blob: 399ec840536615badaf3f7b7fe9e928a404a838f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
-- |
-- Module: CGroup
-- Copyright: (c) 2014 Tomislav Viljetić
-- License: BSD3
-- Maintainer: Tomislav Viljetić <tomislav@viljetic.de>
--
-- Basic cgroup virtual filesystem operations.
--
module CGroup
( module CGroup.Types
, createCGroup
, classifyTask
, listTasks
) where
import CGroup.Types
import Control.Applicative
import Data.Attoparsec.ByteString.Char8
import Data.Set (Set)
import qualified Data.Set as Set
import System.Directory (createDirectory)
import System.FilePath ((</>))
import System.IO.Streams.Attoparsec (parseFromStream)
import System.IO.Streams.File (withFileAsInput)
-- | @'createCGroup' g@ creates a new cgroup @g@.
createCGroup :: CGroup -> IO ()
createCGroup =
createDirectory . cgroupPath
-- | @'classifyTask' g pid@ places task @pid@ into cgroup @g@.
classifyTask :: ProcessID -> CGroup -> IO ()
classifyTask pid g =
writeFile (tasksFile g) (show pid)
-- | @'listTasks' g@ returns tasks of cgroup @g@.
listTasks :: CGroup -> IO (Set ProcessID)
listTasks g =
withFileAsInput (tasksFile g) $ parseFromStream tasksParser
tasksFile :: CGroup -> FilePath
tasksFile =
(</> "tasks") . cgroupPath
tasksParser :: Parser (Set ProcessID)
tasksParser =
Set.fromList <$> many' (decimal <* endOfLine) <* endOfInput <?> "tasks"
|