source: branches/2.0/drmaa2_utils/drmaa_utils/drmaa_base.c @ 81

Revision 81, 23.3 KB checked in by mmamonski, 12 years ago (diff)

DRMAA 2.0 for PBS compiles

Line 
1/* $Id: drmaa_base.c 13 2011-04-20 15:41:43Z mmamonski $ */
2/*
3 *  FedStage DRMAA utilities library
4 *  Copyright (C) 2006-2008  FedStage Systems
5 *
6 *  This program is free software: you can redistribute it and/or modify
7 *  it under the terms of the GNU General Public License as published by
8 *  the Free Software Foundation, either version 3 of the License, or
9 *  (at your option) any later version.
10 *
11 *  This program is distributed in the hope that it will be useful,
12 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 *  GNU General Public License for more details.
15 *
16 *  You should have received a copy of the GNU General Public License
17 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20/**
21 * @file drmaa_base.c
22 * DRM independant part of DRMAA library.
23 */
24
25#ifdef HAVE_CONFIG_H
26#       include <config.h>
27#endif
28
29#include <stdlib.h>
30#include <string.h>
31
32#include <drmaa_utils/drmaa2.h>
33
34#ifndef lint
35static char rcsid[]
36#       ifdef __GNUC__
37                __attribute__ ((unused))
38#       endif
39        = "$Id: drmaa_base.c 13 2011-04-20 15:41:43Z mmamonski $";
40#endif
41
42
43#define DRMAA_API_BEGIN \
44        volatile int rc = -1; \
45        TRY \
46         {
47#define DRMAA_API_END \
48                rc = DRMAA_ERRNO_SUCCESS; \
49         } \
50        EXCEPT_DEFAULT \
51         { \
52                const fsd_exc_t *e = fsd_exc_get(); \
53                rc = fsd_drmaa_code( e->code(e) ); \
54                fsd_log_return(( "=%d: %s", rc, e->message(e) )); \
55         } \
56        END_TRY \
57        if( rc < 0 ) \
58         { \
59                rc = DRMAA_ERRNO_NO_MEMORY; \
60         } \
61        return rc;
62
63
64#define DRMAA_API_BEGIN_PTR \
65        volatile int rc = -1; \
66        TRY \
67         {
68#define DRMAA_API_END_PTR \
69                rc = DRMAA_ERRNO_SUCCESS; \
70         } \
71        EXCEPT_DEFAULT \
72         { \
73                const fsd_exc_t *e = fsd_exc_get(); \
74                rc = fsd_drmaa_code( e->code(e) ); \
75                fsd_log_return(( "=%d: %s", rc, e->message(e) )); \
76         } \
77        END_TRY \
78        if( rc < 0 ) \
79         { \
80                rc = DRMAA_ERRNO_NO_MEMORY; \
81         } \
82        return NULL;
83
84
85/*
86 * 109 functions in total
87 *
88 * implemented so far:
89 * 14/10/2012 - 0
90 */
91
92void drmaa2_string_free(drmaa2_string *ptr)
93{
94
95}
96
97drmaa2_error
98drmaa2_lasterror(void)
99{
100
101}
102
103drmaa2_string
104drmaa2_lasterror_text(void)
105{
106
107}
108
109drmaa2_list
110drmaa2_list_create(const drmaa2_listtype t, const drmaa2_list_entryfree callback)
111{
112
113}
114
115void
116drmaa2_list_free(drmaa2_list * l)
117{
118
119
120}
121
122const void *
123drmaa2_list_get(const drmaa2_list l, long pos)
124{
125
126}
127
128drmaa2_error
129drmaa2_list_add(drmaa2_list l, const void * value)
130{
131
132}
133
134drmaa2_error
135drmaa2_list_del(drmaa2_list l, long pos)
136{
137
138}
139
140long
141drmaa2_list_size(const drmaa2_list l)
142{
143
144
145}
146
147
148drmaa2_dict
149drmaa2_dict_create (const drmaa2_dict_entryfree free_callback)
150{
151
152
153}
154
155void drmaa2_dict_free(drmaa2_dict * d)
156{
157
158}
159
160drmaa2_string_list
161drmaa2_dict_list(const drmaa2_dict d)
162{
163
164}
165
166drmaa2_bool
167drmaa2_dict_has(const drmaa2_dict d, const char * key)
168{
169
170}
171
172const char *
173drmaa2_dict_get(const drmaa2_dict d, const char * key)
174{
175
176}
177
178drmaa2_error
179drmaa2_dict_del(drmaa2_dict d, const char * key)
180{
181
182
183}
184
185drmaa2_error
186drmaa2_dict_set(drmaa2_dict d, const char * key, const char * val)
187{
188
189}
190
191
192drmaa2_jinfo
193drmaa2_jinfo_create(void)
194{
195
196}
197
198void
199drmaa2_jinfo_free(drmaa2_jinfo * ji)
200{
201
202}
203
204void drmaa2_slotinfo_free(drmaa2_slotinfo * si)
205{
206
207}
208
209
210void drmaa2_rinfo_free(drmaa2_rinfo * ri)
211{
212
213}
214
215drmaa2_jtemplate
216drmaa2_jtemplate_create(void)
217{
218
219}
220
221
222void
223drmaa2_jtemplate_free(drmaa2_jtemplate * jt)
224{
225
226}
227
228
229drmaa2_rtemplate
230drmaa2_rtemplate_create(void)
231{
232
233}
234
235void
236drmaa2_rtemplate_free(drmaa2_rtemplate * rt)
237{
238
239}
240
241void
242drmaa2_notification_free(drmaa2_notification * n)
243{
244
245}
246
247void
248drmaa2_queueinfo_free(drmaa2_queueinfo * qi)
249{
250
251}
252
253void
254drmaa2_version_free(drmaa2_version * v)
255{
256
257}
258
259
260void
261drmaa2_machineinfo_free(drmaa2_machineinfo * mi)
262{
263
264}
265
266drmaa2_string_list
267drmaa2_jtemplate_impl_spec(void)
268{
269
270}
271
272drmaa2_string_list
273drmaa2_jinfo_impl_spec(void)
274{
275
276}
277
278drmaa2_string_list
279drmaa2_rtemplate_impl_spec(void)
280{
281
282}
283
284drmaa2_string_list
285drmaa2_rinfo_impl_spec(void)
286{
287
288}
289
290drmaa2_string_list
291drmaa2_queueinfo_impl_spec(void)
292{
293
294
295}
296
297drmaa2_string_list
298drmaa2_machineinfo_impl_spec(void)
299{
300
301
302}
303
304drmaa2_string_list
305drmaa2_notification_impl_spec(void)
306{
307
308}
309
310drmaa2_string
311drmaa2_get_instance_value(const void * instance, const char * name)
312{
313
314}
315
316drmaa2_string
317drmaa2_describe_attribute(const void * instance, const char * name)
318{
319
320}
321
322drmaa2_error
323drmaa2_set_instance_value(void * instance, const char * name, const char * value)
324{
325
326}
327
328void
329drmaa2_jsession_free(drmaa2_jsession * js)
330{
331
332}
333
334void drmaa2_rsession_free(drmaa2_rsession * rs)
335{
336
337}
338
339void
340drmaa2_msession_free(drmaa2_msession * ms)
341{
342
343}
344
345void
346drmaa2_j_free(drmaa2_j * j)
347{
348
349}
350
351void
352drmaa2_jarray_free(drmaa2_jarray * ja)
353{
354
355
356}
357
358void drmaa2_r_free(drmaa2_r * r)
359{
360
361}
362
363drmaa2_string
364drmaa2_rsession_get_contact(const drmaa2_rsession rs)
365{
366
367}
368
369drmaa2_string
370drmaa2_rsession_get_session_name(const drmaa2_rsession rs)
371{
372
373}
374
375drmaa2_r
376drmaa2_rsession_get_reservation(const drmaa2_rsession rs, const drmaa2_string reservationId)
377{
378
379}
380
381drmaa2_r
382drmaa2_rsession_request_reservation(const drmaa2_rsession rs, const drmaa2_rtemplate rt)
383{
384
385}
386
387drmaa2_r_list
388drmaa2_rsession_get_reservations(const drmaa2_rsession rs)
389{
390
391}
392
393drmaa2_string
394drmaa2_r_get_id(const drmaa2_r r)
395{
396
397}
398
399drmaa2_string
400drmaa2_r_get_session_name(const drmaa2_r r)
401{
402
403}
404
405drmaa2_rtemplate
406drmaa2_r_get_reservation_template (const drmaa2_r r)
407{
408
409}
410
411drmaa2_rinfo
412drmaa2_r_get_info(const drmaa2_r r)
413{
414
415}
416
417drmaa2_error
418drmaa2_r_terminate(drmaa2_r r)
419{
420
421}
422
423drmaa2_string
424drmaa2_jarray_get_id(const drmaa2_jarray ja)
425{
426
427}
428
429drmaa2_j_list
430drmaa2_jarray_get_jobs(const drmaa2_jarray ja)
431{
432
433}
434
435drmaa2_string
436drmaa2_jarray_get_session_name(const drmaa2_jarray ja)
437{
438
439}
440
441drmaa2_jtemplate
442drmaa2_jarray_get_job_template(const drmaa2_jarray ja)
443{
444
445}
446
447drmaa2_error drmaa2_jarray_suspend(drmaa2_jarray ja)
448{
449
450}
451
452drmaa2_error drmaa2_jarray_resume(drmaa2_jarray ja)
453{
454
455}
456
457drmaa2_error drmaa2_jarray_hold(drmaa2_jarray ja)
458{
459
460}
461
462drmaa2_error drmaa2_jarray_release(drmaa2_jarray ja)
463{
464
465}
466
467drmaa2_error
468drmaa2_jarray_terminate(drmaa2_jarray ja)
469{
470
471}
472
473drmaa2_string
474drmaa2_jsession_get_contact(const drmaa2_jsession js)
475{
476
477}
478
479
480drmaa2_string drmaa2_jsession_get_session_name(const drmaa2_jsession js)
481{
482
483}
484
485drmaa2_string_list
486drmaa2_jsession_get_job_categories(const drmaa2_jsession js)
487{
488
489}
490
491drmaa2_j_list
492drmaa2_jsession_get_jobs(const drmaa2_jsession js, const drmaa2_jinfo filter)
493{
494
495
496}
497
498drmaa2_jarray
499drmaa2_jsession_get_job_array(const drmaa2_jsession js, const drmaa2_string jobarrayId)
500{
501
502}
503
504drmaa2_j
505drmaa2_jsession_run_job(const drmaa2_jsession js, const drmaa2_jtemplate jt)
506{
507
508}
509
510drmaa2_jarray
511drmaa2_jsession_run_bulk_jobs(const drmaa2_jsession js, const drmaa2_jtemplate jt, unsigned long begin_index, unsigned long end_index, unsigned long step, unsigned long max_parallel)
512{
513
514}
515
516drmaa2_j
517drmaa2_jsession_wait_any_started(const drmaa2_jsession js, const drmaa2_j_list l, const time_t timeout)
518{
519
520}
521
522drmaa2_j drmaa2_jsession_wait_any_terminated(const drmaa2_jsession js, const drmaa2_j_list l, const time_t timeout)
523{
524
525}
526
527drmaa2_string
528drmaa2_j_get_id(const drmaa2_j j)
529{
530
531}
532
533drmaa2_string
534drmaa2_j_get_session_name(const drmaa2_j j)
535{
536
537}
538
539drmaa2_jtemplate
540drmaa2_j_get_jt(const drmaa2_j j)
541{
542
543}
544
545drmaa2_error
546drmaa2_j_suspend(drmaa2_j j)
547{
548
549}
550
551drmaa2_error
552drmaa2_j_resume(drmaa2_j j)
553{
554
555}
556
557drmaa2_error
558drmaa2_j_hold(drmaa2_j j)
559{
560
561}
562
563drmaa2_error
564drmaa2_j_release(drmaa2_j j)
565{
566}
567
568drmaa2_error
569drmaa2_j_terminate(drmaa2_j j)
570{
571}
572
573drmaa2_jstate
574drmaa2_j_get_state(const drmaa2_j j, drmaa2_string * substate)
575{
576}
577
578drmaa2_jinfo
579drmaa2_j_get_info(const drmaa2_j j)
580{
581}
582
583drmaa2_error
584drmaa2_j_wait_started(const drmaa2_j j, const time_t timeout)
585{
586}
587
588drmaa2_error
589drmaa2_j_wait_terminated(const drmaa2_j j, const time_t timeout)
590{
591}
592
593
594drmaa2_r_list
595drmaa2_msession_get_all_reservations(const drmaa2_msession ms)
596{
597}
598
599drmaa2_j_list
600drmaa2_msession_get_all_jobs(const drmaa2_msession ms, const drmaa2_jinfo filter)
601{
602}
603
604drmaa2_queueinfo_list
605drmaa2_msession_get_all_queues(const drmaa2_msession ms, const drmaa2_string_list names)
606{
607}
608
609drmaa2_machineinfo_list
610drmaa2_msession_get_all_machines(const drmaa2_msession ms, const drmaa2_string_list names)
611{
612}
613
614drmaa2_string
615drmaa2_get_drms_name (void)
616{
617}
618
619drmaa2_version
620drmaa2_get_drms_version (void)
621{
622}
623
624drmaa2_string
625drmaa2_get_drmaa_name (void)
626{
627}
628
629drmaa2_version
630drmaa2_get_drmaa_version (void)
631{
632}
633
634drmaa2_bool
635drmaa2_supports (const drmaa2_capability c)
636{
637}
638
639drmaa2_jsession
640drmaa2_create_jsession(const char * session_name, const char * contact)
641{
642}
643
644drmaa2_rsession
645drmaa2_create_rsession(const char * session_name, const char * contact)
646{
647}
648
649drmaa2_jsession
650drmaa2_open_jsession(const char * session_name)
651{
652}
653
654drmaa2_rsession
655drmaa2_open_rsession(const char * session_name)
656{
657}
658
659drmaa2_msession
660drmaa2_open_msession(const char * session_name)
661{
662}
663
664drmaa2_error
665drmaa2_close_jsession(drmaa2_jsession js)
666{
667}
668
669drmaa2_error
670drmaa2_close_rsession(drmaa2_rsession rs)
671{
672}
673
674drmaa2_error
675drmaa2_close_msession(drmaa2_msession ms)
676{
677}
678
679drmaa2_error
680drmaa2_destroy_jsession(const char * session_name)
681{
682}
683
684drmaa2_error
685drmaa2_destroy_rsession(const char * session_name)
686{
687}
688
689drmaa2_string_list
690drmaa2_get_jsession_names(void)
691{
692}
693
694drmaa2_string_list
695drmaa2_get_rsession_names(void)
696{
697}
698
699drmaa2_error
700drmaa2_register_event_notification(const drmaa2_callback callback)
701{
702}
703
704
705
706
707#if 0
708
709int
710drmaa_init(
711                const char *contact,
712                char *error_diagnosis, size_t error_diag_len
713                )
714{
715        DRMAA_API_BEGIN
716        fsd_drmaa_singletone_t *global = &_fsd_drmaa_singletone;
717        fsd_log_enter(( "(contact=%s)", contact ));
718
719        fsd_mutex_lock( &global->session_mutex );
720        TRY
721         {
722                if( global->session != NULL )
723                        fsd_exc_raise_code( FSD_DRMAA_ERRNO_ALREADY_ACTIVE_SESSION );
724                global->session = global->new_session( global, contact );
725         }
726        FINALLY
727         { fsd_mutex_unlock( &global->session_mutex ); }
728        END_TRY
729
730        fsd_log_return(( " =0" ));
731        DRMAA_API_END
732}
733
734
735int
736drmaa_exit( char *error_diagnosis, size_t error_diag_len )
737{
738        DRMAA_API_BEGIN
739        fsd_drmaa_singletone_t *global = &_fsd_drmaa_singletone;
740        fsd_log_enter(( "()" ));
741
742        fsd_mutex_lock( &global->session_mutex );
743        TRY
744         {
745                if( global->session != NULL )
746                 {
747                        global->session->destroy( global->session );
748                        global->session = NULL;
749                 }
750                else
751                 {
752                        fsd_exc_raise_code( FSD_DRMAA_ERRNO_NO_ACTIVE_SESSION );
753                 }
754         }
755        FINALLY
756         { fsd_mutex_unlock( &global->session_mutex ); }
757        END_TRY
758
759        fsd_log_return(( " =0" ));
760        DRMAA_API_END
761}
762
763
764int
765drmaa_allocate_job_template(
766                drmaa_job_template_t **p_jt,
767                char *error_diagnosis, size_t error_diag_len
768                )
769{
770        DRMAA_API_BEGIN
771        fsd_drmaa_singletone_t *global = &_fsd_drmaa_singletone;
772        fsd_log_enter((""));
773        *p_jt = (drmaa_job_template_t*)global->new_job_template( global );
774        fsd_log_return(( " =0: jt=%p", (void*)*p_jt ));
775        DRMAA_API_END
776}
777
778
779int
780drmaa_delete_job_template(
781                drmaa_job_template_t *drmaa_jt,
782                char *error_diagnosis, size_t error_diag_len
783                )
784{
785        DRMAA_API_BEGIN
786        fsd_template_t *jt = (fsd_template_t*)drmaa_jt;
787        fsd_log_enter(( "(%p)", (void*)jt ));
788        if( jt != NULL )
789                jt->destroy( jt );
790        fsd_log_return(( " =0" ));
791        DRMAA_API_END
792}
793
794
795int
796drmaa_set_attribute(
797                drmaa_job_template_t *drmaa_jt,
798                const char *name, const char *value,
799                char *error_diagnosis, size_t error_diag_len
800                )
801{
802        DRMAA_API_BEGIN
803        fsd_template_t *jt = (fsd_template_t*)drmaa_jt;
804        fsd_log_enter(( "(jt=%p, name='%s', value='%s')",
805                                (void*)drmaa_jt, name, value ));
806        if( jt != NULL  &&  name != NULL )
807                jt->set_attr( jt, name, value );
808        else
809                fsd_exc_raise_code( FSD_ERRNO_INVALID_ARGUMENT );
810        fsd_log_return(( " =0" ));
811        DRMAA_API_END
812}
813
814
815int
816drmaa_get_attribute(
817        drmaa_job_template_t *drmaa_jt,
818        const char *name, char *value, size_t value_len,
819        char *error_diagnosis, size_t error_diag_len
820        )
821{
822        DRMAA_API_BEGIN
823        fsd_template_t *jt = (fsd_template_t*)drmaa_jt;
824        const char *v = NULL;
825        fsd_log_enter(( "(jt=%p, name='%s')", (void*)drmaa_jt, name ));
826        if( jt == NULL || name == NULL || value == NULL )
827                fsd_exc_raise_code( FSD_ERRNO_INVALID_ARGUMENT );
828        v = jt->get_attr( jt, name );
829        if( v == NULL )
830                v = "";
831        strlcpy( value, v, value_len );
832        fsd_log_return(( " =0: '%s'", value ));
833        DRMAA_API_END
834}
835
836
837int
838drmaa_set_vector_attribute(
839                drmaa_job_template_t *drmaa_jt,
840                const char *name, const char *value[],
841                char *error_diagnosis, size_t error_diag_len
842                )
843{
844        DRMAA_API_BEGIN
845        fsd_template_t *jt = (fsd_template_t*)drmaa_jt;
846        fsd_log_enter(( "(jt=%p, name='%s', value=...)",
847                                (void*)drmaa_jt, name ));
848        if( jt == NULL || name == NULL )
849                fsd_exc_raise_code( FSD_ERRNO_INVALID_ARGUMENT );
850        jt->set_v_attr( jt, name, value );
851        fsd_log_return(( " =0" ));
852        DRMAA_API_END
853}
854
855
856int
857drmaa_get_vector_attribute(
858                drmaa_job_template_t *drmaa_jt,
859                const char *name, drmaa_attr_values_t **out_values,
860                char *error_diagnosis, size_t error_diag_len
861                )
862{
863        DRMAA_API_BEGIN
864        fsd_template_t *jt = (fsd_template_t*)drmaa_jt;
865
866        fsd_log_enter(( "(jt=%p, name='%s')", (void*)drmaa_jt, name ));
867        if( jt == NULL || name == NULL || out_values == NULL )
868                fsd_exc_raise_code( FSD_ERRNO_INVALID_ARGUMENT );
869        *out_values = NULL;
870        *out_values = (drmaa_attr_values_t*)fsd_iter_new(
871                        fsd_copy_vector( jt->get_v_attr( jt, name ) ), -1 );
872        fsd_log_return(( " =0" ));
873
874        DRMAA_API_END
875}
876
877
878int
879drmaa_get_attribute_names(
880                drmaa_attr_names_t **values,
881                char *error_diagnosis, size_t error_diag_len )
882{
883        DRMAA_API_BEGIN
884        fsd_drmaa_singletone_t *global = &_fsd_drmaa_singletone;
885        *values = (drmaa_attr_names_t*)global->get_attribute_names( global );
886        DRMAA_API_END
887}
888
889
890int
891drmaa_get_vector_attribute_names(
892                drmaa_attr_names_t **values,
893                char *error_diagnosis, size_t error_diag_len )
894{
895        DRMAA_API_BEGIN
896        fsd_drmaa_singletone_t *global = &_fsd_drmaa_singletone;
897        *values = (drmaa_attr_names_t*)global->get_vector_attribute_names( global );
898        DRMAA_API_END
899}
900
901
902#define iter_function(name, type) \
903int drmaa_get_next_##name( type *values, char *value, size_t value_len ) \
904{ \
905        char error_diagnosis[1]; \
906        size_t error_diag_len = sizeof(error_diagnosis); \
907        DRMAA_API_BEGIN \
908        fsd_iter_t *iter = (fsd_iter_t*)values; \
909        strlcpy( value, iter->next(iter), value_len ); \
910        DRMAA_API_END \
911} \
912int drmaa_get_num_##name##s( type *values, size_t *size ) \
913{ \
914        char error_diagnosis[1]; \
915        size_t error_diag_len = sizeof(error_diagnosis); \
916        DRMAA_API_BEGIN \
917        fsd_iter_t *iter = (fsd_iter_t*)values; \
918        *size = iter->len(iter); \
919        DRMAA_API_END \
920} \
921void drmaa_release_##name##s( type *values ) \
922{ \
923        fsd_iter_t *iter = (fsd_iter_t*)values; \
924        iter->destroy(iter); \
925}
926
927iter_function(attr_name, drmaa_attr_names_t)
928iter_function(attr_value, drmaa_attr_values_t)
929iter_function(job_id, drmaa_job_ids_t)
930
931#undef iter_function
932
933
934int
935drmaa_control(
936                const char *job_id, int action,
937                char *error_diagnosis, size_t error_diag_len
938                )
939{
940        DRMAA_API_BEGIN
941        fsd_drmaa_session_t *volatile session = NULL;
942
943        fsd_log_enter(( "(job_id=%s, action=%s)",
944                                job_id, drmaa_control_to_str(action) ));
945
946        if( job_id == NULL )
947                fsd_exc_raise_code( FSD_ERRNO_INVALID_ARGUMENT );
948
949        TRY
950         {
951                session = fsd_drmaa_session_get();
952                session->control_job( session, job_id, action );
953         }
954        FINALLY
955         {
956                if( session )
957                        session->release( session );
958         }
959        END_TRY
960
961        fsd_log_return(( " =0" ));
962        DRMAA_API_END
963}
964
965
966
967int
968drmaa_job_ps(
969                const char *job_id, int *remote_ps,
970                char *error_diagnosis, size_t error_diag_len
971                )
972{
973        DRMAA_API_BEGIN
974        fsd_drmaa_session_t *volatile session = NULL;
975
976        fsd_log_enter(( "(job_id=%s)", job_id ));
977        if( job_id == NULL )
978                fsd_exc_raise_code( FSD_ERRNO_INVALID_ARGUMENT );
979
980        TRY
981         {
982                session = fsd_drmaa_session_get();
983                session->job_ps( session, job_id, remote_ps );
984         }
985        FINALLY
986         {
987                if( session )
988                        session->release( session );
989         }
990        END_TRY
991
992        fsd_log_return(( "(job_id=%s) =0: remote_ps=%s (0x%02x)",
993                                job_id, drmaa_job_ps_to_str(*remote_ps), *remote_ps ));
994        DRMAA_API_END
995}
996
997
998
999int
1000drmaa_run_job(
1001                char *job_id, size_t job_id_len,
1002                const drmaa_job_template_t *jt,
1003                char *error_diagnosis, size_t error_diag_len
1004                )
1005{
1006        DRMAA_API_BEGIN
1007        fsd_drmaa_session_t *volatile session = NULL;
1008        char *volatile job_id_buf = NULL;
1009        fsd_log_enter(( "(jt=%p)", (void*)jt ));
1010        TRY
1011         {
1012                session = fsd_drmaa_session_get();
1013                job_id_buf = session->run_job( session, (fsd_template_t*)jt ),
1014                strlcpy( job_id, job_id_buf, job_id_len );
1015         }
1016        FINALLY
1017         {
1018                if( session )
1019                        session->release( session );
1020                fsd_free( job_id_buf );
1021         }
1022        END_TRY
1023
1024        fsd_log_return(( " =0: job_id=%s", job_id ));
1025        DRMAA_API_END
1026}
1027
1028
1029int
1030drmaa_run_bulk_jobs(
1031                drmaa_job_ids_t **job_ids,
1032                const drmaa_job_template_t *jt,
1033                int start, int end, int incr,
1034                char *error_diagnosis, size_t error_diag_len
1035                )
1036{
1037        DRMAA_API_BEGIN
1038        fsd_drmaa_session_t *volatile session = NULL;
1039        fsd_log_enter(( "(jt=%p, start=%d, end=%d, incr=%d)",
1040                (void*)jt, start, end, incr ));
1041        TRY
1042         {
1043                if( incr > 0 )
1044                 {
1045                        if( !(0 < start  &&  start <= end) )
1046                                fsd_exc_raise_code( FSD_ERRNO_INVALID_ARGUMENT );
1047                 }
1048                else if( incr < 0 )
1049                 {
1050                        if( !(start >= end  &&  end > 0) )
1051                                fsd_exc_raise_code( FSD_ERRNO_INVALID_ARGUMENT );
1052                 }
1053                else
1054                        fsd_exc_raise_code( FSD_ERRNO_INVALID_ARGUMENT );
1055
1056                session = fsd_drmaa_session_get();
1057                *job_ids = (drmaa_job_ids_t*)session->run_bulk(
1058                                session, (fsd_template_t*)jt,
1059                                start, end, incr
1060                                );
1061         }
1062        EXCEPT_DEFAULT
1063         {
1064                *job_ids = NULL;
1065                fsd_exc_reraise();
1066         }
1067        FINALLY
1068         {
1069                if( session )
1070                        session->release( session );
1071         }
1072        END_TRY
1073        fsd_log_return(( " =0" ));
1074        DRMAA_API_END
1075}
1076
1077
1078
1079static struct timespec *
1080drmaa_timeout_time( signed long timeout, struct timespec *ts )
1081{
1082        if( timeout == DRMAA_TIMEOUT_WAIT_FOREVER )
1083                return NULL;
1084        else
1085         {
1086                fsd_get_time( ts );
1087                if( timeout != DRMAA_TIMEOUT_NO_WAIT )
1088                        ts->tv_sec += timeout;
1089                return ts;
1090         }
1091}
1092
1093
1094int
1095drmaa_synchronize(
1096                const char **job_ids, signed long timeout,
1097                int dispose,
1098                char *error_diagnosis, size_t error_diag_len
1099                )
1100{
1101        DRMAA_API_BEGIN
1102        fsd_drmaa_session_t *volatile session = NULL;
1103        struct timespec ts;
1104
1105        fsd_log_enter(( "(job_ids={...}, timeout=%ld, dispose=%d)",
1106                        timeout, dispose ));
1107
1108        if( job_ids == NULL )
1109                fsd_exc_raise_code( FSD_ERRNO_INVALID_ARGUMENT );
1110
1111        TRY
1112         {
1113                session = fsd_drmaa_session_get();
1114                session->synchronize( session, job_ids,
1115                                drmaa_timeout_time(timeout, &ts), dispose );
1116         }
1117        FINALLY
1118         {
1119                if( session )
1120                        session->release( session );
1121         }
1122        END_TRY
1123
1124        fsd_log_return(( " =0" ));
1125        DRMAA_API_END
1126}
1127
1128
1129int
1130drmaa_wait(
1131                const char *job_id, char *job_id_out, size_t job_id_out_len,
1132                int *stat, signed long timeout, drmaa_attr_values_t **rusage,
1133                char *error_diagnosis, size_t error_diag_len
1134                )
1135{
1136        DRMAA_API_BEGIN
1137        fsd_drmaa_session_t *volatile session = NULL;
1138        struct timespec ts;
1139        char *result_job_id = NULL;
1140
1141        fsd_log_enter(( "(job_id=%s, timeout=%ld)", job_id, timeout ));
1142
1143        TRY
1144         {
1145                session = fsd_drmaa_session_get();
1146                result_job_id = session->wait(
1147                                session, job_id, drmaa_timeout_time(timeout, &ts),
1148                                stat, (fsd_iter_t**)rusage
1149                                );
1150                strlcpy( job_id_out, result_job_id, job_id_out_len );
1151         }
1152        FINALLY
1153         {
1154                fsd_free( result_job_id );
1155                if( session )
1156                        session->release( session );
1157         }
1158        END_TRY
1159
1160        fsd_log_return(( " =0: job_id=%s", job_id_out ));
1161        DRMAA_API_END
1162}
1163
1164
1165#if 0
1166int
1167drmaa_get_contact(
1168                char *contact, size_t contact_len,
1169                char *error_diagnosis, size_t error_diag_len
1170                )
1171{
1172        DRMAA_API_BEGIN
1173        drmaa_session_t *volatile session = NULL;
1174        const drmaa_implementation_info_t *impl_info = NULL;
1175        const char *result = NULL;
1176
1177        impl_info = drmaa_get_implementation_info();
1178        TRY
1179         {
1180                session = drmaa_session_get();
1181                if( session->contact )
1182                        result = session->contact;
1183                else
1184                        result = impl_info->default_contact;
1185                strlcpy( contact, result, contact_len );
1186         }
1187        EXCEPT( FSD_DRMAA_ERRNO_NO_ACTIVE_SESSION )
1188         {
1189                result = impl_info->default_contact;
1190                strlcpy( contact, result, contact_len );
1191         }
1192        FINALLY
1193         {
1194                drmaa_session_release( session );
1195         }
1196        END_TRY
1197
1198        DRMAA_API_END
1199}
1200#endif
1201
1202
1203int
1204drmaa_get_contact(
1205                char *contact, size_t contact_len,
1206                char *error_diagnosis, size_t error_diag_len
1207                )
1208{
1209        DRMAA_API_BEGIN
1210        fsd_drmaa_singletone_t *global = &_fsd_drmaa_singletone;
1211        fsd_log_enter(( "" ));
1212        strlcpy( contact, global->get_contact( global ), contact_len );
1213        fsd_log_return(( " =0: %s", contact ));
1214        DRMAA_API_END
1215}
1216
1217
1218int
1219drmaa_version(
1220                unsigned int *major, unsigned int *minor,
1221                char *error_diagnosis, size_t error_diag_len
1222                )
1223{
1224        DRMAA_API_BEGIN
1225        fsd_drmaa_singletone_t *global = &_fsd_drmaa_singletone;
1226        fsd_log_enter(( "" ));
1227        global->get_version( global, major, minor );
1228        fsd_log_return(( " =0: %d.%d", *major, *minor ));
1229        DRMAA_API_END
1230}
1231
1232
1233int
1234drmaa_get_DRM_system(
1235                char *drm_system, size_t drm_system_len,
1236                char *error_diagnosis, size_t error_diag_len
1237                )
1238{
1239        DRMAA_API_BEGIN
1240        fsd_drmaa_singletone_t *global = &_fsd_drmaa_singletone;
1241        fsd_log_enter(( "" ));
1242        strlcpy( drm_system, global->get_DRM_system( global ), drm_system_len );
1243        fsd_log_return(( " =0: %s", drm_system ));
1244        DRMAA_API_END
1245}
1246
1247
1248int
1249drmaa_get_DRMAA_implementation(
1250                char *drmaa_impl, size_t drmaa_impl_len,
1251                char *error_diagnosis, size_t error_diag_len
1252                )
1253{
1254        DRMAA_API_BEGIN
1255        fsd_drmaa_singletone_t *global = &_fsd_drmaa_singletone;
1256        fsd_log_enter(( "" ));
1257        strlcpy( drmaa_impl, global->get_DRMAA_implementation( global ),
1258                        drmaa_impl_len );
1259        fsd_log_return(( " =0: %s", drmaa_impl ));
1260        DRMAA_API_END
1261}
1262
1263
1264const char *
1265drmaa_strerror( int drmaa_errno )
1266{
1267        return fsd_drmaa_strerror( drmaa_errno );
1268}
1269
1270
1271int
1272drmaa_read_configuration_file(
1273                const char *filename, int must_exist,
1274                char *error_diagnosis, size_t error_diag_len
1275                )
1276{
1277        fsd_drmaa_session_t *volatile session = NULL;
1278
1279        DRMAA_API_BEGIN
1280        fsd_log_enter(( "(filename=%s)", filename ));
1281        TRY
1282         {
1283                session = fsd_drmaa_session_get();
1284                session->read_configuration(
1285                                session, filename, must_exist, NULL, 0 );
1286         }
1287        FINALLY
1288         {
1289                if( session )
1290                        session->release( session );
1291         }
1292        END_TRY
1293
1294        fsd_log_return(( " =0" ));
1295        DRMAA_API_END
1296}
1297
1298
1299int
1300drmaa_read_configuration(
1301                const char *configuration, size_t configuration_len,
1302                char *error_diagnosis, size_t error_diag_len
1303                )
1304{
1305        DRMAA_API_BEGIN
1306        fsd_drmaa_session_t *volatile session = NULL;
1307        fsd_log_enter(( "(configuration=\"%.*s\")",
1308                                (int)configuration_len, configuration ));
1309        TRY
1310         {
1311                session = fsd_drmaa_session_get();
1312                session->read_configuration(
1313                                session, NULL, false, configuration, configuration_len );
1314         }
1315        FINALLY
1316         {
1317                if( session )
1318                        session->release( session );
1319         }
1320        END_TRY
1321        fsd_log_return(( " =0" ));
1322        DRMAA_API_END
1323}
1324
1325
1326
1327fsd_drmaa_session_t *
1328fsd_drmaa_session_get(void)
1329{
1330        fsd_drmaa_session_t *self = NULL;
1331        fsd_mutex_lock( &_fsd_drmaa_singletone.session_mutex );
1332        self = _fsd_drmaa_singletone.session;
1333        fsd_mutex_unlock( &_fsd_drmaa_singletone.session_mutex );
1334        if( self != NULL )
1335         {
1336                fsd_mutex_lock( &self->mutex );
1337                self->ref_cnt ++;
1338                fsd_mutex_unlock( &self->mutex );
1339         }
1340        else
1341                fsd_exc_raise_code( FSD_DRMAA_ERRNO_NO_ACTIVE_SESSION );
1342        return self;
1343}
1344
1345
1346#define wiffunc( name, args_decl, args_list ) \
1347int drmaa_##name args_decl \
1348{ \
1349        return _fsd_drmaa_singletone.name args_list;\
1350}
1351
1352wiffunc(
1353                wifexited,
1354                (       int *exited, int stat, char *error_diagnosis, size_t error_diag_len ),
1355                ( exited, stat, error_diagnosis, error_diag_len )
1356                )
1357
1358wiffunc(
1359                wexitstatus,
1360                (       int *exit_status, int stat,
1361                        char *error_diagnosis, size_t error_diag_len ),
1362                ( exit_status, stat, error_diagnosis, error_diag_len )
1363                )
1364
1365wiffunc(
1366                wifsignaled,
1367                (       int *signaled, int stat, char *error_diagnosis, size_t error_diag_len ),
1368                ( signaled, stat, error_diagnosis, error_diag_len )
1369                )
1370
1371wiffunc(
1372                wtermsig,
1373                (       char *signal, size_t signal_len, int stat,
1374                        char *error_diagnosis, size_t error_diag_len ),
1375                ( signal, signal_len, stat, error_diagnosis, error_diag_len )
1376                )
1377
1378wiffunc(
1379                wcoredump,
1380                (       int *core_dumped, int stat,
1381                        char *error_diagnosis, size_t error_diag_len ),
1382                ( core_dumped, stat, error_diagnosis, error_diag_len )
1383                )
1384
1385wiffunc(
1386                wifaborted,
1387                (       int *aborted, int stat, char *error_diagnosis, size_t error_diag_len ),
1388                ( aborted, stat, error_diagnosis, error_diag_len )
1389                )
1390
1391#endif
Note: See TracBrowser for help on using the repository browser.