115 lines
4.7 KiB
C
115 lines
4.7 KiB
C
/*********************************************************************/
|
|
/* Copyright 2009, 2010 The University of Texas at Austin. */
|
|
/* All rights reserved. */
|
|
/* */
|
|
/* Redistribution and use in source and binary forms, with or */
|
|
/* without modification, are permitted provided that the following */
|
|
/* conditions are met: */
|
|
/* */
|
|
/* 1. Redistributions of source code must retain the above */
|
|
/* copyright notice, this list of conditions and the following */
|
|
/* disclaimer. */
|
|
/* */
|
|
/* 2. Redistributions in binary form must reproduce the above */
|
|
/* copyright notice, this list of conditions and the following */
|
|
/* disclaimer in the documentation and/or other materials */
|
|
/* provided with the distribution. */
|
|
/* */
|
|
/* THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF TEXAS AT */
|
|
/* AUSTIN ``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 UNIVERSITY OF TEXAS AT */
|
|
/* AUSTIN 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. */
|
|
/* */
|
|
/* The views and conclusions contained in the software and */
|
|
/* documentation are those of the authors and should not be */
|
|
/* interpreted as representing official policies, either expressed */
|
|
/* or implied, of The University of Texas at Austin. */
|
|
/*********************************************************************/
|
|
|
|
#include <limits.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "common.h"
|
|
|
|
#if defined(OS_WINDOWS) && (defined(__MINGW32__) || defined(__MINGW64__))
|
|
#include <conio.h>
|
|
#undef printf
|
|
#define printf _cprintf
|
|
#endif
|
|
|
|
#define MSGFMT " ** On entry to %6.*s parameter number %2lld had an illegal value\n"
|
|
|
|
static size_t openblas_xerbla_name_length(const char *message,
|
|
blasint length) {
|
|
const char *terminator;
|
|
|
|
if (message == NULL || length <= 0) return 0;
|
|
|
|
terminator = memchr(message, '\0', (size_t)length);
|
|
if (terminator != NULL) return (size_t)(terminator - message);
|
|
|
|
return (size_t)length;
|
|
}
|
|
|
|
static void openblas_xerbla_default(const char *message, const blasint *info,
|
|
size_t length) {
|
|
int precision = length > INT_MAX ? INT_MAX : (int)length;
|
|
|
|
printf(MSGFMT, precision, message == NULL ? "" : message,
|
|
(long long)*info);
|
|
}
|
|
|
|
static openblas_xerbla_handler openblas_xerbla = openblas_xerbla_default;
|
|
static volatile BLASULONG openblas_xerbla_lock = 0;
|
|
|
|
OPENBLAS_EXPORT openblas_xerbla_handler
|
|
openblas_set_xerbla(openblas_xerbla_handler handler) {
|
|
openblas_xerbla_handler previous;
|
|
|
|
if (handler == NULL) handler = openblas_xerbla_default;
|
|
|
|
blas_lock(&openblas_xerbla_lock);
|
|
previous = openblas_xerbla;
|
|
openblas_xerbla = handler;
|
|
blas_unlock(&openblas_xerbla_lock);
|
|
|
|
return previous;
|
|
}
|
|
|
|
static int openblas_xerbla_dispatch(char *message, blasint *info,
|
|
blasint length) {
|
|
openblas_xerbla_handler handler;
|
|
size_t name_length = openblas_xerbla_name_length(message, length);
|
|
|
|
blas_lock(&openblas_xerbla_lock);
|
|
handler = openblas_xerbla;
|
|
blas_unlock(&openblas_xerbla_lock);
|
|
|
|
handler(message, info, name_length);
|
|
return 0;
|
|
}
|
|
|
|
#ifdef __ELF__
|
|
int __xerbla(char *message, blasint *info, blasint length) {
|
|
return openblas_xerbla_dispatch(message, info, length);
|
|
}
|
|
|
|
int BLASFUNC(xerbla)(char *, blasint *, blasint)
|
|
__attribute__ ((weak, alias ("__xerbla")));
|
|
#else
|
|
int BLASFUNC(xerbla)(char *message, blasint *info, blasint length) {
|
|
return openblas_xerbla_dispatch(message, info, length);
|
|
}
|
|
#endif
|