packages feed

jobqueue 0.1.3 → 0.1.4

raw patch · 3 files changed

+67/−2 lines, 3 filesdep +regex-posix

Dependencies added: regex-posix

Files

jobqueue.cabal view
@@ -1,14 +1,16 @@ Name:           jobqueue-Version:        0.1.3+Version:        0.1.4 Synopsis:       A job queue library License:        MIT License-File:   LICENSE Author:         Kiyoshi Ikehara Maintainer:     kiyoshi.ikehara at gree.net+Stability:      experimental Copyright:      GREE, Inc. Build-Type:     Simple Category:       Network, Client Cabal-Version:  >=1.8+Homepage:       https://github.com/gree/haskell-jobqueue Description:   Haskell JobQueue is a library used for building a job scheduler with priority queues.   The state of jobs is stored in a backend database such as Apache Zookeeper or other @@ -43,6 +45,7 @@                  , monad-control                  , transformers-base                  , lifted-base+                 , regex-posix   Hs-source-dirs:  src   Exposed-modules: Network.JobQueue                  , Network.JobQueue.Class@@ -59,6 +62,7 @@                  , Network.JobQueue.Backend.Zookeeper                  , Network.JobQueue.Backend.Sqlite3                  , Network.JobQueue.Logger+                 , Network.JobQueue.Util   Other-modules:   Network.JobQueue.Backend.Zookeeper.ZookeeperQueue   Extensions:      DeriveDataTypeable 
src/Network/JobQueue/Logger.hs view
@@ -17,9 +17,23 @@ import qualified Control.Monad.Logger as ML import Language.Haskell.TH.Syntax (Q, Exp, qLocation) import Data.Text.Format+import Control.Applicative+import Control.Monad.Reader +import Network.JobQueue.Types+import Network.JobQueue.Class+ logTH :: ML.LogLevel -> Q Exp-logTH level = [|\a b -> ML.monadLoggerLog $(qLocation >>= ML.liftLoc) (T.pack "") level (LT.toStrict $ format (a :: Format) b)|]+logTH level = +  [|\a b -> do+    ju <- getJobUnit <$> ask+    ML.monadLoggerLog $(qLocation >>= ML.liftLoc) (T.pack "") level $ T.concat+      [ (LT.toStrict $ format (a :: Format) b)+      , " ("+      , T.pack $ desc ju+      , ")"+      ]+  |]  logDebug :: Q Exp logDebug = logTH ML.LevelDebug
+ src/Network/JobQueue/Util.hs view
@@ -0,0 +1,47 @@+-- Copyright (c) Gree, Inc. 2013+-- License: MIT-style++module Network.JobQueue.Util+  ( waitForAllJobs+  , waitUntilMatch+  ) where++import Data.Maybe+import Control.Concurrent+import Network.JobQueue.Types+import Network.JobQueue.Class+import Network.JobQueue.Job+import Network.JobQueue.JobQueue+import Network.JobQueue.JobQueue.Internal+import Text.Regex.Posix++waitForAllJobs :: (Env e, Unit a) => JobQueue e a -> Int -> ((Maybe (Job a)) -> Int -> IO ()) -> IO (Maybe (Job a))+waitForAllJobs jq timeoutCount = waitWhile jq (\mjob count -> isJust mjob && count < timeoutCount)++waitUntilMatch :: (Env e, Unit a) => JobQueue e a -> String -> Int -> ((Maybe (Job a)) -> Int -> IO ()) -> IO (Maybe (Job a))+waitUntilMatch jq pattern timeoutCount = waitWhile jq (\mjob count -> not (show mjob =~ pattern) && count < timeoutCount)++waitWhile :: (Env e, Unit a)+             => JobQueue e a+             -> (Maybe (Job a) -> Int -> Bool)+             -> (Maybe (Job a) -> Int -> IO ())+             -> IO (Maybe (Job a))+waitWhile jq cond reportAct = loop 0+  where+    loop count = do+      mjob <- liftIO $ peekJob jq+      reportAct mjob count+      if cond mjob count+        then do+          mjob' <- innerloop jq mjob cond+          if mjob' == mjob then return mjob else loop (count + 1)+        else do+          return mjob+    +    innerloop :: (Env e, Unit a) => JobQueue e a -> Maybe (Job a) -> (Maybe (Job a) -> Int -> Bool) -> IO (Maybe (Job a))+    innerloop jq mjob0 cond = loop 0+      where+        loop tickCount = do+          threadDelay 250000+          mjob <- liftIO $ peekJob jq+          if mjob0 == mjob && cond mjob tickCount then loop (tickCount + 1) else return mjob