diff options
Diffstat (limited to 'cxcore/src/cxerror.cpp')
-rw-r--r-- | cxcore/src/cxerror.cpp | 460 |
1 files changed, 460 insertions, 0 deletions
diff --git a/cxcore/src/cxerror.cpp b/cxcore/src/cxerror.cpp new file mode 100644 index 0000000..1901fad --- /dev/null +++ b/cxcore/src/cxerror.cpp @@ -0,0 +1,460 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// Intel License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000, Intel Corporation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of Intel Corporation may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#include "_cxcore.h" + +#if defined WIN32 || defined WIN64 +#include <windows.h> +#else +#include <pthread.h> +#endif + +typedef struct +{ + const char* file; + int line; +} +CvStackRecord; + +typedef struct CvContext +{ + int err_code; + int err_mode; + CvErrorCallback error_callback; + void* userdata; + char err_msg[4096]; + CvStackRecord err_ctx; +} CvContext; + +#if defined WIN32 || defined WIN64 +#define CV_DEFAULT_ERROR_CALLBACK cvGuiBoxReport +#else +#define CV_DEFAULT_ERROR_CALLBACK cvStdErrReport +#endif + +static CvContext* +icvCreateContext(void) +{ + CvContext* context = (CvContext*)malloc( sizeof(*context) ); + + context->err_mode = CV_ErrModeLeaf; + context->err_code = CV_StsOk; + + context->error_callback = CV_DEFAULT_ERROR_CALLBACK; + context->userdata = 0; + + return context; +} + +static void +icvDestroyContext(CvContext* context) +{ + free(context); +} + +#if defined WIN32 || defined WIN64 + static DWORD g_TlsIndex = TLS_OUT_OF_INDEXES; +#else + static pthread_key_t g_TlsIndex; +#endif + +static CvContext* +icvGetContext(void) +{ +#ifdef CV_DLL +#if defined WIN32 || defined WIN64 + CvContext* context; + + //assert(g_TlsIndex != TLS_OUT_OF_INDEXES); + if( g_TlsIndex == TLS_OUT_OF_INDEXES ) + { + g_TlsIndex = TlsAlloc(); + if( g_TlsIndex == TLS_OUT_OF_INDEXES ) + FatalAppExit( 0, "Only set CV_DLL for DLL usage" ); + } + + context = (CvContext*)TlsGetValue( g_TlsIndex ); + if( !context ) + { + context = icvCreateContext(); + if( !context ) + FatalAppExit( 0, "OpenCV. Problem to allocate memory for TLS OpenCV context." ); + + TlsSetValue( g_TlsIndex, context ); + } + return context; +#else + CvContext* context = (CvContext*)pthread_getspecific( g_TlsIndex ); + if( !context ) + { + context = icvCreateContext(); + if( !context ) + { + fprintf(stderr,"OpenCV. Problem to allocate memory for OpenCV context."); + exit(1); + } + pthread_setspecific( g_TlsIndex, context ); + } + return context; +#endif +#else /* static single-thread library case */ + static CvContext* context = 0; + + if( !context ) + context = icvCreateContext(); + + return context; +#endif +} + + +CV_IMPL int +cvStdErrReport( int code, const char *func_name, const char *err_msg, + const char *file, int line, void* ) +{ + if( code == CV_StsBackTrace || code == CV_StsAutoTrace ) + fprintf( stderr, "\tcalled from " ); + else + fprintf( stderr, "OpenCV ERROR: %s (%s)\n\tin function ", + cvErrorStr(code), err_msg ? err_msg : "no description" ); + + fprintf( stderr, "%s, %s(%d)\n", func_name ? func_name : "<unknown>", + file != NULL ? file : "", line ); + + if( cvGetErrMode() == CV_ErrModeLeaf ) + { + fprintf( stderr, "Terminating the application...\n" ); + return 1; + } + else + return 0; +} + + +CV_IMPL int +cvGuiBoxReport( int code, const char *func_name, const char *err_msg, + const char *file, int line, void* ) +{ +#if !defined WIN32 && !defined WIN64 + return cvStdErrReport( code, func_name, err_msg, file, line, 0 ); +#else + if( code != CV_StsBackTrace && code != CV_StsAutoTrace ) + { + size_t msg_len = strlen(err_msg ? err_msg : "") + 1024; + char* message = (char*)alloca(msg_len); + char title[100]; + + wsprintf( message, "%s (%s)\nin function %s, %s(%d)\n\n" + "Press \"Abort\" to terminate application.\n" + "Press \"Retry\" to debug (if the app is running under debugger).\n" + "Press \"Ignore\" to continue (this is not safe).\n", + cvErrorStr(code), err_msg ? err_msg : "no description", + func_name, file, line ); + + wsprintf( title, "OpenCV GUI Error Handler" ); + + int answer = MessageBox( NULL, message, title, MB_ICONERROR|MB_ABORTRETRYIGNORE|MB_SYSTEMMODAL ); + + if( answer == IDRETRY ) + { + CV_DBG_BREAK(); + } + return answer != IDIGNORE; + } + return 0; +#endif +} + + +CV_IMPL int cvNulDevReport( int /*code*/, const char* /*func_name*/, + const char* /*err_msg*/, const char* /*file*/, int /*line*/, void* ) +{ + return cvGetErrMode() == CV_ErrModeLeaf; +} + + +CV_IMPL CvErrorCallback +cvRedirectError( CvErrorCallback func, void* userdata, void** prev_userdata ) +{ + CvContext* context = icvGetContext(); + + CvErrorCallback old = context->error_callback; + if( prev_userdata ) + *prev_userdata = context->userdata; + if( func ) + { + context->error_callback = func; + context->userdata = userdata; + } + else + { + context->error_callback = CV_DEFAULT_ERROR_CALLBACK; + context->userdata = 0; + } + + return old; +} + + +CV_IMPL int cvGetErrInfo( const char** errorcode_desc, const char** description, + const char** filename, int* line ) +{ + int code = cvGetErrStatus(); + + if( errorcode_desc ) + *errorcode_desc = cvErrorStr( code ); + + if( code >= 0 ) + { + if( description ) + *description = 0; + if( filename ) + *filename = 0; + if( line ) + *line = 0; + } + else + { + CvContext* ctx = icvGetContext(); + + if( description ) + *description = ctx->err_msg; + if( filename ) + *filename = ctx->err_ctx.file; + if( line ) + *line = ctx->err_ctx.line; + } + + return code; +} + + +CV_IMPL const char* cvErrorStr( int status ) +{ + static char buf[256]; + + switch (status) + { + case CV_StsOk : return "No Error"; + case CV_StsBackTrace : return "Backtrace"; + case CV_StsError : return "Unspecified error"; + case CV_StsInternal : return "Internal error"; + case CV_StsNoMem : return "Insufficient memory"; + case CV_StsBadArg : return "Bad argument"; + case CV_StsNoConv : return "Iterations do not converge"; + case CV_StsAutoTrace : return "Autotrace call"; + case CV_StsBadSize : return "Incorrect size of input array"; + case CV_StsNullPtr : return "Null pointer"; + case CV_StsDivByZero : return "Divizion by zero occured"; + case CV_BadStep : return "Image step is wrong"; + case CV_StsInplaceNotSupported : return "Inplace operation is not supported"; + case CV_StsObjectNotFound : return "Requested object was not found"; + case CV_BadDepth : return "Input image depth is not supported by function"; + case CV_StsUnmatchedFormats : return "Formats of input arguments do not match"; + case CV_StsUnmatchedSizes : return "Sizes of input arguments do not match"; + case CV_StsOutOfRange : return "One of arguments\' values is out of range"; + case CV_StsUnsupportedFormat : return "Unsupported format or combination of formats"; + case CV_BadCOI : return "Input COI is not supported"; + case CV_BadNumChannels : return "Bad number of channels"; + case CV_StsBadFlag : return "Bad flag (parameter or structure field)"; + case CV_StsBadPoint : return "Bad parameter of type CvPoint"; + case CV_StsBadMask : return "Bad type of mask argument"; + case CV_StsParseError : return "Parsing error"; + case CV_StsNotImplemented : return "The function/feature is not implemented"; + case CV_StsBadMemBlock : return "Memory block has been corrupted"; + }; + + sprintf(buf, "Unknown %s code %d", status >= 0 ? "status":"error", status); + return buf; +} + +CV_IMPL int cvGetErrMode(void) +{ + return icvGetContext()->err_mode; +} + +CV_IMPL int cvSetErrMode( int mode ) +{ + CvContext* context = icvGetContext(); + int prev_mode = context->err_mode; + context->err_mode = mode; + return prev_mode; +} + +CV_IMPL int cvGetErrStatus() +{ + return icvGetContext()->err_code; +} + +CV_IMPL void cvSetErrStatus( int code ) +{ + icvGetContext()->err_code = code; +} + + +CV_IMPL void cvError( int code, const char* func_name, + const char* err_msg, + const char* file_name, int line ) +{ + if( code == CV_StsOk ) + cvSetErrStatus( code ); + else + { + CvContext* context = icvGetContext(); + + if( code != CV_StsBackTrace && code != CV_StsAutoTrace ) + { + char* message = context->err_msg; + context->err_code = code; + + strcpy( message, err_msg ); + context->err_ctx.file = file_name; + context->err_ctx.line = line; + } + + if( context->err_mode != CV_ErrModeSilent ) + { + int terminate = context->error_callback( code, func_name, err_msg, + file_name, line, context->userdata ); + if( terminate ) + { + CV_DBG_BREAK(); + //exit(-abs(terminate)); + } + } + } +} + + +/******************** End of implementation of profiling stuff *********************/ + + +/**********************DllMain********************************/ + +#if defined WIN32 || defined WIN64 +BOOL WINAPI DllMain( HINSTANCE, DWORD fdwReason, LPVOID ) +{ + CvContext *pContext; + + switch (fdwReason) + { + case DLL_PROCESS_ATTACH: + g_TlsIndex = TlsAlloc(); + if( g_TlsIndex == TLS_OUT_OF_INDEXES ) return FALSE; + //break; + + case DLL_THREAD_ATTACH: + pContext = icvCreateContext(); + if( pContext == NULL) + return FALSE; + TlsSetValue( g_TlsIndex, (LPVOID)pContext ); + break; + + case DLL_THREAD_DETACH: + if( g_TlsIndex != TLS_OUT_OF_INDEXES ) + { + pContext = (CvContext*)TlsGetValue( g_TlsIndex ); + if( pContext != NULL ) + icvDestroyContext( pContext ); + } + break; + + case DLL_PROCESS_DETACH: + if( g_TlsIndex != TLS_OUT_OF_INDEXES ) + { + pContext = (CvContext*)TlsGetValue( g_TlsIndex ); + if( pContext != NULL ) + icvDestroyContext( pContext ); + } + TlsFree( g_TlsIndex ); + break; + default: + ; + } + return TRUE; +} +#else +/* POSIX pthread */ + +/* function - destructor of thread */ +void icvPthreadDestructor(void* key_val) +{ + CvContext* context = (CvContext*) key_val; + icvDestroyContext( context ); +} + +int pthrerr = pthread_key_create( &g_TlsIndex, icvPthreadDestructor ); + +#endif + +/* function, which converts int to int */ +CV_IMPL int +cvErrorFromIppStatus( int status ) +{ + switch (status) + { + case CV_BADSIZE_ERR: return CV_StsBadSize; + case CV_BADMEMBLOCK_ERR: return CV_StsBadMemBlock; + case CV_NULLPTR_ERR: return CV_StsNullPtr; + case CV_DIV_BY_ZERO_ERR: return CV_StsDivByZero; + case CV_BADSTEP_ERR: return CV_BadStep ; + case CV_OUTOFMEM_ERR: return CV_StsNoMem; + case CV_BADARG_ERR: return CV_StsBadArg; + case CV_NOTDEFINED_ERR: return CV_StsError; + case CV_INPLACE_NOT_SUPPORTED_ERR: return CV_StsInplaceNotSupported; + case CV_NOTFOUND_ERR: return CV_StsObjectNotFound; + case CV_BADCONVERGENCE_ERR: return CV_StsNoConv; + case CV_BADDEPTH_ERR: return CV_BadDepth; + case CV_UNMATCHED_FORMATS_ERR: return CV_StsUnmatchedFormats; + case CV_UNSUPPORTED_COI_ERR: return CV_BadCOI; + case CV_UNSUPPORTED_CHANNELS_ERR: return CV_BadNumChannels; + case CV_BADFLAG_ERR: return CV_StsBadFlag; + case CV_BADRANGE_ERR: return CV_StsBadArg; + case CV_BADCOEF_ERR: return CV_StsBadArg; + case CV_BADFACTOR_ERR: return CV_StsBadArg; + case CV_BADPOINT_ERR: return CV_StsBadPoint; + + default: return CV_StsError; + } +} +/* End of file */ + + |