From 049c6cf300d451d058e1465f44fa1b1311988ac8 Mon Sep 17 00:00:00 2001 From: tv Date: Sat, 1 Nov 2014 20:23:49 +0100 Subject: initial commit --- CGroup.hs | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 CGroup.hs (limited to 'CGroup.hs') diff --git a/CGroup.hs b/CGroup.hs new file mode 100644 index 0000000..399ec84 --- /dev/null +++ b/CGroup.hs @@ -0,0 +1,53 @@ +-- | +-- Module: CGroup +-- Copyright: (c) 2014 Tomislav Viljetić +-- License: BSD3 +-- Maintainer: Tomislav Viljetić +-- +-- 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" -- cgit v1.2.3