aboutsummaryrefslogtreecommitdiff
path: root/lib/base/heimbase.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/base/heimbase.c')
-rw-r--r--lib/base/heimbase.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/lib/base/heimbase.c b/lib/base/heimbase.c
index 6ad6ab258f09..9a1120b68368 100644
--- a/lib/base/heimbase.c
+++ b/lib/base/heimbase.c
@@ -86,11 +86,12 @@ struct heim_auto_release {
void *
heim_retain(void *ptr)
{
- struct heim_base *p = PTR2BASE(ptr);
+ struct heim_base *p;
if (ptr == NULL || heim_base_is_tagged(ptr))
return ptr;
+ p = PTR2BASE(ptr);
if (p->ref_cnt == heim_base_atomic_max)
return ptr;
@@ -109,11 +110,12 @@ void
heim_release(void *ptr)
{
heim_base_atomic_type old;
- struct heim_base *p = PTR2BASE(ptr);
+ struct heim_base *p;
if (ptr == NULL || heim_base_is_tagged(ptr))
return;
+ p = PTR2BASE(ptr);
if (p->ref_cnt == heim_base_atomic_max)
return;
@@ -256,9 +258,12 @@ heim_cmp(heim_object_t a, heim_object_t b)
static void
memory_dealloc(void *ptr)
{
- struct heim_base_mem *p = (struct heim_base_mem *)PTR2BASE(ptr);
- if (p->dealloc)
- p->dealloc(ptr);
+ if (ptr) {
+ struct heim_base_mem *p = (struct heim_base_mem *)PTR2BASE(ptr);
+
+ if (p->dealloc)
+ p->dealloc(ptr);
+ }
}
struct heim_type_data memory_object = {
@@ -666,13 +671,16 @@ heim_auto_release_create(void)
heim_object_t
heim_auto_release(heim_object_t ptr)
{
- struct heim_base *p = PTR2BASE(ptr);
- struct ar_tls *tls = autorel_tls();
+ struct heim_base *p;
+ struct ar_tls *tls;
heim_auto_release_t ar;
if (ptr == NULL || heim_base_is_tagged(ptr))
return ptr;
+ p = PTR2BASE(ptr);
+ tls = autorel_tls();
+
/* drop from old pool */
if ((ar = p->autorelpool) != NULL) {
HEIMDAL_MUTEX_lock(&ar->pool_mutex);