drmaa 0.2.0 → 0.3.0
raw patch · 5 files changed
+476/−344 lines, 5 filesdep +exceptionsdep −inline-c
Dependencies added: exceptions
Dependencies removed: inline-c
Files
- drmaa.cabal +8/−6
- src/DRMAA.c +0/−148
- src/DRMAA.hs +152/−190
- src/DRMAA/Bindings.chs +250/−0
- src/DRMAA/Types.hs +66/−0
drmaa.cabal view
@@ -1,12 +1,12 @@ name: drmaa-version: 0.2.0-synopsis: A minimal Haskell bindings to DRMAA C library.-description: A minimal Haskell bindings to DRMAA C library.+version: 0.3.0+synopsis: A Haskell bindings to the DRMAA C library.+description: A Haskell bindings to the DRMAA C library. license: BSD3 license-file: LICENSE author: Kai Zhang maintainer: kai@kzhang.org-copyright: (c) 2016-2017 Kai Zhang+copyright: (c) 2016-2018 Kai Zhang category: Language build-type: Simple extra-source-files: ChangeLog.md@@ -16,13 +16,15 @@ ghc-options: -Wall exposed-modules: DRMAA+ DRMAA.Types+ DRMAA.Bindings build-depends: base >=4.7 && <5.0- , inline-c , directory+ , exceptions hs-source-dirs: src- c-sources: src/DRMAA.c+ build-tools: c2hs >=0.25.0 extra-libraries: drmaa default-language: Haskell2010
− src/DRMAA.c
@@ -1,148 +0,0 @@--#include "stddef.h"--#include "stdio.h"--#include "drmaa.h"--int inline_c_DRMAA_0_54e600eaaa1f15b2d247a7799eeb2c2626774aa9(char * ptr_inline_c_0) {-- int errnum = 0;- errnum = drmaa_init (NULL, ptr_inline_c_0, DRMAA_ERROR_STRING_BUFFER);- if (errnum != DRMAA_ERRNO_SUCCESS) {- return 1;- }- return 0;- -}---int inline_c_DRMAA_1_df791815daa185d543e0513c42f96dbbd8b8b214() {-- char error[DRMAA_ERROR_STRING_BUFFER];- int errnum = 0;- errnum = drmaa_exit (error, DRMAA_ERROR_STRING_BUFFER);- if (errnum != DRMAA_ERRNO_SUCCESS) {- fprintf (stderr, "Could not shut down the DRMAA library: %s\n", error);- return 1;- }- return 0;- -}---int inline_c_DRMAA_2_f3edb2a436e7c708ac077181355a61d0a274be4a(char * wd_inline_c_0, const char ** envPtr_inline_c_1, char * native_inline_c_2, char * c_exec_inline_c_3, const char ** aptr_inline_c_4) {-- int exception = 0;- char error[DRMAA_ERROR_STRING_BUFFER];- int errnum = 0;- drmaa_job_template_t *jt = NULL;-- errnum = drmaa_allocate_job_template (&jt, error, DRMAA_ERROR_STRING_BUFFER);-- if (errnum != DRMAA_ERRNO_SUCCESS) {- fprintf (stderr, "Could not create job template: %s\n", error);- } else {- /* set options */- errnum = drmaa_set_attribute (jt, DRMAA_WD, wd_inline_c_0,- error, DRMAA_ERROR_STRING_BUFFER);- errnum = drmaa_set_vector_attribute (jt, DRMAA_V_ENV, envPtr_inline_c_1,- error, DRMAA_ERROR_STRING_BUFFER);- errnum = drmaa_set_attribute (jt, DRMAA_NATIVE_SPECIFICATION, native_inline_c_2,- error, DRMAA_ERROR_STRING_BUFFER);-- errnum = drmaa_set_attribute (jt, DRMAA_REMOTE_COMMAND, c_exec_inline_c_3,- error, DRMAA_ERROR_STRING_BUFFER);- if (errnum != DRMAA_ERRNO_SUCCESS) {- fprintf (stderr, "Could not set attribute \"%s\": %s\n",- DRMAA_REMOTE_COMMAND, error);- } else {- errnum = drmaa_set_vector_attribute (jt, DRMAA_V_ARGV, aptr_inline_c_4, error,- DRMAA_ERROR_STRING_BUFFER);- }-- if (errnum != DRMAA_ERRNO_SUCCESS) {- fprintf (stderr, "Could not set attribute \"%s\": %s\n",- DRMAA_REMOTE_COMMAND, error);- } else {- char jobid[DRMAA_JOBNAME_BUFFER];- char jobid_out[DRMAA_JOBNAME_BUFFER];- int status = 0;- drmaa_attr_values_t *rusage = NULL;-- errnum = drmaa_run_job (jobid, DRMAA_JOBNAME_BUFFER, jt, error,- DRMAA_ERROR_STRING_BUFFER);-- if (errnum != DRMAA_ERRNO_SUCCESS) {- fprintf (stderr, "Could not submit job: %s\n", error);- exception = 1;- } else {- printf ("Your job has been submitted with id %s\n", jobid);-- errnum = drmaa_wait (jobid, jobid_out, DRMAA_JOBNAME_BUFFER, &status,- DRMAA_TIMEOUT_WAIT_FOREVER, &rusage, error,- DRMAA_ERROR_STRING_BUFFER);-- if (errnum != DRMAA_ERRNO_SUCCESS) {- fprintf (stderr, "Could not wait for job: %s\n", error);- exception = 1;- } else {- char usage[DRMAA_ERROR_STRING_BUFFER];- int aborted = 0;-- drmaa_wifaborted(&aborted, status, NULL, 0);-- if (aborted == 1) {- printf("Job %s never ran\n", jobid);- exception = 1;- } else {- int exited = 0;-- drmaa_wifexited(&exited, status, NULL, 0);-- if (exited == 1) {- int exit_status = 0;-- drmaa_wexitstatus(&exit_status, status, NULL, 0);- printf("Job %s finished regularly with exit status %d\n", jobid, exit_status);- exception = exit_status;- } else {- int signaled = 0;-- drmaa_wifsignaled(&signaled, status, NULL, 0);-- if (signaled == 1) {- char termsig[DRMAA_SIGNAL_BUFFER+1];-- drmaa_wtermsig(termsig, DRMAA_SIGNAL_BUFFER, status, NULL, 0);- printf("Job %s finished due to signal %s\n", jobid, termsig);- } else {- printf("Job %s finished with unclear conditions\n", jobid);- }- } /* else */- } /* else */-- /*- printf ("Job Usage:\n");-- while (drmaa_get_next_attr_value (rusage, usage, DRMAA_ERROR_STRING_BUFFER) == DRMAA_ERRNO_SUCCESS) {- printf (" %s\n", usage);- }- */-- drmaa_release_attr_values (rusage);- } /* else */- } /* else */- } /* else */-- errnum = drmaa_delete_job_template (jt, error, DRMAA_ERROR_STRING_BUFFER);-- if (errnum != DRMAA_ERRNO_SUCCESS) {- fprintf (stderr, "Could not delete job template: %s\n", error);- }- } /* else */-- return exception;- -}-
src/DRMAA.hs view
@@ -1,215 +1,177 @@-{-# LANGUAGE QuasiQuotes #-}-{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE LambdaCase #-} module DRMAA ( withSession- , initSession- , exitSession- , DrmaaAttribute(..)- , defaultDrmaaConfig- , drmaaRun+ , JobAttributes(..)+ , JobId(..)+ , JobResult(..)+ , RUsage(..)+ , ExitStatus(..)+ , defaultJobAttributes+ , runAndWait+ , runJob+ , waitJob+ , version ) where -import Control.Exception (bracket_)-import Control.Monad (when)-import Foreign.C.String-import Foreign.Marshal.Alloc-import Foreign.Marshal.Array-import Foreign.Ptr-import qualified Language.C.Inline as C+import Control.Monad (when, unless)+import Control.Monad.Catch (MonadMask, bracket, bracket_)+import Control.Monad.IO.Class (liftIO, MonadIO) import System.Directory (getCurrentDirectory)-import Text.Printf (printf)--C.include "stddef.h"-C.include "stdio.h"-C.include "drmaa.h"+import Data.Maybe+import Data.List (break)+import Control.Arrow (second)+import Foreign+import Foreign.C.String -withSession :: IO a -> IO a-withSession = bracket_ initSession exitSession+import DRMAA.Bindings+import DRMAA.Types -{--drmaaScript :: String -> DrmaaAttribute -> IO ()-drmaaScript script config = bracket- (shelly $ fmap (T.unpack . head . T.lines) $ silently $ run "mktemp" [template])- (shelly . rm . fromText . T.pack)- $ \tmpFl -> do- writeFile tmpFl $ "#!/bin/sh\n" ++ script- shelly $ run_ "chmod" ["+x", T.pack tmpFl]- drmaaRun tmpFl [] config+withSession :: (MonadIO m, MonadMask m) => m a -> m a +withSession = bracket_ start quit where- template = T.pack $ drmaa_wd config ++ "/drmaa_script.XXXXXXXX.delete.me.sh"- -}---- | Initialize a session-initSession :: IO ()-initSession = alloca $ \ptr -> do- status <- [C.block| int {- int errnum = 0;- errnum = drmaa_init (NULL, $(char* ptr), DRMAA_ERROR_STRING_BUFFER);- if (errnum != DRMAA_ERRNO_SUCCESS) {- return 1;- }- return 0;- }|]- when (status /= 0) $ peekCString ptr >>= error-{-# INLINE initSession #-}--exitSession :: IO ()-exitSession = do- r <- [C.block| int {- char error[DRMAA_ERROR_STRING_BUFFER];- int errnum = 0;- errnum = drmaa_exit (error, DRMAA_ERROR_STRING_BUFFER);- if (errnum != DRMAA_ERRNO_SUCCESS) {- fprintf (stderr, "Could not shut down the DRMAA library: %s\n", error);- return 1;- }- return 0;- }|]- when (r /= 0) $ error "Exit 1"-{-# INLINE exitSession #-}--data DrmaaAttribute = DrmaaAttribute- { drmaa_wd :: !(Maybe FilePath)- , drmaa_env :: ![(String, String)]- , drmaa_native :: !String- } deriving (Show, Read)--defaultDrmaaConfig :: DrmaaAttribute-defaultDrmaaConfig = DrmaaAttribute- { drmaa_wd = Nothing- , drmaa_env = [ ("DRMAA_ENV_HAS_SET", "True") ]- , drmaa_native = ""- }--drmaaRun :: FilePath -> [String] -> DrmaaAttribute -> IO ()-drmaaRun exec args config = do- c_exec <- newCString exec- c_args <- mapM newCString args-- -- options- wd <- get_wd (drmaa_wd config) >>= newCString- env <- mapM (\(a,b) -> newCString $ a ++ "=" ++ b) $ drmaa_env config- native <- newCString $ drmaa_native config-- e <- withArray (c_args++[nullPtr]) $ \aptr ->- withArray (env ++ [nullPtr]) $ \envPtr -> do- [C.block| int {- int exception = 0;- char error[DRMAA_ERROR_STRING_BUFFER];- int errnum = 0;- drmaa_job_template_t *jt = NULL;-- errnum = drmaa_allocate_job_template (&jt, error, DRMAA_ERROR_STRING_BUFFER);-- if (errnum != DRMAA_ERRNO_SUCCESS) {- fprintf (stderr, "Could not create job template: %s\n", error);- } else {- /* set options */- errnum = drmaa_set_attribute (jt, DRMAA_WD, $(char* wd),- error, DRMAA_ERROR_STRING_BUFFER);- errnum = drmaa_set_vector_attribute (jt, DRMAA_V_ENV, $(const char** envPtr),- error, DRMAA_ERROR_STRING_BUFFER);- errnum = drmaa_set_attribute (jt, DRMAA_NATIVE_SPECIFICATION, $(char* native),- error, DRMAA_ERROR_STRING_BUFFER);-- errnum = drmaa_set_attribute (jt, DRMAA_REMOTE_COMMAND, $(char* c_exec),- error, DRMAA_ERROR_STRING_BUFFER);- if (errnum != DRMAA_ERRNO_SUCCESS) {- fprintf (stderr, "Could not set attribute \"%s\": %s\n",- DRMAA_REMOTE_COMMAND, error);- } else {- errnum = drmaa_set_vector_attribute (jt, DRMAA_V_ARGV, $(const char** aptr), error,- DRMAA_ERROR_STRING_BUFFER);- }-- if (errnum != DRMAA_ERRNO_SUCCESS) {- fprintf (stderr, "Could not set attribute \"%s\": %s\n",- DRMAA_REMOTE_COMMAND, error);- } else {- char jobid[DRMAA_JOBNAME_BUFFER];- char jobid_out[DRMAA_JOBNAME_BUFFER];- int status = 0;- drmaa_attr_values_t *rusage = NULL;-- errnum = drmaa_run_job (jobid, DRMAA_JOBNAME_BUFFER, jt, error,- DRMAA_ERROR_STRING_BUFFER);-- if (errnum != DRMAA_ERRNO_SUCCESS) {- fprintf (stderr, "Could not submit job: %s\n", error);- exception = 1;- } else {- printf ("Your job has been submitted with id %s\n", jobid);-- errnum = drmaa_wait (jobid, jobid_out, DRMAA_JOBNAME_BUFFER, &status,- DRMAA_TIMEOUT_WAIT_FOREVER, &rusage, error,- DRMAA_ERROR_STRING_BUFFER);-- if (errnum != DRMAA_ERRNO_SUCCESS) {- fprintf (stderr, "Could not wait for job: %s\n", error);- exception = 1;- } else {- char usage[DRMAA_ERROR_STRING_BUFFER];- int aborted = 0;-- drmaa_wifaborted(&aborted, status, NULL, 0);-- if (aborted == 1) {- printf("Job %s never ran\n", jobid);- exception = 1;- } else {- int exited = 0;+ start = liftIO $ allocaBytes 1000 $ \errMsg -> do+ exitCode <- drmaaInit nullPtr errMsg 1000+ unless (exitCode == 0) $ peekCString errMsg >>= error+ quit = liftIO $ allocaBytes 1000 $ \errMsg -> do+ exitCode <- drmaaExit errMsg 1000+ unless (exitCode == 0) $ peekCString errMsg >>= error - drmaa_wifexited(&exited, status, NULL, 0);+data JobAttributes = JobAttributes+ { _wd :: Maybe FilePath -- ^ specifies the directory name where the job will be executed.+ , _job_name :: String -- ^ A job name SHALL contain only alphanumeric and '_' characters.+ , _native_specification :: Maybe String+ , _env :: [(String, String)]+ } deriving (Show) - if (exited == 1) {- int exit_status = 0;+defaultJobAttributes :: JobAttributes+defaultJobAttributes = JobAttributes+ { _wd = Nothing+ , _job_name = "drmaa"+ , _native_specification = Nothing+ , _env = [] } - drmaa_wexitstatus(&exit_status, status, NULL, 0);- printf("Job %s finished regularly with exit status %d\n", jobid, exit_status);- exception = exit_status;- } else {- int signaled = 0;+setJobAttributes :: JobAttributes -> JobTemplate -> IO ()+setJobAttributes JobAttributes{..} jt = do+ setAttribute jt "drmaa_job_name" _job_name+ setAttribute jt "drmaa_wd" =<< get_wd _wd+ when (isJust _native_specification) $+ setAttribute jt "drmaa_native_specification" $ fromJust _native_specification+ unless (null _env) $+ setVectorAttribute jt "drmaa_v_env" $ map (\(a,b) -> a ++ "=" ++ b) _env+{-# INLINE setJobAttributes #-} - drmaa_wifsignaled(&signaled, status, NULL, 0);+setAttribute :: JobTemplate -> String -> String -> IO ()+setAttribute jt name value = allocaBytes 200 $ \errMsg -> do+ exitCode <- drmaaSetAttribute jt name value errMsg 200+ unless (exitCode == 0) $ peekCString errMsg >>= error+{-# INLINE setAttribute #-} - if (signaled == 1) {- char termsig[DRMAA_SIGNAL_BUFFER+1];+setVectorAttribute :: JobTemplate -> String -> [String] -> IO ()+setVectorAttribute jt name value = allocaBytes 200 $ \errMsg ->+ bracket (mapM newCString value) (mapM_ free) $ \strings ->+ withArray0 nullPtr strings $ \vec -> do+ exitCode <- drmaaSetVectorAttribute jt name vec errMsg 200+ unless (exitCode == 0) $ peekCString errMsg >>= error+{-# INLINE setVectorAttribute #-} - drmaa_wtermsig(termsig, DRMAA_SIGNAL_BUFFER, status, NULL, 0);- printf("Job %s finished due to signal %s\n", jobid, termsig);- } else {- printf("Job %s finished with unclear conditions\n", jobid);- }- } /* else */- } /* else */+withJobAttributes :: JobAttributes -> (JobTemplate -> IO a) -> IO a+withJobAttributes ja fun = allocaJobTemplate $ \jt -> do+ setJobAttributes ja jt+ fun jt+{-# INLINE withJobAttributes #-} - /*- printf ("Job Usage:\n");+newtype JobId = JobId { getJobId :: String } - while (drmaa_get_next_attr_value (rusage, usage, DRMAA_ERROR_STRING_BUFFER) == DRMAA_ERRNO_SUCCESS) {- printf (" %s\n", usage);- }- */+-- | Submit a job and wait for the result.+runAndWait :: FilePath -- ^ command+ -> [String] -- ^ arguments+ -> JobAttributes -- ^ attributes+ -> IO (JobResult, RUsage)+runAndWait cmd args ja = runJob cmd args ja >>= \case+ Left err -> error err+ Right jid -> waitJob jid - drmaa_release_attr_values (rusage);- } /* else */- } /* else */- } /* else */+-- | Submit a job. The thread won't block.+runJob :: FilePath -- ^ command+ -> [String] -- ^ arguments+ -> JobAttributes -- ^ attributes+ -> IO (Either String JobId)+runJob cmd args ja = withJobAttributes ja $ \jt -> allocaBytes 100 $ \jobId ->+ allocaBytes 200 $ \errMsg -> do+ setAttribute jt "drmaa_remote_command" cmd+ setVectorAttribute jt "drmaa_v_argv" args+ exitCode <- drmaaRunJob jobId 100 jt errMsg 200+ if exitCode == 0+ then Right . JobId <$> peekCString jobId+ else Left <$> peekCString errMsg+{-# INLINE runJob #-} - errnum = drmaa_delete_job_template (jt, error, DRMAA_ERROR_STRING_BUFFER);+data RUsage = RUsage [(String, String)] deriving (Show) - if (errnum != DRMAA_ERRNO_SUCCESS) {- fprintf (stderr, "Could not delete job template: %s\n", error);- }- } /* else */+-- | Wait for a job to finish.+waitJob :: JobId -> IO (JobResult, RUsage)+waitJob (JobId jid) = allocaBytes 100 $ \finished -> alloca $ \status ->+ alloca $ \attr -> allocaBytes 100 $ \errMsg -> do+ exitCode <- drmaaWait jid finished 100 status (-1) attr errMsg 100+ case getExitStatus exitCode of+ Success -> do+ result <- peek status >>= getJobResult+ usage <- consumeAttrValues =<< peek attr+ return (result, RUsage $ map (second tail . break (=='=')) usage)+ e -> error $ "Could not wait job: " ++ show e+ where+ getJobResult st = alloca $ \tmp -> do+ let aborted next = drmaaWifaborted tmp st nullPtr 0 >> peek tmp >>=+ (\x -> if x == 1 then return Aborted else next)+ exited next = drmaaWifexited tmp st nullPtr 0 >> peek tmp >>= ( \x ->+ if x == 1+ then drmaaWexitstatus tmp st nullPtr 0 >>+ peek tmp >>= return . Exit . getExitStatus+ else next )+ signaled next = drmaaWifsignaled tmp st nullPtr 0 >> peek tmp >>= ( \x ->+ if x == 1+ then allocaBytes 100 $ \buf ->+ drmaaWtermsig buf 100 st nullPtr 0 >>+ peekCString buf >>= return . Signaled+ else next )+ aborted $ exited $ signaled $ error "Job finished with unclear conditions"+{-# INLINE waitJob #-} - return exception;- }|]- when (e/=0) $ error $ printf- "Job failed (status=%d). Please see SGE log for details"- (fromIntegral e :: Int)+consumeAttrValues :: Ptr AttrValues -> IO [String]+consumeAttrValues ptr = allocaBytes 1024 $ \tmp -> do+ result <- loop tmp+ drmaaReleaseAttrValues ptr+ return result+ where+ loop tmp = do+ exitCode <- drmaaGetNextAttrValue ptr tmp 1024+ if (exitCode == 0)+ then do+ x <- peekCString tmp+ xs <- loop tmp+ return $ x : xs+ else return []+{-# INLINE consumeAttrValues #-} get_wd :: Maybe FilePath -> IO FilePath get_wd Nothing = getCurrentDirectory get_wd (Just x) = return x {-# INLINE get_wd #-}++version :: IO String+version = alloca $ \major -> alloca $ \minor -> allocaBytes 100 $ \impl ->+ allocaBytes 200 $ \errMsg -> do+ exitCode <- drmaaVersion major minor errMsg 200+ v <- if (exitCode == 0)+ then do+ x <- peek major+ y <- peek minor+ return $ show x ++"." ++ show y+ else error =<< peekCString errMsg++ exitCode' <- drmaaGetDRMAAImplementation impl 100 errMsg 200+ i <- if (exitCode' == 0)+ then peekCString impl+ else error =<< peekCString errMsg+ return $ "DRMAA v" ++ v ++ "; Implementation: " ++ i
+ src/DRMAA/Bindings.chs view
@@ -0,0 +1,250 @@+{-# LANGUAGE ForeignFunctionInterface #-}++module DRMAA.Bindings+ ( -- * Opaque data types+ JobTemplate+ , AttrValues++ -- * String Vector Helper Functions+ , drmaaGetNextAttrValue+ , drmaaGetNumAttrValues+ , drmaaReleaseAttrValues++ -- * Session management+ , drmaaInit+ , drmaaExit+++ -- * Job template+ , allocaJobTemplate+ , drmaaSetAttribute+ , drmaaSetVectorAttribute+ , drmaaGetAttribute++ -- * Job submission+ , drmaaRunJob++ -- * Job status and control+ , drmaaJobPs+ , drmaaWait+ , drmaaWifexited+ , drmaaWexitstatus+ , drmaaWifsignaled+ , drmaaWtermsig+ , drmaaWcoredump+ , drmaaWifaborted++ , drmaaVersion+ , drmaaGetDRMAAImplementation+ ) where++import Foreign+import Foreign.C.Types+import Foreign.C.String+import Control.Exception (bracket_)++#include "drmaa.h"++-------------------------------------------------------------------------------+-- Opaque Data Types+-------------------------------------------------------------------------------++newtype JobTemplate = JobTemplate (Ptr JobTemplate)++unJobTempate :: JobTemplate -> Ptr a+unJobTempate (JobTemplate ptr) = castPtr ptr++data AttrValues++-------------------------------------------------------------------------------+-- String Vector Helper Functions+-------------------------------------------------------------------------------++{#fun drmaa_get_next_attr_value as ^+ { castPtr `Ptr AttrValues'+ , `CString'+ , `CInt'+ } -> `CInt' #}++{#fun drmaa_get_num_attr_values as ^+ { castPtr `Ptr AttrValues'+ , castPtr `Ptr CULong'+ } -> `CInt' #}++{#fun drmaa_release_attr_values as ^+ { castPtr `Ptr AttrValues'+ } -> `()' #}+++-------------------------------------------------------------------------------+-- Session Management+-------------------------------------------------------------------------------++{#fun drmaa_init as ^+ { `CString' -- ^ A string indicating to which DRMS the DRMAA+ -- session should bind during initialization.+ , `CString' -- ^ A buffer into which error diagnosis information will be written.+ , `CInt' -- ^ The size in characters of the error diagnosis string buffer. + } -> `CInt' #}++{#fun drmaa_exit as ^+ { `CString' -- ^ A buffer into which error diagnosis information will be written.+ , `CInt' -- ^ The size in characters of the error diagnosis string buffer. + } -> `CInt' #}++-------------------------------------------------------------------------------+-- Job template+-------------------------------------------------------------------------------++allocaJobTemplate :: (JobTemplate -> IO a) -> IO a+allocaJobTemplate fun = alloca $ \jt_ptr -> bracket_+ (drmaaAllocateJobTemplate jt_ptr nullPtr 0)+ ( do p <- peek jt_ptr+ drmaaDeleteJobTemplate p nullPtr 0 )+ (peek jt_ptr >>= fun . JobTemplate . castPtr)++{#fun drmaa_allocate_job_template as ^+ { id `Ptr (Ptr ())', `CString', `CInt'+ } -> `CInt' #}++{#fun drmaa_delete_job_template as ^+ { id `Ptr ()', `CString', `CInt'+ } -> `CInt' #}++{#fun drmaa_set_attribute as ^+ { unJobTempate `JobTemplate' -- ^ The job template in which the+ -- attribute is to be set.+ , `String' -- ^ The name of the attribute to set.+ , `String' -- ^ The value to which to set the attribute.+ , `CString' -- ^ A buffer into which error diagnosis information will be written.+ , `CInt' -- ^ The size in characters of the error diagnosis string buffer. + } -> `CInt' #}++{#fun drmaa_get_attribute as ^+ { unJobTempate `JobTemplate' -- ^ The job template from which to get the+ -- attribute value.+ , `String' -- ^ The name of the attribute whose value will be retrieved.+ , `CString' -- ^ A buffer into which the attribute's value will be written.+ , `CInt' -- ^ The size in characters of the attribute value buffer.+ , `CString' -- ^ A buffer into which error diagnosis information will be written.+ , `CInt' -- ^ The size in characters of the error diagnosis string buffer.+ } -> `CInt' #}++{#fun drmaa_set_vector_attribute as ^+ { unJobTempate `JobTemplate' -- ^ The job template in which the+ -- attribute is to be set.+ , `String' -- ^ The name of the attribute to set.+ , id `Ptr CString' -- ^ The value array to which to set the attribute.+ , `CString' -- ^ A buffer into which error diagnosis information will be written.+ , `CInt' -- ^ The size in characters of the error diagnosis string buffer. + } -> `CInt' #}++{-+int drmaa_get_vector_attribute(drmaa_job_template_t *jt,+ const char *name,+ drmaa_attr_values_t **values,+ char *error_diagnosis,+ size_t error_diag_len);+int drmaa_get_attribute_names(drmaa_attr_names_t **values,+ char *error_diagnosis,+ size_t error_diag_len);+int drmaa_get_vector_attribute_names(drmaa_attr_names_t **values,+ char *error_diagnosis,+ size_t error_diag_len); + -}+++-------------------------------------------------------------------------------+-- Job Submission+-------------------------------------------------------------------------------++{#fun drmaa_run_job as ^+ { `CString' -- ^ A buffer into which the submitted+ -- job's job identifier will be written.+ , `CInt' -- ^ The size in characters of the job identifier buffer.+ , unJobTempate `JobTemplate' -- ^ The job template in which the+ -- attribute is to be set.+ , `CString' -- ^ A buffer into which error diagnosis information will be written.+ , `CInt' -- ^ The size in characters of the error diagnosis string buffer.+ } -> `CInt' #}+++-------------------------------------------------------------------------------+-- Job Status and Control+-------------------------------------------------------------------------------++{#fun drmaa_job_ps as ^+ { `String' -- ^ The job identifier of the job to be queried.+ , id `Ptr CInt' -- ^ Space to write the job's status information.+ , `CString' -- ^ A buffer into which error diagnosis information will be written.+ , `CInt' -- ^ The size in characters of the error diagnosis string buffer.+ } -> `CInt' #}++{#fun drmaa_wait as ^+ { `String' -- ^ The job identifier of the job for which to wait.+ , `CString' -- ^ A buffer into which the finished job identifier will be written.+ , `CULong' -- ^ The size in characters of the job identifier buffer.+ , id `Ptr CInt' -- ^ Space to write the status code of the finished job.+ , `CLong' -- ^ The number of seconds to remain blocked waiting for a result+ , castPtr `Ptr (Ptr AttrValues)' -- ^ Space to write the resouce usage information of the finished job.+ , `CString' -- ^ A buffer into which error diagnosis information will be written.+ , `CInt' -- ^ The size in characters of the error diagnosis string buffer.+ } -> `CInt' #}++{#fun drmaa_wifexited as ^+ { id `Ptr CInt' -- ^ Space to write whether the job has an exit status available.+ , `CInt'+ , `CString' -- ^ A buffer into which error diagnosis information will be written.+ , `CInt' -- ^ The size in characters of the error diagnosis string buffer.+ } -> `CInt' #}++{#fun drmaa_wexitstatus as ^+ { id `Ptr CInt' -- ^ Space to write job's exit status.+ , `CInt'+ , `CString' -- ^ A buffer into which error diagnosis information will be written.+ , `CInt' -- ^ The size in characters of the error diagnosis string buffer.+ } -> `CInt' #}++{#fun drmaa_wifsignaled as ^+ { id `Ptr CInt' -- ^ Space to write whether the job terminated on a signal.+ , `CInt'+ , `CString' -- ^ A buffer into which error diagnosis information will be written.+ , `CInt' -- ^ The size in characters of the error diagnosis string buffer.+ } -> `CInt' #}++{#fun drmaa_wtermsig as ^+ { `CString' -- ^ A buffer in which to write the name of the signal.+ , `CULong' -- ^ The size in characters of the signal buffer.+ , `CInt'+ , `CString' -- ^ A buffer into which error diagnosis information will be written.+ , `CInt' -- ^ The size in characters of the error diagnosis string buffer.+ } -> `CInt' #}++{#fun drmaa_wcoredump as ^+ { id `Ptr CInt' -- ^ Space in which to write whether the job produce a core image.+ , `CInt'+ , `CString' -- ^ A buffer into which error diagnosis information will be written.+ , `CInt' -- ^ The size in characters of the error diagnosis string buffer.+ } -> `CInt' #}++{#fun drmaa_wifaborted as ^+ { id `Ptr CInt' -- ^ Space in which to write whether the job aborted before running. + , `CInt'+ , `CString' -- ^ A buffer into which error diagnosis information will be written.+ , `CInt' -- ^ The size in characters of the error diagnosis string buffer.+ } -> `CInt' #}+++{#fun drmaa_version as ^+ { id `Ptr CUInt'+ , id `Ptr CUInt'+ , `CString' -- ^ A buffer into which error diagnosis information will be written.+ , `CInt' -- ^ The size in characters of the error diagnosis string buffer.+ } -> `CInt' #}++{#fun drmaa_get_DRMAA_implementation as ^+ { `CString'+ , `CInt'+ , `CString' -- ^ A buffer into which error diagnosis information will be written.+ , `CInt' -- ^ The size in characters of the error diagnosis string buffer.+ } -> `CInt' #}
+ src/DRMAA/Types.hs view
@@ -0,0 +1,66 @@+module DRMAA.Types+ ( ExitStatus(..)+ , JobResult(..)+ , getExitStatus+ ) where++import Foreign.C.Types++data JobResult = Exit ExitStatus+ | Aborted+ | Signaled String+ deriving (Show, Eq)++data ExitStatus = Success+ | InternalError+ | DrmCommunicationFailure+ | AuthFailure+ | InValidArgument+ | NoActiveSession+ | NoMemory+ | InvalidContactString+ | DefaultContactStringError+ | DrmsInitFailed+ | AlreadyActiveSession+ | DrmsExitError+ | InvalidAttribureFormat+ | InvalidAttribureValue+ | ConflictingAttributeValues+ | TryLater+ | DeniedByDrm+ | InvalidJob+ | ResumeInconsistentState+ | SuspendInconsistentState+ | HoldInconsistentState+ | ReleaseInconsistentState+ | ExitTimeout+ | NoRusage+ deriving (Show, Eq)++getExitStatus :: CInt -> ExitStatus+getExitStatus code = case code of+ 0 -> Success+ 1 -> InternalError+ 2 -> DrmCommunicationFailure+ 3 -> AuthFailure+ 4 -> InValidArgument+ 5 -> NoActiveSession+ 6 -> NoMemory+ 7 -> InvalidContactString+ 8 -> DefaultContactStringError+ 9 -> DrmsInitFailed+ 10 -> AlreadyActiveSession+ 11 -> DrmsExitError+ 12 -> InvalidAttribureFormat+ 13 -> InvalidAttribureValue+ 14 -> ConflictingAttributeValues+ 15 -> TryLater+ 16 -> DeniedByDrm+ 17 -> InvalidJob+ 18 -> ResumeInconsistentState+ 19 -> SuspendInconsistentState+ 20 -> HoldInconsistentState+ 21 -> ReleaseInconsistentState+ 22 -> ExitTimeout+ 23 -> NoRusage+ _ -> error "Unknown status code"