/* $Id: exception.h 13 2011-04-20 15:41:43Z mmamonski $ */
/*
* PSNC DRMAA 2.0 utilities library
* Copyright (C) 2012 Poznan Supercomputing and Networking Center
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#ifndef __DRMAA_UTILS__EXCEPTION_H
#define __DRMAA_UTILS__EXCEPTION_H
#ifdef HAVE_CONFIG_H
# include
#endif
#include
#include
#include
#if defined(__GNUC__) && defined(DEBUGGING)
extern int setjmp( jmp_buf __env )
__attribute__(( returns_twice ));
#endif
/** Exception type. */
typedef struct fsd_exc_s fsd_exc_t;
fsd_exc_t *
fsd_exc_new( int code, char *message, bool own_message );
/** Exception structure. */
struct fsd_exc_s {
int (*code)( const fsd_exc_t* );
const char* (*message)( const fsd_exc_t* );
void (*destroy)( fsd_exc_t* );
int _code;
char *_message;
bool _own_message;
bool _own_self;
};
void
fsd_exc_raise( fsd_exc_t *exc )
__attribute__(( noreturn ));
void
fsd_exc_raise_code( int error_code )
__attribute__(( noreturn ));
void
fsd_exc_raise_msg( int error_code, const char *message )
__attribute__(( noreturn ));
void
fsd_exc_raise_fmt( int error_code, const char *fmt, ... )
__attribute__(( noreturn, format( printf, 2, 3 ) ));
void
fsd_exc_raise_fmtv( int error_code, const char *fmt, va_list args )
__attribute__(( noreturn ));
void
fsd_exc_raise_sys( int errno_code )
__attribute__(( noreturn ));
void
fsd_exc_reraise(void)
__attribute__(( noreturn ));
const fsd_exc_t *
fsd_exc_get(void);
void
fsd_exc_clear(void);
#define TRY \
{ \
fsd_exc_try_block_t* volatile _fsd_exc_try_block = NULL; \
int _fsd_exc_rc; \
_fsd_exc_try_block = fsd_exc_try( __FUNCTION__, __LINE__ ); \
if( _fsd_exc_try_block != NULL ) \
_fsd_exc_rc = setjmp( _fsd_exc_try_block->env ); \
else \
_fsd_exc_rc = FSD_ERRNO_EXC_END; \
while(1) \
{ \
bool _fsd_exc_handled = false; \
fsd_exc_control( _fsd_exc_try_block, &_fsd_exc_rc ); \
if( _fsd_exc_rc == FSD_ERRNO_EXC_END ) \
break; \
switch( _fsd_exc_rc ) \
{ \
case 0: {
#define EXCEPT(error_code) \
} break; \
case error_code: { \
_fsd_exc_handled = true;
#define EXCEPT_DEFAULT \
} break; \
default: \
if( _fsd_exc_rc > 0 ) \
{ \
_fsd_exc_handled = true;
#define FINALLY \
} break; \
case FSD_ERRNO_EXC_FINALLY: {
#define ELSE \
} break; \
case FSD_ERRNO_EXC_ELSE: {
#define END_TRY \
} break; \
} \
if( _fsd_exc_handled ) \
{ \
fsd_assert( _fsd_exc_try_block->handled_exc != NULL ); \
_fsd_exc_try_block->handled_exc->destroy( \
_fsd_exc_try_block->handled_exc ); \
_fsd_exc_try_block->handled_exc = NULL; \
} \
} \
}
/** The state of exception handling block. */
typedef enum {
FSD_EXC_ENTER, /**< Before try. */
FSD_EXC_TRY_BLOCK, /**< Insidie try-block. */
FSD_EXC_EXCEPTION_HANDLE, /**< Inside exception handling block. */
FSD_EXC_ELSE_BLOCK, /**< Inside else-block. */
FSD_EXC_FINALLY_BLOCK, /**< Inside finally block. */
FSD_EXC_LEAVE /**< Leaving try/except/finally block (after finally). */
} fsd_exc_try_block_state_t;
/**
* Try/except/else/finally block data structure.
* Holds the state for exception handling module.
*
* It also represents a point on the stack and other state of
* thread to wich it can be restored during "stack rollback"
* process after exception is raised.
*/
typedef struct fsd_exc_try_block_s {
jmp_buf env; /**< Stack restore point for \c longjmp. */
fsd_exc_t *handled_exc; /**< Exception handled within block */
fsd_exc_try_block_state_t state;
const char *function; /**< Name of function */
int lineno; /**< Line number where try-block starts */
} fsd_exc_try_block_t;
fsd_exc_try_block_t *
fsd_exc_try( const char *function, int lineno );
void
fsd_exc_control( fsd_exc_try_block_t *block, int *rc );
const char *
fsd_strerror( int error_code );
/** Error codes. */
typedef enum {
FSD_ERRNO_SUCCESS = 0,
FSD_ERRNO_EXC_ELSE = -1,
FSD_ERRNO_EXC_FINALLY = -2,
FSD_ERRNO_EXC_END = -3,
/* _FSD_ERRNO_START = 1000, */
FSD_ERRNO_INTERNAL_ERROR = 1001,
FSD_ERRNO_NO_MEMORY = 1002,
FSD_ERRNO_INVALID_ARGUMENT = 1003,
FSD_ERRNO_INVALID_VALUE = 1004,
FSD_ERRNO_INVALID_VALUE_FORMAT = 1005,
FSD_ERRNO_STOP_ITERATION = 1006,
FSD_ERRNO_NOT_IMPLEMENTED = 1007,
FSD_ERRNO_NOT_INITIALIZED = 1008,
FSD_ERRNO_TIMEOUT = 1009,
FSD_ERRNO_AUTH_FAILURE = 1010,
FSD_ERRNO_AUTHZ_FAILURE = 1011,
FSD_ERRNO_TRY_LATER = 1012,
FSD_ERRNO_DRM_COMMUNICATION_FAILURE = 1013,
FSD_ERRNO_DRMS_INIT_FAILED = 1014,
FSD_ERRNO_DRMS_EXIT_ERROR = 1015,
FSD_ERRNO_DENIED_BY_DRM = 1016,
/* DRMAA specific error codes: */
FSD_DRMAA_ERRNO_NO_ACTIVE_SESSION = 1032,
FSD_DRMAA_ERRNO_INVALID_CONTACT_STRING = 1033,
FSD_DRMAA_ERRNO_DEFAULT_CONTACT_STRING_ERROR = 1034,
FSD_DRMAA_ERRNO_NO_DEFAULT_CONTACT_STRING_SELECTED = 1035,
FSD_DRMAA_ERRNO_ALREADY_ACTIVE_SESSION = 1036,
FSD_DRMAA_ERRNO_INVALID_ATTRIBUTE_FORMAT = 1037,
FSD_DRMAA_ERRNO_INVALID_ATTRIBUTE_VALUE = 1038,
FSD_DRMAA_ERRNO_CONFLICTING_ATTRIBUTE_VALUES = 1039,
FSD_DRMAA_ERRNO_INVALID_JOB = 1040,
FSD_DRMAA_ERRNO_RESUME_INCONSISTENT_STATE = 1041,
FSD_DRMAA_ERRNO_SUSPEND_INCONSISTENT_STATE = 1042,
FSD_DRMAA_ERRNO_HOLD_INCONSISTENT_STATE = 1043,
FSD_DRMAA_ERRNO_RELEASE_INCONSISTENT_STATE = 1044,
FSD_DRMAA_ERRNO_EXIT_TIMEOUT = 1045,
FSD_DRMAA_ERRNO_NO_RUSAGE = 1046,
/* ARes specific error codes: */
FSD_ARES_ERRNO_INVALID_CONTACT_STRING = 1052,
FSD_ARES_ERRNO_INVALID_ATTRIBUTE_FORMAT = 1053,
FSD_ARES_ERRNO_INVALID_ATTRIBUTE_VALUE = 1054,
FSD_ARES_ERRNO_CONFLICTING_ATTRIBUTE_VALUES = 1055,
FSD_ARES_ERRNO_INVALID_ARES = 1056,
FSD_MIN_ERRNO = FSD_ERRNO_INTERNAL_ERROR,
FSD_MAX_ERRNO = FSD_ARES_ERRNO_INVALID_ARES
} fsd_errno_t;
#ifndef NDEBUG
# define fsd_assert( precondition ) \
do { \
if( ! (precondition) ) \
fsd_assertion_failed( __FILE__, __LINE__, \
__FUNCTION__, #precondition ); \
} while(0)
#else
# define fsd_assert( precondition ) do{/* nothing */}while(0)
#endif
void
fsd_assertion_failed( const char *file, int lineno,
const char *function, const char *precondition )
__attribute__(( noreturn ));
void *
fsd_exc_try_except(
void*(*f)(void*), void *data,
int *error_code,
char **error_message
);
#endif /* __DRMAA_UTILS__EXCEPTION_H */