[prev in list] [next in list] [prev in thread] [next in thread] 

List:       grid-engine-cvs
Subject:    CVS update: ADDED:  www/howto drmaa_java.html
From:       templedf () sunsource ! net
Date:       2004-06-16 8:25:18
Message-ID: 20040616082518.24900.qmail () s005 ! sfo ! collab ! net
[Download RAW message or body]

  User: templedf
  Date: 04/06/16 01:25:17

  Added:       www/howto drmaa_java.html
               doc      README-DRMAA-JAVA.txt
  Log:
  DT-2004-06-15-0:
    o Fixed minor bugs in DRMAA Java binding
    o Fixed bad link in DRMAA howto
    o Added Java binding README and started howto
  
  Revision  Changes    Path
  1.2093    +5 -0      gridengine/Changelog
  
  http://gridengine.sunsource.net/source/browse/gridengine/Changelog.diff?r1=1.2092&r2=1.2093
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: Changelog
  ===================================================================
  RCS file: /cvs/gridengine/Changelog,v
  retrieving revision 1.2092
  retrieving revision 1.2093
  diff -u -b -r1.2092 -r1.2093
  --- Changelog	2004/06/14 10:04:11	1.2092
  +++ Changelog	2004/06/16 08:25:14	1.2093
  @@ -1,3 +1,8 @@
  +DT-2004-06-15-0: Bugfix:    o Fixed minor bugs in DRMAA Java binding
  +                            o Fixed bad link in DRMAA howto
  +                 Enhancem.: o Added Java binding README and started howto
  +                 Changed:   DRMAA, howtos
  +
   JG-2004-06-14-0: QA:        Updated review template and doc.
                    Cleanup:   Removed unused I18N messages.
                    Testsuite: Make checks performance/throughput and 
  
  
  
  1.8       +1 -1      gridengine/www/howto/drmaa.html
  
  http://gridengine.sunsource.net/source/browse/gridengine/www/howto/drmaa.html.diff?r1=1.7&r2=1.8
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: drmaa.html
  ===================================================================
  RCS file: /cvs/gridengine/www/howto/drmaa.html,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -b -r1.7 -r1.8
  --- drmaa.html	2004/05/28 14:48:02	1.7
  +++ drmaa.html	2004/06/16 08:25:16	1.8
  @@ -25,7 +25,7 @@
            </A>
         </LI>
         <LI>
  -         <A HREF="http://gridengine.sunsource.net/unbranded-source/browse/~checkout~/gridengine/source/libs/japi/README.drmaa">
  +         <A HREF="http://gridengine.sunsource.net/unbranded-source/browse/~checkout~/gridengine/docs/README-DRMAA.txt">
  The Grid Engine 6.0 DRMAA README
            </A>
         </LI>
  
  
  
  1.1                  gridengine/www/howto/drmaa_java.html
  
  http://gridengine.sunsource.net/source/browse/gridengine/www/howto/drmaa_java.html?rev=1.1&content-type=text/x-cvsweb-markup
  
  Index: drmaa_java.html
  ===================================================================
  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  
  <HTML>
     <HEAD>
        <TITLE>Developing Applications with the DRMAA Java<SUP>TM</SUP> Language \
Binding</TITLE>  </HEAD>
     <BODY>
     <H1>
        <FONT COLOR="#336699">
           Distributed Resource Management Application API
        </FONT>
     </H1>
  
     <P STYLE="margin-bottom: 0cm">
        This guide is a tutorial for getting started programming with the DRMAA
        Java binding.  It assumes that you already know what DRMAA is and know how
        the DRMAA Java binding is supported in the Grid Engine 6.0 release.  If
        you do not already know these things, try these web sites:
     </P>
  
     <UL>
        <LI>
           <A HREF="http://www.drmaa.org">
              The DRMAA Website
           </A>
        </LI>
        <LI>
           <A HREF="http://gridengine.sunsource.net/unbranded-source/browse/~checkout~/gridengine/source/libs/japi/README-DRMAA-JAVA.txt">
  The Grid Engine 6.0 DRMAA Java language README
           </A>
        </LI>
        <LI>
           <A HREF="http://gridengine.sunsource.net/unbranded-source/browse/~checkout~/gridengine/source/libs/japi/README-DRMAA.txt">
  The Grid Engine 6.0 DRMAA C binding README
           </A>
        </LI>
        <LI>
           <A HREF="http://gridengine.sunsource.net/unbranded-source/browse/%7Echeckout%7E/gridengine/source/libs/japi/drmaa.html?content-type=text/html">
  The Grid Engine libdrmaa docs
           </A>
        </LI>
        <LI>
           <A HREF="http://gridengine.sunsource.net/unbranded-source/browse/%7Echeckout%7E/gridengine/source/libs/japi/japi.html?content-type=text/html">
  The Grid Engine libjapi docs
           </A>
        </LI>
     </UL>
  
     <P STYLE="margin-bottom: 0cm">
        Note that the example programs in this howto can be found in the CVS
        <A HREF="http://gridengine.sunsource.net/unbranded-source/browse/~checkout~/gridengine/source/classes/howto">source \
