Overview
Comment: | Fix a possible race condition in initialize_class. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
8f02ff02dca421fbdbcd20c63823660b |
User & Date: | js on 2012-08-05 16:52:14 |
Other Links: | manifest | tags |
Context
2012-08-05
| ||
17:22 | Use recursive pthread mutexes if available. check-in: 1e10b33066 user: js tags: trunk | |
16:52 | Fix a possible race condition in initialize_class. check-in: 8f02ff02dc user: js tags: trunk | |
12:17 | Use -Wno-objc-root-class if available. check-in: 0c87d8f53b user: js tags: trunk | |
Changes
Modified src/runtime/class.m from [0f8bf1f4e6] to [cde4d41e21].
︙ | ︙ | |||
133 134 135 136 137 138 139 | void objc_update_dtable(Class cls) { struct objc_method_list *ml; struct objc_category **cats; unsigned int i; | | | 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 | void objc_update_dtable(Class cls) { struct objc_method_list *ml; struct objc_category **cats; unsigned int i; if (!(cls->info & OBJC_CLASS_INFO_DTABLE)) return; if (cls->dtable == empty_dtable) cls->dtable = objc_sparsearray_new(); if (cls->superclass != Nil) objc_sparsearray_copy(cls->dtable, cls->superclass->dtable); |
︙ | ︙ | |||
238 239 240 241 242 243 244 245 246 247 248 249 250 251 | { if (cls->info & OBJC_CLASS_INFO_INITIALIZED) return; if (cls->superclass) initialize_class(cls->superclass); /* * Set it first to prevent calling it recursively due to message sends * in the initialize method */ cls->info |= OBJC_CLASS_INFO_INITIALIZED; cls->isa->info |= OBJC_CLASS_INFO_INITIALIZED; | > > > > > > < < < | 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 | { if (cls->info & OBJC_CLASS_INFO_INITIALIZED) return; if (cls->superclass) initialize_class(cls->superclass); cls->info |= OBJC_CLASS_INFO_DTABLE; cls->isa->info |= OBJC_CLASS_INFO_DTABLE; objc_update_dtable(cls); objc_update_dtable(cls->isa); /* * Set it first to prevent calling it recursively due to message sends * in the initialize method */ cls->info |= OBJC_CLASS_INFO_INITIALIZED; cls->isa->info |= OBJC_CLASS_INFO_INITIALIZED; call_method(cls, "initialize"); } void objc_initialize_class(Class cls) { if (cls->info & OBJC_CLASS_INFO_INITIALIZED) |
︙ | ︙ | |||
532 533 534 535 536 537 538 | } static void free_class(Class rcls) { struct objc_abi_class *cls = (struct objc_abi_class*)rcls; | < < < | | 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 | } static void free_class(Class rcls) { struct objc_abi_class *cls = (struct objc_abi_class*)rcls; if (rcls->subclass_list != NULL) { free(rcls->subclass_list); rcls->subclass_list = NULL; } if (rcls->dtable != NULL && rcls->dtable != empty_dtable) objc_sparsearray_free(rcls->dtable); rcls->dtable = NULL; if (rcls->superclass != Nil) cls->superclass = rcls->superclass->name; } |
︙ | ︙ |
Modified src/runtime/runtime.h from [1dc0fb3f7f] to [03d74b30fd].
︙ | ︙ | |||
55 56 57 58 59 60 61 | enum objc_abi_class_info { OBJC_CLASS_INFO_CLASS = 0x001, OBJC_CLASS_INFO_METACLASS = 0x002, OBJC_CLASS_INFO_NEW_ABI = 0x010, OBJC_CLASS_INFO_SETUP = 0x100, OBJC_CLASS_INFO_LOADED = 0x200, | > | | 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | enum objc_abi_class_info { OBJC_CLASS_INFO_CLASS = 0x001, OBJC_CLASS_INFO_METACLASS = 0x002, OBJC_CLASS_INFO_NEW_ABI = 0x010, OBJC_CLASS_INFO_SETUP = 0x100, OBJC_CLASS_INFO_LOADED = 0x200, OBJC_CLASS_INFO_DTABLE = 0x400, OBJC_CLASS_INFO_INITIALIZED = 0x800 }; struct objc_object { Class isa; }; struct objc_selector { |
︙ | ︙ |