Added support for Guru Mediation, and raising a guru mediation if refCount <= 0 but decrRefCount is called against such an object

This commit is contained in:
antirez 2010-04-17 11:35:05 +02:00
parent 55017f9da0
commit c651fd9ee3

12
redis.c
View File

@ -237,7 +237,9 @@ static char* strencoding[] = {
/* We can print the stacktrace, so our assert is defined this way: */
#define redisAssert(_e) ((_e)?(void)0 : (_redisAssert(#_e,__FILE__,__LINE__),_exit(1)))
#define redisPanic(_e) _redisPanic(#_e,__FILE__,__LINE__),_exit(1)
static void _redisAssert(char *estr, char *file, int line);
static void _redisPanic(char *msg, char *file, int line);
/*================================= Data types ============================== */
@ -2851,6 +2853,7 @@ static void incrRefCount(robj *o) {
static void decrRefCount(void *obj) {
robj *o = obj;
if (o->refcount <= 0) redisPanic("decrRefCount against refcount <= 0");
/* Object is a key of a swapped out value, or in the process of being
* loaded. */
if (server.vm_enabled &&
@ -9859,6 +9862,15 @@ static void _redisAssert(char *estr, char *file, int line) {
#endif
}
static void _redisPanic(char *msg, char *file, int line) {
redisLog(REDIS_WARNING,"!!! Software Failure. Press left mouse button to continue");
redisLog(REDIS_WARNING,"Guru Mediation: %s #%s:%d",msg,file,line);
#ifdef HAVE_BACKTRACE
redisLog(REDIS_WARNING,"(forcing SIGSEGV in order to print the stack trace)");
*((char*)-1) = 'x';
#endif
}
/* =================================== Main! ================================ */
#ifdef __linux__