| 403 | } |
| 404 | |
| 405 | void decrRefCount(robj_roptr o) { |
| 406 | if (o->getrefcount(std::memory_order_relaxed) == OBJ_SHARED_REFCOUNT) |
| 407 | return; |
| 408 | unsigned prev = o->release(); |
| 409 | if (prev == 1) { |
| 410 | switch(o->type) { |
| 411 | case OBJ_STRING: freeStringObject(o); break; |
| 412 | case OBJ_LIST: freeListObject(o); break; |
| 413 | case OBJ_SET: freeSetObject(o); break; |
| 414 | case OBJ_ZSET: freeZsetObject(o); break; |
| 415 | case OBJ_HASH: freeHashObject(o); break; |
| 416 | case OBJ_MODULE: freeModuleObject(o); break; |
| 417 | case OBJ_STREAM: freeStreamObject(o); break; |
| 418 | case OBJ_CRON: freeCronObject(o); break; |
| 419 | case OBJ_NESTEDHASH: freeNestedHashObject(o); break; |
| 420 | default: serverPanic("Unknown object type"); break; |
| 421 | } |
| 422 | o->~redisObject(); |
| 423 | if (g_pserver->fActiveReplica) { |
| 424 | zfree(reinterpret_cast<redisObjectExtended*>(o.unsafe_robjcast())-1); |
| 425 | } else { |
| 426 | zfree(o.unsafe_robjcast()); |
| 427 | } |
| 428 | } else { |
| 429 | if (prev <= 0) serverPanic("decrRefCount against refcount <= 0"); |
| 430 | } |
| 431 | } |
| 432 | |
| 433 | /* This variant of decrRefCount() gets its argument as void, and is useful |
| 434 | * as free method in data structures that expect a 'void free_object(void*)' |
no test coverage detected