tree</A>.  </P>
  
     <H2>
        <FONT COLOR="#336699">
           Starting and Stopping a Session
        </FONT>
     </H2>
  
     <P STYLE="margin-bottom: 0cm">
        The following code segment shows the most basic DRMAA Java language
        binding program:
     </P>
  
     <H3>Example 1</H3>
  
  <PRE>01: #include <stdio.h>
  02: #include "drmaa.h"
  03: 
  04: int main (int argc, char **argv) {
  05:    char error[DRMAA_ERROR_STRING_BUFFER];
  06:    int errnum = 0;
  07: 
  08:    errnum = drmaa_init (NULL, error, DRMAA_ERROR_STRING_BUFFER);
  09: 
  10:    if (errnum != DRMAA_ERRNO_SUCCESS) {
  11:       fprintf (stderr, "Could not initialize the DRMAA library: %s\n", error);
  12:       return 1;
  13:    }
  14: 
  15:    printf ("DRMAA library was started successfully\n");
  16:    
  17:    errnum = drmaa_exit (error, DRMAA_ERROR_STRING_BUFFER);
  18: 
  19:    if (errnum != DRMAA_ERRNO_SUCCESS) {
  20:       fprintf (stderr, "Could not shut down the DRMAA library: %s\n", error);
  21:       return 1;
  22:    }
  23: 
  24:    return 0;
  25: }</PRE>
  
     <P STYLE="margin-bottom: 0cm">
        The first thing to notice is that every call to a DRMAA function will
        return an error code.  If everything goes well, that code will be
        <CODE>DRMAA_ERRNO_SUCCESS</CODE>.  If things don't go so well, an
        appropriate error code will be returned.  Every DRMAA function also takes
        at least two parameters.  These two parameters are a string to populate
        with a error message in case of an error and an integer representing the
        maximum length of the error string.
     </P>
  
     <P STYLE="margin-bottom: 0cm">
        Now let's look at the functions being called.  First, on line 8, we call
        drmaa_init().  This function sets up the DRMAA session and must be called
        before most other DRMAA functions.  Some functions, like
        drmaa_get_contact(), can be called before drmaa_init(), but these
        functions only provide general information.  Any function that does work,
        such as drmaa_run_job() or drmaa_wait() must be called after drmaa_init()
        returns.  If such a function is called before drmaa_init() returns, it
        will return the error code <CODE>DRMAA_ERRNO_NO_ACTIVE_SESSION</CODE>.
     </P>
  
     <P STYLE="margin-bottom: 0cm">
        dmraa_init() creates a session and starts an event client listener thread.
        The session is used for organizing jobs submitted through DRMAA, and the
        thread is used to receive updates from the queue master about the state
        of jobs and the system in general.  Once drmaa_init() has been called
        successfully, it is the responsibility of the calling application to also
        call drmaa_exit() before terminating.  If an application does not call
        drmaa_exit() before terminating, session state may be left behind in the
        user's home directory (under .sge/drmaa), and the queue master may be left
        with a dead event client handle, which can decrease queue master
        performance.
     </P>
  
     <P STYLE="margin-bottom: 0cm">
        At the end of our program, on line 17, we call drmaa_exit().  drmaa_exit()
        cleans up the session and stops the event client listener thread.  Most
        other DRMAA functions must be called before drmaa_exit().  Some functions,
        like drmaa_get_contact(), can be called after drmaa_exit(), but these
        functions only provide general information.  Any function that does work,
        such as drmaa_run_job() or drmaa_wait() must be called before drmaa_exit()
        is called.  If such a function is called after drmaa_exit() is called, it
        will return the error code <CODE>DRMAA_ERRNO_NO_ACTIVE_SESSION</CODE>.
     </P>
  
     <H2>
        <FONT COLOR="#336699">
           Running a Job
        </FONT>
     </H2>
  
     <P STYLE="margin-bottom: 0cm">
        The following code segment shows how to use the DRMAA C binding to submit
        a job to Grid Engine:
     </P>
  
     <H3>Example 2</H3>
  
  <PRE>01: #include <stdio.h>
  02: #include "drmaa.h"
  03: 
  04: int main (int argc, char **argv) {
  05:    char error[DRMAA_ERROR_STRING_BUFFER];
  06:    int errnum = 0;
  07:    drmaa_job_template_t *jt = NULL;
  08: 
  09:    errnum = drmaa_init (NULL, error, DRMAA_ERROR_STRING_BUFFER);
  10: 
  11:    if (errnum != DRMAA_ERRNO_SUCCESS) {
  12:       fprintf (stderr, "Could not initialize the DRMAA library: %s\n", error);
  13:       return 1;
  14:    }
  15: 
  16:    errnum = drmaa_allocate_job_template (&jt, error, \
DRMAA_ERROR_STRING_BUFFER);  17: 
  18:    if (errnum != DRMAA_ERRNO_SUCCESS) {
  19:       fprintf (stderr, "Could not create job template: %s\n", error);
  20:    }
  21:    else {
  22:       errnum = drmaa_set_attribute (jt, DRMAA_REMOTE_COMMAND, "sleeper.sh",
  23:                                     error, DRMAA_ERROR_STRING_BUFFER);
  24: 
  25:       if (errnum != DRMAA_ERRNO_SUCCESS) {
  26:          fprintf (stderr, "Could not set attribute \"%s\": %s\n",
  27:                   DRMAA_REMOTE_COMMAND, error);
  28:       }
  29:       else {
  30:          const char *args[2] = {"5", NULL};
  31:          
  32:          errnum = drmaa_set_vector_attribute (jt, DRMAA_V_ARGV, args, error,
  33:                                               DRMAA_ERROR_STRING_BUFFER);
  34:       }
  35:       
  36:       if (errnum != DRMAA_ERRNO_SUCCESS) {
  37:          fprintf (stderr, "Could not set attribute \"%s\": %s\n",
  38:                   DRMAA_REMOTE_COMMAND, error);
  39:       }
  40:       else {
  41:          char jobid[DRMAA_JOBNAME_BUFFER];
  42: 
  43:          errnum = drmaa_run_job (jobid, DRMAA_JOBNAME_BUFFER, jt, error,
  44:                                  DRMAA_ERROR_STRING_BUFFER);
  45: 
  46:          if (errnum != DRMAA_ERRNO_SUCCESS) {
  47:             fprintf (stderr, "Could not submit job: %s\n", error);
  48:          }
  49:          else {
  50:             printf ("Your job has been submitted with id %s\n", jobid);
  51:          }
  52:       } /* else */
  53: 
  54:       errnum = drmaa_delete_job_template (jt, error, \
DRMAA_ERROR_STRING_BUFFER);  55: 
  56:       if (errnum != DRMAA_ERRNO_SUCCESS) {
  57:          fprintf (stderr, "Could not delete job template: %s\n", error);
  58:       }
  59:    } /* else */
  60: 
  61:    errnum = drmaa_exit (error, DRMAA_ERROR_STRING_BUFFER);
  62: 
  63:    if (errnum != DRMAA_ERRNO_SUCCESS) {
  64:       fprintf (stderr, "Could not shut down the DRMAA library: %s\n", error);
  65:       return 1;
  66:    }
  67: 
  68:    return 0;
  69: }</PRE>
  
     <P STYLE="margin-bottom: 0cm">
        The beginning and end of this program are the same as the previous one.
        What's different is in lines 16-59.  On line 16 we ask DRMAA to allocate a
        job template for us.  A job template is a structure used to store
        information about a job to be submitted.  The same template can be reused
        for multiple calls to drmaa_run_job() or drmaa_run_bulk_job().
     </P>
  
     <P STYLE="margin-bottom: 0cm">
        On line 22 we set the <CODE>DRMAA_REMOTE_COMMAND</CODE> attribute.  This
        attribute tells DRMAA where to find the program we want to run.  Its value
        is the path to the executable.  The path be be either relative or
        absolute.  If relative, it is relative to the <CODE>DRMAA_WD</CODE>
        attribute, which if not set defaults to the user's home directory.  For
        more information on DRMAA attributes, please see the
        <A HREF="http://gridengine.sunsource.net/unbranded-source/browse/~checkout~/gridengine/doc/htmlman/htmlman3/drmaa_attributes.html">drmaa_attributes</A>
  man page.  Note that for this program to work, the script
        &quot;sleeper.sh&quot; must be in your default path, i.e. the path set by
        your shell script when you log in.
     </P>
  
     <P STYLE="margin-bottom: 0cm">
        On line 32 we set the <CODE>DRMAA_V_ARGV</CODE> attribute.  This
        attribute tells DRMAA what arguments to pass to the executable.  For
        more information on DRMAA attributes, please see the
        <A HREF="http://gridengine.sunsource.net/unbranded-source/browse/~checkout~/gridengine/doc/htmlman/htmlman3/drmaa_attributes.html">drmaa_attributes</A>
  man page.
     </P>
  
     <P STYLE="margin-bottom: 0cm">
        On line 43 we submit the job with drmaa_run_job().  DRMAA will place the
        id assigned to the job into the character array we passed to
        drmaa_run_job().  The job is now running as though submitted by qsub.  At
        this point calling drmaa_exit() and/or terminating the program will have
        no effect on the job.
     </P>
  
     <P STYLE="margin-bottom: 0cm">
        To clean things up, we delete the job template on line 54.  This frees the
        memory DRMAA set aside for the job template, but has no effect on
        submitted jobs.
     </P>
  
     <P STYLE="margin-bottom: 0cm">
        Finally, on line 61, we call drmaa_exit().  The call to drmaa_exit() is
        outside of the if structure started on line 18 because regardless of
        whether the other commands succeed, once we've called drmaa_init(), we are
        obligated to call drmaa_exit() before terminating.
     </P>
  
     <P STYLE="margin-bottom: 0cm">
        If instead of a single job we had wanted to submit an array job, we could
        have replaced the else on lines 40-52 with the following:
     </P>
     
     <H3>Example 2.1</H3>
  
  <PRE>40:       else {
  41:          drmaa_job_ids_t *ids = NULL;
  42: 
  43:          errnum = drmaa_run_bulk_jobs (&ids, jt, 1, 30, 2, error, \
DRMAA_ERROR_STRING_BUFFER);  44: 
  45:          if (errnum != DRMAA_ERRNO_SUCCESS) {
  46:             fprintf (stderr, "Could not submit job: %s\n", error);
  47:          }
  48:          else {
  49:             char jobid[DRMAA_JOBNAME_BUFFER];
  50: 
  51:             while (drmaa_get_next_job_id (ids, jobid, DRMAA_JOBNAME_BUFFER) == \
DRMAA_ERRNO_SUCCESS) {  52:                printf ("A job task has been submitted \
with id %s\n", jobid);  53:             }
  54:          }
  55: 
  56:          drmaa_release_job_ids (ids);
  57:       }</PRE>
     
     <P STYLE="margin-bottom: 0cm">
        This code segment submits an array job with 15 tasks numbered 1, 3, 5, 7,
        etc.  An important difference to note is that drmaa_run_bulk_jobs()
        returns the job ids in an opaque structure.  On lines 51-53, before we can
        print the job ids, we have to extract them from the structure.  When we're
        done with the job ids, we free the structure on line 56.  A more normal
        use pattern would be to use the while loop to extract job ids from the
        structure and place them into an array for future use.  We know when we've
        iterated over every element when drmaa_get_next_job_id() returns
        <CODE>DRMAA_ERRNO_INVALID_ATTRIBUTE_VALUE</CODE>.  Note that you can only
        iterate through the structure once and only in one direction.
     </P>
     
     <H2>
        <FONT COLOR="#336699">
           Waiting for a Job
        </FONT>
     </H2>
  
     <P STYLE="margin-bottom: 0cm">
        Now we're going to extend our example to include waiting for a job to
        finish.
     </P>
     
     <H3>Example 3</H3>
  
  <PRE>001: #include <stdio.h>
  002: #include "drmaa.h"
  003: 
  004: int main (int argc, char **argv) {
  005:    char error[DRMAA_ERROR_STRING_BUFFER];
  006:    int errnum = 0;
  007:    drmaa_job_template_t *jt = NULL;
  008: 
  009:    errnum = drmaa_init (NULL, error, DRMAA_ERROR_STRING_BUFFER);
  010: 
  011:    if (errnum != DRMAA_ERRNO_SUCCESS) {
  012:       fprintf (stderr, "Could not initialize the DRMAA library: %s\n", error);
  013:       return 1;
  014:    }
  015: 
  016:    errnum = drmaa_allocate_job_template (&jt, error, \
DRMAA_ERROR_STRING_BUFFER);  017: 
  018:    if (errnum != DRMAA_ERRNO_SUCCESS) {
  019:       fprintf (stderr, "Could not create job template: %s\n", error);
  020:    }
  021:    else {
  022:       errnum = drmaa_set_attribute (jt, DRMAA_REMOTE_COMMAND, "sleeper.sh",
  023:                                    error, DRMAA_ERROR_STRING_BUFFER);
  024: 
  025:       if (errnum != DRMAA_ERRNO_SUCCESS) {
  026:          fprintf (stderr, "Could not set attribute \"%s\": %s\n",
  027:                   DRMAA_REMOTE_COMMAND, error);
  028:       }
  029:       else {
  030:          const char *args[2] = {"5", NULL};
  031:          
  032:          errnum = drmaa_set_vector_attribute (jt, DRMAA_V_ARGV, args, error,
  033:                                               DRMAA_ERROR_STRING_BUFFER);
  034:       }
  035:       
  036:       if (errnum != DRMAA_ERRNO_SUCCESS) {
  037:          fprintf (stderr, "Could not set attribute \"%s\": %s\n",
  038:                   DRMAA_REMOTE_COMMAND, error);
  039:       }
  040:       else {
  041:          char jobid[DRMAA_JOBNAME_BUFFER];
  042:          char jobid_out[DRMAA_JOBNAME_BUFFER];
  043:          int status = 0;
  044:          drmaa_attr_values_t *rusage = NULL;
  045: 
  046:          errnum = drmaa_run_job (jobid, DRMAA_JOBNAME_BUFFER, jt, error,
  047:                                  DRMAA_ERROR_STRING_BUFFER);
  048: 
  049:          if (errnum != DRMAA_ERRNO_SUCCESS) {
  050:             fprintf (stderr, "Could not submit job: %s\n", error);
  051:          }
  052:          else {
  053:             printf ("Your job has been submitted with id %s\n", jobid);
  054:             
  055:             errnum = drmaa_wait (jobid, jobid_out, DRMAA_JOBNAME_BUFFER, \
&status,  056:                                  DRMAA_TIMEOUT_WAIT_FOREVER, &rusage, \
error,  057:                                  DRMAA_ERROR_STRING_BUFFER);
  058:             
  059:             if (errnum != DRMAA_ERRNO_SUCCESS) {
  060:                fprintf (stderr, "Could not wait for job: %s\n", error);
  061:             }
  062:             else {
  063:                char usage[DRMAA_ERROR_STRING_BUFFER];
  064:                int aborted = 0;
  065: 
  066:                drmaa_wifaborted(&aborted, status, NULL, 0);
  067: 
  068:                if (aborted == 1) {
  069:                   printf("Job %s never ran\n", jobid);
  070:                }
  071:                else {
  072:                   int exited = 0;
  073: 
  074:                   drmaa_wifexited(&exited, status, NULL, 0);
  075: 
  076:                   if (exited == 1) {
  077:                      int exit_status = 0;
  078: 
  079:                      drmaa_wexitstatus(&exit_status, status, NULL, 0);
  080:                      printf("Job %s finished regularly with exit status %d\n", \
jobid, exit_status);  081:                   }
  082:                   else {
  083:                      int signaled = 0;
  084: 
  085:                      drmaa_wifsignaled(&signaled, status, NULL, 0);
  086: 
  087:                      if (signaled == 1) {
  088:                         char termsig[DRMAA_SIGNAL_BUFFER+1];
  089: 
  090:                         drmaa_wtermsig(termsig, DRMAA_SIGNAL_BUFFER, status, \
NULL, 0);  091:                         printf("Job %s finished due to signal %s\n", \
jobid, termsig);  092:                      }
  093:                      else {
  094:                         printf("Job %s finished with unclear conditions\n", \
jobid);  095:                      }
  096:                   } /* else */
  097:                } /* else */
  098:                
  099:                printf ("Job Usage:\n");
  100:                
  101:                while (drmaa_get_next_attr_value (rusage, usage, \
DRMAA_ERROR_STRING_BUFFER) == DRMAA_ERRNO_SUCCESS) {  102:                   printf \
("  %s\n", usage);  103:                }
  104:                
  105:                drmaa_release_attr_values (rusage);
  106:             } /* else */
  107:          } /* else */
  108:       } /* else */
  109: 
  110:       errnum = drmaa_delete_job_template (jt, error, \
DRMAA_ERROR_STRING_BUFFER);  111: 
  112:       if (errnum != DRMAA_ERRNO_SUCCESS) {
  113:          fprintf (stderr, "Could not delete job template: %s\n", error);
  114:       }
  115:    } /* else */
  116: 
  117:    errnum = drmaa_exit (error, DRMAA_ERROR_STRING_BUFFER);
  118: 
  119:    if (errnum != DRMAA_ERRNO_SUCCESS) {
  120:       fprintf (stderr, "Could not shut down the DRMAA library: %s\n", error);
  121:       return 1;
  122:    }
  123: 
  124:    return 0;
  125: }</PRE>
  
     <P STYLE="margin-bottom: 0cm">
        This example is very similar to Example 2 except for lines 55-106.  On
        line 55 we call drmaa_wait() to wait for the job to end.  We have to give
        drmaa_wait() both the id of the job for which we want to wait and a place
        to write the id of the job for which we actually waited because the job
        id we pass in could be <CODE>DRMAA_JOB_IDS_SESSION_ANY</CODE>, in which
        case drmaa_wait() must have a way of tell us which job is the one that
        made it return.  We also have to pass to drmaa_wait() how long we are
        willing to wait for the job to finish.  This could be a number of seconds,
        or it could be either <CODE>DRMAA_TIMEOUT_WAIT_FOREVER</CODE> or
        <CODE>DRMAA_TIMEOUT_NO_WAIT</CODE>.  Lastly, aside from the usual error
        buffer, we also have to pass in a place to write the exit status and the
        usage information.  The exit status is an opaque number that is passed to
        the drmaa_w...() functions to get information about how the job exited.
        The usage information is a list of name=value pairs in a DRMAA values
        structure.  The values structure works exactly the same as the ids
        structure we talked about in Example 2.1.
     </P>
  
     <P STYLE="margin-bottom: 0cm">
        Assuming the wait worked, we query the job's exit status on lines 66-97
        using the drmaa_w...() functions.  This if structure is a common usage
        pattern for drmaa_wait() and should be encapsulated in a function for
        ease of use.
     </P>
  
     <P STYLE="margin-bottom: 0cm">
        After checking the exit status, we query the job's usage on lines 99-105.
        We use the drmaa_get_next_attr_value() function to walk through the usage
        information and print out the results.  For further processing of the
        usage, we'd have to split each string on the '=' character to extract the
        name and value of each usage parameter.
     </P>
  
     <P STYLE="margin-bottom: 0cm">
        An alternative to drmaa_wait() when working with multiple jobs, such as
        jobs submitted by drmmaa_run_bulk_jobs() or multiple calls to
        drmaa_run_job() is drmaa_synchronize().  drmaa_synchronize() waits for
        a set of jobs to finish.  To use drmaa_synchronize(), we could replace
        lines 40-108 with the following:
     </P>
  
     <H3>Example 3.1</H3>
  
  <PRE>40:       else {
  41:          drmaa_job_ids_t *ids = NULL;
  42: 
  43:          errnum = drmaa_run_bulk_jobs (&ids, jt, 1, 30, 2, error, \
DRMAA_ERROR_STRING_BUFFER);  44: 
  45:          if (errnum != DRMAA_ERRNO_SUCCESS) {
  46:             fprintf (stderr, "Could not submit job: %s\n", error);
  47:          }
  48:          else {
  49:             char jobid[DRMAA_JOBNAME_BUFFER];
  50:             const char *jobids[2] = {DRMAA_JOB_IDS_SESSION_ALL, NULL};
  51: 
  52:             while (drmaa_get_next_job_id (ids, jobid, DRMAA_JOBNAME_BUFFER) == \
DRMAA_ERRNO_SUCCESS) {  53:                printf ("A job task has been submitted \
with id %s\n", jobid);  54:             }
  55:             
  56:             errnum = drmaa_synchronize (jobids, DRMAA_TIMEOUT_WAIT_FOREVER,
  57:                                         1, error, DRMAA_ERROR_STRING_BUFFER);
  58:             
  59:             if (errnum != DRMAA_ERRNO_SUCCESS) {
  60:                fprintf (stderr, "Could not wait for jobs: %s\n", error);
  61:             }
  62:             else {
  63:                printf ("All job tasks have finished.\n");
  64:             }
  65:          } /* else */
  66: 
  67:          drmaa_release_job_ids (ids);
  68:       } /* else */</PRE>
  
     <H3>Example 3.1</H3>
  
     <P STYLE="margin-bottom: 0cm">
        Lines 41-43 now call drmaa_run_bulk_jobs() so that we have several jobs
        for which to wait.  On line 56, instead of calling drmaa_wait(), we call
        drmaa_synchronize().  drmaa_synchronize() takes only three iteresting
        parameters.  The first is the list of ids for which to wait.  This list
        must be a NULL-terminated array of strings.  If the special id,
        <CODE>DRMAA_JOB_IDS_SESSION_ALL</CODE>, appears in the array,
        drmaa_synchronize() will wait for all jobs submitted via DRMAA during this
        session, i.e. since drmaa_init() was called.  The second is how long to
        wait for all the jobs in the list to finish.  This is the same as the
        timeout parameter for drmaa_wait().  The third is whether this call to
        drmaa_synchronize() should clean up after the job.  After a job completes,
        it leaves behind accounting information, such as exist status and usage,
        until either drmaa_wait() or drmaa_synchronize() with dispose set to true
        is called.  It is the responsibility of the application to make sure one
        of these two functions is called for every job.  Not doing so creates a
        memory leak.  Note that calling drmaa_synchronize() with dispose set to
        true flushes all accounting information for all jobs in the list.  If you
        want to use drmaa_synchronize() and still recover the accounting
        information, set dispose to false and call drmaa_wait() for each job.  To
        do this in Example 3, we would replace lines 40-108 with the following:
     </P>
  
     <H3>Example 3.2</H3>
  
  <PRE>040:       else {
  041:          drmaa_job_ids_t *ids = NULL;
  042:          int start = 1;
  043:          int end = 30;
  044:          int step = 2;
  045: 
  046:          errnum = drmaa_run_bulk_jobs (&ids, jt, start, end, step, error,
  047:                                        DRMAA_ERROR_STRING_BUFFER);
  048: 
  049:          if (errnum != DRMAA_ERRNO_SUCCESS) {
  050:             fprintf (stderr, "Could not submit job: %s\n", error);
  051:          }
  052:          else {
  053:             char jobid[DRMAA_JOBNAME_BUFFER];
  054:             const char *jobids[2] = {DRMAA_JOB_IDS_SESSION_ALL, NULL};
  055: 
  056:             while (drmaa_get_next_job_id (ids, jobid, DRMAA_JOBNAME_BUFFER)
  057:                                                      == DRMAA_ERRNO_SUCCESS) {
  058:                printf ("A job task has been submitted with id %s\n", jobid);
  059:             }
  060:             
  061:             errnum = drmaa_synchronize (jobids, DRMAA_TIMEOUT_WAIT_FOREVER,
  062:                                         0, error, DRMAA_ERROR_STRING_BUFFER);
  063:             
  064:             if (errnum != DRMAA_ERRNO_SUCCESS) {
  065:                fprintf (stderr, "Could not wait for jobs: %s\n", error);
  066:             }
  067:             else {
  068:                char jobid[DRMAA_JOBNAME_BUFFER];
  069:                int status = 0;
  070:                drmaa_attr_values_t *rusage = NULL;
  071:                int count = 0;
  072:                
  073:                for (count = start; count < end; count += step) {
  074:                   errnum = drmaa_wait (DRMAA_JOB_IDS_SESSION_ANY, jobid,
  075:                                        DRMAA_JOBNAME_BUFFER, &status,
  076:                                        DRMAA_TIMEOUT_WAIT_FOREVER, &rusage,
  077:                                        error, DRMAA_ERROR_STRING_BUFFER);
  078: 
  079:                   if (errnum != DRMAA_ERRNO_SUCCESS) {
  080:                      fprintf (stderr, "Could not wait for job: %s\n", error);
  081:                   }
  082:                   else {
  083:                      char usage[DRMAA_ERROR_STRING_BUFFER];
  084:                      int aborted = 0;
  085: 
  086:                      drmaa_wifaborted(&aborted, status, NULL, 0);
  087: 
  088:                      if (aborted == 1) {
  089:                         printf("Job %s never ran\n", jobid);
  090:                      }
  091:                      else {
  092:                         int exited = 0;
  093: 
  094:                         drmaa_wifexited(&exited, status, NULL, 0);
  095: 
  096:                         if (exited == 1) {
  097:                            int exit_status = 0;
  098: 
  099:                            drmaa_wexitstatus(&exit_status, status, NULL, 0);
  100:                            printf("Job %s finished regularly with exit status \
%d\n",  101:                                   jobid, exit_status);
  102:                         }
  103:                         else {
  104:                            int signaled = 0;
  105: 
  106:                            drmaa_wifsignaled(&signaled, status, NULL, 0);
  107: 
  108:                            if (signaled == 1) {
  109:                               char termsig[DRMAA_SIGNAL_BUFFER+1];
  110: 
  111:                               drmaa_wtermsig(termsig, DRMAA_SIGNAL_BUFFER, \
status, NULL, 0);  112:                               printf("Job %s finished due to \
signal %s\n", jobid, termsig);  113:                            }
  114:                            else {
  115:                               printf("Job %s finished with unclear \
conditions\n", jobid);  116:                            }
  117:                         } /* else */
  118:                      } /* else */
  119: 
  120:                      printf ("Job Usage:\n");
  121: 
  122:                      while (drmaa_get_next_attr_value (rusage, usage, \
DRMAA_ERROR_STRING_BUFFER)  123:                                                      \
== DRMAA_ERRNO_SUCCESS) {  124:                         printf ("  %s\n", usage);
  125:                      }
  126: 
  127:                      drmaa_release_attr_values (rusage);
  128:                   } /* else */
  129:                } /* for */
  130:             } /* else */
  131:          } /* else */
  132: 
  133:          drmaa_release_job_ids (ids);
  134:       } /* else */</PRE>
  
     <P STYLE="margin-bottom: 0cm">
        What's different is that on line 61, we set dispose to false, and then on
        lines 68-130 we wait once for each job, printing the exit status and
        usage information as we did in Example 3.  We pass
        <CODE>DRMAA_JOB_IDS_SESSION_ANY</CODE> to drmaa_wait() as the job id
        because we already know that all the jobs have finished, so we don't
        really care in what order we process them.  In an interactive system
        where we couldn't guarantee that more jobs wouldn't be submitted between
        the synchronize and the wait, we would have to store the job ids from the
        drmaa_run_bulk_jobs() in an array and then wait for each job specifically.
        Otherwise, the drmaa_wait() could end up waiting for a job submitted after
        the call to drmaa_synchronize().
     </P>
  
     <H2>
        <FONT COLOR="#336699">
           Controling a Job
        </FONT>
     </H2>
  
     <P STYLE="margin-bottom: 0cm">
        Now let's look at an example of how to control a job from DRMAA:
     </P>
  
     <H3>Example 4</H3>
  
  <PRE>01: #include <stdio.h>
  02: #include "drmaa.h"
  03: 
  04: int main (int argc, char **argv) {
  05:    char error[DRMAA_ERROR_STRING_BUFFER];
  06:    int errnum = 0;
  07:    drmaa_job_template_t *jt = NULL;
  08: 
  09:    errnum = drmaa_init (NULL, error, DRMAA_ERROR_STRING_BUFFER);
  10: 
  11:    if (errnum != DRMAA_ERRNO_SUCCESS) {
  12:       fprintf (stderr, "Could not initialize the DRMAA library: %s\n", error);
  13:       return 1;
  14:    }
  15: 
  16:    errnum = drmaa_allocate_job_template (&jt, error, \
DRMAA_ERROR_STRING_BUFFER);  17: 
  18:    if (errnum != DRMAA_ERRNO_SUCCESS) {
  19:       fprintf (stderr, "Could not create job template: %s\n", error);
  20:    }
  21:    else {
  22:       errnum = drmaa_set_attribute (jt, DRMAA_REMOTE_COMMAND, "sleeper.sh",
  23:                                     error, DRMAA_ERROR_STRING_BUFFER);
  24: 
  25:       if (errnum != DRMAA_ERRNO_SUCCESS) {
  26:          fprintf (stderr, "Could not set attribute \"%s\": %s\n",
  27:                   DRMAA_REMOTE_COMMAND, error);
  28:       }
  29:       else {
  30:          const char *args[2] = {"60", NULL};
  31:          
  32:          errnum = drmaa_set_vector_attribute (jt, DRMAA_V_ARGV, args, error,
  33:                                               DRMAA_ERROR_STRING_BUFFER);
  34:       }
  35:       
  36:       if (errnum != DRMAA_ERRNO_SUCCESS) {
  37:          fprintf (stderr, "Could not set attribute \"%s\": %s\n",
  38:                   DRMAA_REMOTE_COMMAND, error);
  39:       }
  40:       else {
  41:          char jobid[DRMAA_JOBNAME_BUFFER];
  42: 
  43:          errnum = drmaa_run_job (jobid, DRMAA_JOBNAME_BUFFER, jt, error,
  44:                                  DRMAA_ERROR_STRING_BUFFER);
  45: 
  46:          if (errnum != DRMAA_ERRNO_SUCCESS) {
  47:             fprintf (stderr, "Could not submit job: %s\n", error);
  48:          }
  49:          else {
  50:             printf ("Your job has been submitted with id %s\n", jobid);
  51:             
  52:             errnum = drmaa_control (jobid, DRMAA_CONTROL_TERMINATE, error,
  53:                                     DRMAA_ERROR_STRING_BUFFER);
  54:             
  55:             if (errnum != DRMAA_ERRNO_SUCCESS) {
  56:                fprintf (stderr, "Could not delete job: %s\n", error);
  57:             }
  58:             else {
  59:                printf ("Your job has been deleted\n");
  60:             }
  61:          }
  62:       } /* else */
  63: 
  64:       errnum = drmaa_delete_job_template (jt, error, \
DRMAA_ERROR_STRING_BUFFER);  65: 
  66:       if (errnum != DRMAA_ERRNO_SUCCESS) {
  67:          fprintf (stderr, "Could not delete job template: %s\n", error);
  68:       }
  69:    } /* else */
  70: 
  71:    errnum = drmaa_exit (error, DRMAA_ERROR_STRING_BUFFER);
  72: 
  73:    if (errnum != DRMAA_ERRNO_SUCCESS) {
  74:       fprintf (stderr, "Could not shut down the DRMAA library: %s\n", error);
  75:       return 1;
  76:    }
  77: 
  78:    return 0;
  79: }</PRE>
  
     <P STYLE="margin-bottom: 0cm">
        This example is very similar to Example 2 except for lines 52-60.  On line
        52 we use drmaa_control() to delete the job we just submitted.  Aside from
        deleting the job, we could have also used drmaa_control() to suspend,
        resume, hold, or release it.  For more information, see the
        <A HREF="http://gridengine.sunsource.net/unbranded-source/browse/~checkout~/gridengine/doc/htmlman/htmlman3/drmaa_control.html">drmaa_control</A>
  man page.
     </P>
  
     <P STYLE="margin-bottom: 0cm">
        Note that drmaa_control() can be used to control jobs not submitted
        through DRMAA.  Any valid SGE job id could be passed to drmaa_control() as
        the id of the job to delete.
     </P>
  
     <H2>
        <FONT COLOR="#336699">
           Getting Job Status
        </FONT>
     </H2>
  
     <P STYLE="margin-bottom: 0cm">
        Here's an example of using DRMAA to query the status of a job:
     </P>
  
     <H3>Example 5</H3>
  
  <PRE>001: #include <stdio.h>
  002: #include <unistd.h>
  003: #include "drmaa.h"
  004: 
  005: int main (int argc, char **argv) {
  006:    char error[DRMAA_ERROR_STRING_BUFFER];
  007:    int errnum = 0;
  008:    drmaa_job_template_t *jt = NULL;
  009: 
  010:    errnum = drmaa_init (NULL, error, DRMAA_ERROR_STRING_BUFFER);
  011: 
  012:    if (errnum != DRMAA_ERRNO_SUCCESS) {
  013:       fprintf (stderr, "Could not initialize the DRMAA library: %s\n", error);
  014:       return 1;
  015:    }
  016: 
  017:    errnum = drmaa_allocate_job_template (&jt, error, \
DRMAA_ERROR_STRING_BUFFER);  018: 
  019:    if (errnum != DRMAA_ERRNO_SUCCESS) {
  020:       fprintf (stderr, "Could not create job template: %s\n", error);
  021:    }
  022:    else {
  023:       errnum = drmaa_set_attribute (jt, DRMAA_REMOTE_COMMAND, "sleeper.sh",
  024:                                     error, DRMAA_ERROR_STRING_BUFFER);
  025: 
  026:       if (errnum != DRMAA_ERRNO_SUCCESS) {
  027:          fprintf (stderr, "Could not set attribute \"%s\": %s\n",
  028:                   DRMAA_REMOTE_COMMAND, error);
  029:       }
  030:       else {
  031:          const char *args[2] = {"60", NULL};
  032:          
  033:          errnum = drmaa_set_vector_attribute (jt, DRMAA_V_ARGV, args, error,
  034:                                               DRMAA_ERROR_STRING_BUFFER);
  035:       }
  036:       
  037:       if (errnum != DRMAA_ERRNO_SUCCESS) {
  038:          fprintf (stderr, "Could not set attribute \"%s\": %s\n",
  039:                   DRMAA_REMOTE_COMMAND, error);
  040:       }
  041:       else {
  042:          char jobid[DRMAA_JOBNAME_BUFFER];
  043: 
  044:          errnum = drmaa_run_job (jobid, DRMAA_JOBNAME_BUFFER, jt, error,
  045:                                  DRMAA_ERROR_STRING_BUFFER);
  046: 
  047:          if (errnum != DRMAA_ERRNO_SUCCESS) {
  048:             fprintf (stderr, "Could not submit job: %s\n", error);
  049:          }
  050:          else {
  051:             int status = 0;
  052:             
  053:             printf ("Your job has been submitted with id %s\n", jobid);
  054:             
  055:             sleep (20);
  056:             
  057:             errnum = drmaa_job_ps (jobid, &status, error,
  058:                                    DRMAA_ERROR_STRING_BUFFER);
  059:             
  060:             if (errnum != DRMAA_ERRNO_SUCCESS) {
  061:                fprintf (stderr, "Could not get job' status: %s\n", error);
  062:             }
  063:             else {
  064:                switch (status) {
  065:                   case DRMAA_PS_UNDETERMINED:
  066:                      printf ("Job status cannot be determined\n");
  067:                      break;
  068:                   case DRMAA_PS_QUEUED_ACTIVE:
  069:                      printf ("Job is queued and active\n");
  070:                      break;
  071:                   case DRMAA_PS_SYSTEM_ON_HOLD:
  072:                      printf ("Job is queued and in system hold\n");
  073:                      break;
  074:                   case DRMAA_PS_USER_ON_HOLD:
  075:                      printf ("Job is queued and in user hold\n");
  076:                      break;
  077:                   case DRMAA_PS_USER_SYSTEM_ON_HOLD:
  078:                      printf ("Job is queued and in user and system hold\n");
  079:                      break;
  080:                   case DRMAA_PS_RUNNING:
  081:                      printf ("Job is running\n");
  082:                      break;
  083:                   case DRMAA_PS_SYSTEM_SUSPENDED:
  084:                      printf ("Job is system suspended\n");
  085:                      break;
  086:                   case DRMAA_PS_USER_SUSPENDED:
  087:                      printf ("Job is user suspended\n");
  088:                      break;
  089:                   case DRMAA_PS_USER_SYSTEM_SUSPENDED:
  090:                      printf ("Job is user and system suspended\n");
  091:                      break;
  092:                   case DRMAA_PS_DONE:
  093:                      printf ("Job finished normally\n");
  094:                      break;
  095:                   case DRMAA_PS_FAILED:
  096:                      printf ("Job finished, but failed\n");
  097:                      break;
  098:                } /* switch */
  099:             } /* else */
  100:          } /* else */
  101:       } /* else */
  102: 
  103:       errnum = drmaa_delete_job_template (jt, error, \
DRMAA_ERROR_STRING_BUFFER);  104: 
  105:       if (errnum != DRMAA_ERRNO_SUCCESS) {
  106:          fprintf (stderr, "Could not delete job template: %s\n", error);
  107:       }
  108:    } /* else */
  109: 
  110:    errnum = drmaa_exit (error, DRMAA_ERROR_STRING_BUFFER);
  111: 
  112:    if (errnum != DRMAA_ERRNO_SUCCESS) {
  113:       fprintf (stderr, "Could not shut down the DRMAA library: %s\n", error);
  114:       return 1;
  115:    }
  116: 
  117:    return 0;
  118: }</PRE>
  
     <P STYLE="margin-bottom: 0cm">
        Again, this example is very similar to Example 2, this time with the
        exception of lines 55-99.  First, after submitting the job, we sleep for
        20 seconds to give SGE time to schedule the job.  Then, on line 55, we
        use drmaa_job_ps() to get the status of the job.  Lines 64-98 determine
        what the job status is and report it.  This switch is a common usage
        pattern for drmaa_job_ps() and should be encapsulated in a function for
        ease of use.
     </P>
  
     <H2>
        <FONT COLOR="#336699">
           Getting DRM information
        </FONT>
     </H2>
  
     <P STYLE="margin-bottom: 0cm">
        Lastly, let's look at how to query the DRMAA library for information about
        the DRMS and the DRMAA implementation itself:
     </P>
  
     <H3>Example 6</H3>
  
  <PRE>01: #include <stdio.h>
  02: #include "drmaa.h"
  03: 
  04: int main (int argc, char **argv) {
  05:    char error[DRMAA_ERROR_STRING_BUFFER];
  06:    int errnum = 0;
  07:    char contact[DRMAA_CONTACT_BUFFER];
  08:    char drm_system[DRMAA_DRM_SYSTEM_BUFFER];
  09:    char drmaa_impl[DRMAA_DRM_SYSTEM_BUFFER];
  10:    unsigned int major = 0;
  11:    unsigned int minor = 0;
  12:       
  13:    errnum = drmaa_get_contact (contact, DRMAA_CONTACT_BUFFER, error,
  14:                                DRMAA_ERROR_STRING_BUFFER);
  15:    
  16:    if (errnum != DRMAA_ERRNO_SUCCESS) {
  17:       fprintf (stderr, "Could not get the contact string list: %s\n", error);
  18:    }
  19:    else {
  20:       printf ("Supported contact strings: \"%s\"\n", contact);
  21:    }
  22: 
  23:    errnum = drmaa_get_DRM_system (drm_system, DRMAA_DRM_SYSTEM_BUFFER, error,
  24:                                DRMAA_ERROR_STRING_BUFFER);
  25:    
  26:    if (errnum != DRMAA_ERRNO_SUCCESS) {
  27:       fprintf (stderr, "Could not get the DRM system list: %s\n", error);
  28:    }
  29:    else {
  30:       printf ("Supported DRM systems: \"%s\"\n", drm_system);
  31:    }
  32:    
  33:    errnum = drmaa_get_DRMAA_implementation (drmaa_impl, \
DRMAA_DRM_SYSTEM_BUFFER,  34:                                             error, \
DRMAA_ERROR_STRING_BUFFER);  35:    
  36:    if (errnum != DRMAA_ERRNO_SUCCESS) {
  37:       fprintf (stderr, "Could not get the DRMAA implementation list: %s\n", \
error);  38:    }
  39:    else {
  40:       printf ("Supported DRMAA implementations: \"%s\"\n", drmaa_impl);
  41:    }
  42: 
  43:    errnum = drmaa_init (NULL, error, DRMAA_ERROR_STRING_BUFFER);
  44: 
  45:    if (errnum != DRMAA_ERRNO_SUCCESS) {
  46:       fprintf (stderr, "Could not initialize the DRMAA library: %s\n", error);
  47:       return 1;
  48:    }
  49: 
  50:    errnum = drmaa_get_contact (contact, DRMAA_CONTACT_BUFFER, error,
  51:                                DRMAA_ERROR_STRING_BUFFER);
  52:    
  53:    if (errnum != DRMAA_ERRNO_SUCCESS) {
  54:       fprintf (stderr, "Could not get the contact string: %s\n", error);
  55:    }
  56:    else {
  57:       printf ("Connected contact string: \"%s\"\n", contact);
  58:    }
  59: 
  60:    errnum = drmaa_get_DRM_system (drm_system, DRMAA_CONTACT_BUFFER, error,
  61:                                DRMAA_ERROR_STRING_BUFFER);
  62: 
  63:    if (errnum != DRMAA_ERRNO_SUCCESS) {
  64:       fprintf (stderr, "Could not get the DRM system: %s\n", error);
  65:    }
  66:    else {
  67:       printf ("Connected DRM system: \"%s\"\n", drm_system);
  68:    }
  69: 
  70:    errnum = drmaa_get_DRMAA_implementation (drmaa_impl, \
DRMAA_DRM_SYSTEM_BUFFER,  71:                                             error, \
DRMAA_ERROR_STRING_BUFFER);  72:    
  73:    if (errnum != DRMAA_ERRNO_SUCCESS) {
  74:       fprintf (stderr, "Could not get the DRMAA implementation list: %s\n", \
error);  75:    }
  76:    else {
  77:       printf ("Supported DRMAA implementations: \"%s\"\n", drmaa_impl);
  78:    }
  79: 
  80:    errnum = drmaa_version (&major, &minor, error, DRMAA_ERROR_STRING_BUFFER);
  81: 
  82:    if (errnum != DRMAA_ERRNO_SUCCESS) {
  83:       fprintf (stderr, "Could not get the DRMAA version: %s\n", error);
  84:    }
  85:    else {
  86:       printf ("Using DRMAA version %d.%d\n", major, minor);
  87:    }
  88:    
  89:    errnum = drmaa_exit (error, DRMAA_ERROR_STRING_BUFFER);
  90: 
  91:    if (errnum != DRMAA_ERRNO_SUCCESS) {
  92:       fprintf (stderr, "Could not shut down the DRMAA library: %s\n", error);
  93:       return 1;
  94:    }
  95: 
  96:    return 0;
  97: }</PRE>
  
  
     <P STYLE="margin-bottom: 0cm">
        On line 13, we get the contact string list.  This is the list of contact
        strings that will be understood by this DRMAA instance.  Normally on of
        these strings is used to select to which DRM this DRMAA instance should
        be bound.  In the Grid Engine 6.0 implementation, the contact string list
        is empty because there is only ever one possible DRM to which to bind.
     </P>
  
     <P STYLE="margin-bottom: 0cm">
        On line 23, we get the list of supported DRM systems.  For the Grid Engine
        6.0 implementation, this will always be Grid Engine 6.0.
     </P>
  
     <P STYLE="margin-bottom: 0cm">
        On line 33, we get the list of supported DRMAA implementations.  For the
        Grid Engine 6.0 implementation, this will always be Grid Engine 6.0.
     </P>
  
     <P STYLE="margin-bottom: 0cm">
        On line 43, we call drmaa_init().  After drmaa_init() has been called, the
        drmaa_get_contact() and drmaa_get_DRM_system() calls change.
     </P>
  
     <P STYLE="margin-bottom: 0cm">
        On line 50, we call drmaa_get_contact() again, this time to get the
        contact string that was used to bind to a DRMS in drmaa_init().  For the
        Grid Engine 6.0 implementation, this will always be an empty string.
     </P>
  
     <P STYLE="margin-bottom: 0cm">
        On line 60, we call drmaa_get_DRM_system() again, this time to get the
        name of the DRMS to which DRMAA is bound.  For the Grid Engine 6.0
        implementation, this will always be Grid Engine 6.0.
     </P>
  
     <P STYLE="margin-bottom: 0cm">
        On line 70, we call drmaa_get_DRMAA_implementation() again, this time to
        get the name of the DRMAA implementation to which the application is
        bound.  For the Grid Engine 6.0 implementation, this will always be Grid
        Engine 6.0.
     </P>
  
     <P STYLE="margin-bottom: 0cm">
        On line 80, we get the version number of the DRMAA C binding specification
        supported by this DRMAA implementation.  For the Grid Engine 6.0
        implementation this is currently version 0.8.
     </P>
  
     <P STYLE="margin-bottom: 0cm">
        Finally, on line 89, we end the session with drmaa_exit().
     </P>
     </BODY>
  </HTML>
  
  
  
  1.7       +2 -0      gridengine/source/classes/org/ggf/drmaa/DRMAASession.java
  
  http://gridengine.sunsource.net/source/browse/gridengine/source/classes/org/ggf/drmaa/DRMAASession.java.diff?r1=1.6&r2=1.7
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: DRMAASession.java
  ===================================================================
  RCS file: /cvs/gridengine/source/classes/org/ggf/drmaa/DRMAASession.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -b -r1.6 -r1.7
  --- DRMAASession.java	2004/06/03 14:38:52	1.6
  +++ DRMAASession.java	2004/06/16 08:25:16	1.7
  @@ -81,6 +81,8 @@
   	public static final int SYSTEM_SUSPENDED = 0x21;
   	/** job is user suspended */
   	public static final int USER_SUSPENDED = 0x22;
  +	/** job is user suspended */
  +	public static final int USER_SYSTEM_SUSPENDED = 0x23;
   	/** job finished normally */
   	public static final int DONE = 0x30;
   	/** job finished, but failed */
  
  
  
  1.2       +1 -1      \
