|
@@ -556,6 +556,7 @@ static id GetArrayIvarWithField(GPBMessage *self, GPBFieldDescriptor *field) {
|
|
id array = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
|
|
id array = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
|
|
if (!array) {
|
|
if (!array) {
|
|
// Check again after getting the lock.
|
|
// Check again after getting the lock.
|
|
|
|
+ GPBPrepareReadOnlySemaphore(self);
|
|
dispatch_semaphore_wait(self->readOnlySemaphore_, DISPATCH_TIME_FOREVER);
|
|
dispatch_semaphore_wait(self->readOnlySemaphore_, DISPATCH_TIME_FOREVER);
|
|
array = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
|
|
array = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
|
|
if (!array) {
|
|
if (!array) {
|
|
@@ -586,6 +587,7 @@ static id GetMapIvarWithField(GPBMessage *self, GPBFieldDescriptor *field) {
|
|
id dict = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
|
|
id dict = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
|
|
if (!dict) {
|
|
if (!dict) {
|
|
// Check again after getting the lock.
|
|
// Check again after getting the lock.
|
|
|
|
+ GPBPrepareReadOnlySemaphore(self);
|
|
dispatch_semaphore_wait(self->readOnlySemaphore_, DISPATCH_TIME_FOREVER);
|
|
dispatch_semaphore_wait(self->readOnlySemaphore_, DISPATCH_TIME_FOREVER);
|
|
dict = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
|
|
dict = GPBGetObjectIvarWithFieldNoAutocreate(self, field);
|
|
if (!dict) {
|
|
if (!dict) {
|
|
@@ -791,8 +793,6 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) {
|
|
if ((self = [super init])) {
|
|
if ((self = [super init])) {
|
|
messageStorage_ = (GPBMessage_StoragePtr)(
|
|
messageStorage_ = (GPBMessage_StoragePtr)(
|
|
((uint8_t *)self) + class_getInstanceSize([self class]));
|
|
((uint8_t *)self) + class_getInstanceSize([self class]));
|
|
-
|
|
|
|
- readOnlySemaphore_ = dispatch_semaphore_create(1);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
return self;
|
|
return self;
|
|
@@ -868,7 +868,9 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) {
|
|
- (void)dealloc {
|
|
- (void)dealloc {
|
|
[self internalClear:NO];
|
|
[self internalClear:NO];
|
|
NSCAssert(!autocreator_, @"Autocreator was not cleared before dealloc.");
|
|
NSCAssert(!autocreator_, @"Autocreator was not cleared before dealloc.");
|
|
- dispatch_release(readOnlySemaphore_);
|
|
|
|
|
|
+ if (readOnlySemaphore_) {
|
|
|
|
+ dispatch_release(readOnlySemaphore_);
|
|
|
|
+ }
|
|
[super dealloc];
|
|
[super dealloc];
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1706,6 +1708,7 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) {
|
|
}
|
|
}
|
|
|
|
|
|
// Check for an autocreated value.
|
|
// Check for an autocreated value.
|
|
|
|
+ GPBPrepareReadOnlySemaphore(self);
|
|
dispatch_semaphore_wait(readOnlySemaphore_, DISPATCH_TIME_FOREVER);
|
|
dispatch_semaphore_wait(readOnlySemaphore_, DISPATCH_TIME_FOREVER);
|
|
value = [autocreatedExtensionMap_ objectForKey:extension];
|
|
value = [autocreatedExtensionMap_ objectForKey:extension];
|
|
if (!value) {
|
|
if (!value) {
|