Add mxs_strerror

Thread-safe version of strerror; thread local buffer used for storing
the message. The performance penalty of a thread local buffer is not
likely to be significant, since this is only called in an error
situation that anyway is likely to interrupt the normal processing.
This commit is contained in:
Johan Wikman 2017-02-13 16:13:26 +02:00 committed by Markus Mäkelä
parent 405b944abb
commit 82247f9143
2 changed files with 25 additions and 0 deletions

View File

@ -196,4 +196,21 @@ enum
trailing NULL. If longer, it will be cut. */
};
/**
* Return a thread specific pointer to a string describing the error
* code passed as argument. The string is obtained using strerror_r.
*
* @param error One of the errno error codes.
*
* @return Thread specific pointer to string describing the error code.
*
* @attention The function is thread safe, but not re-entrant. That is,
* calling it twice with different error codes between two sequence points
* will not work. E.g:
*
* printf("EINVAL = %s, EACCESS = %s",
* mxs_strerror(EINVAL), mxs_strerror(EACCESS));
*/
const char* mxs_strerror(int error);
MXS_END_DECLS

View File

@ -24,6 +24,7 @@
#include <errno.h>
#include <syslog.h>
#include <maxscale/atomic.h>
#include <maxscale/platform.h>
#include <maxscale/hashtable.h>
#include <maxscale/spinlock.h>
@ -3011,3 +3012,10 @@ int mxs_log_message(int priority,
return err;
}
const char* mxs_strerror(int error)
{
static thread_local char errbuf[MXS_STRERROR_BUFLEN];
return strerror_r(error, errbuf, sizeof(errbuf));
}