gridengine/source/classes/org/ggf/drmaa/InvalidAttributeFormatException.java  
  http://gridengine.sunsource.net/source/browse/gridengine/source/classes/org/ggf/drmaa/InvalidAttributeFormatException.java.diff?r1=1.1&r2=1.2
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: InvalidAttributeFormatException.java
  ===================================================================
  RCS file: /cvs/gridengine/source/classes/org/ggf/drmaa/InvalidAttributeFormatException.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -b -r1.1 -r1.2
  --- InvalidAttributeFormatException.java	2004/03/15 14:44:42	1.1
  +++ InvalidAttributeFormatException.java	2004/06/16 08:25:16	1.2
  @@ -38,7 +38,7 @@
   /** The format for the job attribute value is invalid.
    * @author dan.templeton@sun.com
    */
  -public class InvalidAttributeFormatException extends InvalidArgumentException {
  +public class InvalidAttributeFormatException extends InvalidAttributeException {
   	
   	/**
   	 * Creates a new instance of <code>InvalidAttributeFormatException</code> without \
detail message.  
  
  
  1.2       +1 -1      \
gridengine/source/classes/org/ggf/drmaa/InvalidAttributeValueException.java  
  http://gridengine.sunsource.net/source/browse/gridengine/source/classes/org/ggf/drmaa/InvalidAttributeValueException.java.diff?r1=1.1&r2=1.2
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: InvalidAttributeValueException.java
  ===================================================================
  RCS file: /cvs/gridengine/source/classes/org/ggf/drmaa/InvalidAttributeValueException.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -b -r1.1 -r1.2
  --- InvalidAttributeValueException.java	2004/03/15 14:44:42	1.1
  +++ InvalidAttributeValueException.java	2004/06/16 08:25:16	1.2
  @@ -38,7 +38,7 @@
   /** The value for the job attribute is invalid.
    * @author dan.templeton@sun.com
    */
  -public class InvalidAttributeValueException extends InvalidArgumentException {
  +public class InvalidAttributeValueException extends InvalidAttributeException {
   	
   	/**
   	 * Creates a new instance of <code>InvalidAttributeValueException</code> without \
detail message.  
  
  
  1.1                  gridengine/doc/README-DRMAA-JAVA.txt
  
  http://gridengine.sunsource.net/source/browse/gridengine/doc/README-DRMAA-JAVA.txt?rev=1.1&content-type=text/x-cvsweb-markup
  
  Index: README-DRMAA-JAVA.txt
  ===================================================================
                              What is DRMAA?
                              --------------
  
  Content
  -------
  1. Introduction
  2. Getting Started
  3. Getting Support
  4. Copyright
  
  1. Introduction
  ---------------
  
     DRMAA is a specification developed by a working group in the Global Grid
     Forum (GGF).  The best way to describe DRMAA is to cite the DRMAA-WG
     Charter:
  
        "Develop an API specification for the submission and control of jobs
        to one or more Distributed Resource Management (DRM) systems. The
        scope of this specification is all the high level functionality which
        is necessary for an application to consign a job to a DRM system
        including common operations on jobs like termination or suspension. 
        The objective is to facilitate the direct interfacing of applications
        to today's DRM systems by application's builders, portal builders, and
        Independent Software Vendors (ISVs)."
  
     Simply put, DRMAA is an API for submitting and controling jobs.  DRMAA
     has been implemented in several lanuages and for several DRMs.  The Grid
     Engine 6.0 release includes a C implementation, or C binding as well as a
     Java[TM] language binding.
  
     For more information about DRMAA and the various bindings that are
     available, visit the DRMAA website at:
  
        http://www.drmaa.org/
  
     There you will find links to the DRMAA specification and mailing list
     archives detailing the thought process that went into DRMAA.
  
     Information about grid computing standards in general can be found at the
     GGF website:
  
        http://www.gridforum.org/
  
     The Perl language binding module for the Grid Engine 6.0 release can be
     found at:
  
        http://search.cpan.org/src/THARSCH/Schedule-DRMAAc-0.81/
  
     For information on the C language binding included with the Condor 6.7
     release, see:
  
        http://www.cs.wisc.edu/condor/manual/v6.7/4_4Application_Program.html#SECTION00542000000000000000
  
  
  2. Getting Started
  -------------------
  
     The Grid Engine 6.0 release includes a DRMAA Java language binding.  To
     develop applications that utilize the Java binding, you will need two files.
     The first is the jar file, drmaa.jar.  You will find this file under the
     $SGE_ROOT/lib directory in the distribution.  This file is need for both
     compiling and running applications utilizing the Java language binding.  The
     second file is the Java language binding shared library.  You will also find
     this file in the $SGE_ROOT/lib directory.  This file will need to be
     accessible from the LD_LIBRARY_PATH in order for your application to link
     properly and run.
  
     The first step is to look at the example program included in the
     $SGE_ROOT/examples/drmaa directory of the distribution.  The example
     program demonstrates a simple usage of the DRMAA library to submit
     several bulk jobs and several single jobs, wait for the jobs to finish,
     and then output the results.
  
     Also in the $SGE_ROOT/examples/drmaa directory you will find the example
     programs from the online tutorial at:
  
        http://gridengine.sunsource.net/project/gridengine/howto/drmaa.html
  
     Once you're familiar with the DRMAA API, you're ready to begin
     development of your Java application.  When compiling your file, you will
     need to have $SGE_ROOT/lib/$ARCH/drmaa.jar included in your CLASSPATH.
  
  
  3. Getting Support
  ------------------
  
     If you're having trouble with the DRMAA library included with the Grid
     Engine 6 release, please visit:
  
        http://gridengine.sunsource.net/servlets/ProjectIssues
  
     to see if the problem your having is a know problem.  Alternately or for
     additional help you can send email to the dev@gridengine.sunsource.net
     mailing list.  You can also browse archives of this mailing list at:
  
        http://gridengine.sunsource.net/project/gridengine/maillist.html
  
  
  4. Copyright
  ------------
  ___INFO__MARK_BEGIN__
  The Contents of this file are made available subject to the terms of the Sun
  Industry Standards Source License Version 1.2
  
  Sun Microsystems Inc., March, 2001
  
  Sun Industry Standards Source License Version 1.2
  =================================================
  
  The contents of this file are subject to the Sun Industry Standards Source
  License Version 1.2 (the "License"); You may not use this file except in
  compliance with the License. You may obtain a copy of the License at
  http://gridengine.sunsource.net/Gridengine_SISSL_license.html
  
  Software provided under this License is provided on an "AS IS" basis,
  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
  
  See the License for the specific provisions governing your rights and
  obligations concerning the Software.
  
  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
  
  Copyright: 2001 by Sun Microsystems, Inc.
  
  All Rights Reserved.
  ___INFO__MARK_END__
  
  
  


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic