drmaa (empty) → 0.1.0.0
raw patch · 6 files changed
+434/−0 lines, 6 filesdep +asyncdep +basedep +binarysetup-changed
Dependencies added: async, base, binary, bytestring, inline-c, shelly, text
Files
- ChangeLog.md +5/−0
- LICENSE +30/−0
- Setup.hs +2/−0
- drmaa.cabal +37/−0
- src/DRMAA.c +146/−0
- src/DRMAA.hs +214/−0
+ ChangeLog.md view
@@ -0,0 +1,5 @@+# Revision history for drmaa++## 0.1.0.0 -- YYYY-mm-dd++* First version. Released on an unsuspecting world.
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c) 2015, Kai Zhang++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution.++ * Neither the name of Kai Zhang nor the names of other+ contributors may be used to endorse or promote products derived+ from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ drmaa.cabal view
@@ -0,0 +1,37 @@+-- Initial drmaa.cabal generated by cabal init. For further documentation,+-- see http://haskell.org/cabal/users-guide/++name: drmaa+version: 0.1.0.0+synopsis: A simple Haskell bindings to DRMAA C library.+description: A simple Haskell bindings to DRMAA C library.+license: BSD3+license-file: LICENSE+author: Kai Zhang+maintainer: kai@kzhang.org+-- copyright:+category: Language+build-type: Simple+extra-source-files: ChangeLog.md+cabal-version: >=1.10++library+ ghc-options: -Wall+ exposed-modules:+ DRMAA++ -- other-modules:+ -- other-extensions:+ build-depends:+ base >=4.7 && <5.0+ , bytestring+ , binary+ , async+ , inline-c+ , text+ , shelly++ hs-source-dirs: src+ c-sources: src/DRMAA.c+ extra-libraries: drmaa+ default-language: Haskell2010
+ src/DRMAA.c view
@@ -0,0 +1,146 @@++#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_8569c20fd54d45f727dd1560458a1febedbc42e1(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
@@ -0,0 +1,214 @@+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE QuasiQuotes #-}+{-# LANGUAGE TemplateHaskell #-}+module DRMAA where++import Control.Exception (bracket_, bracket)+import qualified Data.Text as T+import Shelly hiding (FilePath, withTmpDir)++import Foreign.C.String+import Foreign.Marshal.Alloc+import Foreign.Marshal.Array+import Foreign.Ptr+import qualified Language.C.Inline as C++C.include "stddef.h"+C.include "stdio.h"+C.include "drmaa.h"++withTmpFile :: FilePath -> (FilePath -> IO a) -> IO a+withTmpFile dir = bracket create delete+ where+ create = shelly $ fmap (T.unpack . head . T.lines) $ silently $+ run "mktemp" [T.pack $ dir ++ "/tmp_file_XXXXXXXX_delete.me"]+ delete = shelly . rm_f . fromText . T.pack++withTmpDir :: FilePath -> (FilePath -> IO a) -> IO a+withTmpDir dir = bracket create delete+ where+ create = shelly $ fmap (T.unpack . head . T.lines) $ silently $+ run "mktemp" ["-d", T.pack $ dir ++ "/tmp_dir_XXXXXXXX_delete.me"]+ delete = shelly . rm_rf . fromText . T.pack++withSGESession :: IO a -> IO a+withSGESession f = bracket_ drmaaInit drmaaExit f++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+ where+ template = T.pack $ drmaa_wd config ++ "/drmaa_script.XXXXXXXX.delete.me.sh"++-- | Initialize a session+drmaaInit :: IO ()+drmaaInit = 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;+ }|]+ case status of+ 0 -> putStrLn "DRMAA session started"+ _ -> peekCString ptr >>= error++drmaaExit :: IO ()+drmaaExit = 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;+ }|]+ case r of+ 0 -> putStrLn "DRMAA session closed"+ _ -> error "Exit 1"++data DrmaaAttribute = DrmaaAttribute+ { drmaa_wd :: !FilePath+ , drmaa_env :: ![(String, String)]+ , drmaa_native :: !String+ } deriving (Show, Read)++defaultDrmaaConfig :: DrmaaAttribute+defaultDrmaaConfig = DrmaaAttribute+ { drmaa_wd = "./"+ , 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 <- newCString $ drmaa_wd config+ 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;++ 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;+ }|]+ if e /= 0 then error ("status=" ++ show e) else return ()