From 52381f163b9caaab21cd4d25358fb8c8a8fd81e4 Mon Sep 17 00:00:00 2001 From: theraven Date: Wed, 20 Apr 2011 12:45:15 +0000 Subject: [PATCH] Make sure locks are initialised before using them and destroyed afterwards. --- associate.m | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/associate.m b/associate.m index dc2fded..c54df21 100644 --- a/associate.m +++ b/associate.m @@ -82,6 +82,8 @@ static void cleanupReferenceList(struct reference_list *list) { if (NULL == list) { return; } + cleanupReferenceList(list->next); + for (int i=0 ; ilist[i]; @@ -101,6 +103,13 @@ static void cleanupReferenceList(struct reference_list *list) } } +static void freeReferenceList(struct reference_list *l) +{ + if (NULL == l) { return; } + freeReferenceList(l->next); + free(l); +} + static void setReference(struct reference_list *list, void *key, void *obj, @@ -232,7 +241,9 @@ static void deallocHiddenClass(id obj, SEL _cmd) // After calling [super dealloc], the object will no longer exist. // Free the hidden struct reference_list *list = object_getIndexedIvars(hiddenClass); + DESTROY_LOCK(&list->lock); cleanupReferenceList(list); + freeReferenceList(list->next); free_dtable(hiddenClass->dtable); @@ -252,6 +263,7 @@ static struct reference_list* referenceListForObject(id object, BOOL create) if (NULL == cls->extra_data) { cls->extra_data = calloc(1, sizeof(struct reference_list)); + INIT_LOCK(cls->extra_data->lock); } unlock_spinlock(lock); } @@ -266,6 +278,8 @@ static struct reference_list* referenceListForObject(id object, BOOL create) if (NULL == hiddenClass) { hiddenClass = initHiddenClassForObject(object); + struct reference_list *list = object_getIndexedIvars(hiddenClass); + INIT_LOCK(list->lock); } unlock_spinlock(lock); }