aboutsummaryrefslogtreecommitdiff
path: root/objectivec/GPBUtilities.m
diff options
context:
space:
mode:
authorThomas Van Lenten <thomasvl@google.com>2017-03-02 14:50:10 -0500
committerThomas Van Lenten <thomasvl@google.com>2017-03-02 16:34:11 -0500
commit2d1c5e26cb291193ac4d1f4a5179d8f6e1906229 (patch)
tree1486c2e0c6ffa3e5121f00096b27b52450f5a395 /objectivec/GPBUtilities.m
parenta7e3b0ab016312f7427426d2cb88b0ab77210b79 (diff)
downloadprotobuf-2d1c5e26cb291193ac4d1f4a5179d8f6e1906229.tar.gz
protobuf-2d1c5e26cb291193ac4d1f4a5179d8f6e1906229.tar.bz2
protobuf-2d1c5e26cb291193ac4d1f4a5179d8f6e1906229.zip
Handing threading race resolving methods.
- Don't prune the extension registry as that can lead to failures when two threads are racing. - If adding the method fails, check and see if it already is bound to decide the return result. Deals with threading races binding the methods.
Diffstat (limited to 'objectivec/GPBUtilities.m')
-rw-r--r--objectivec/GPBUtilities.m19
1 files changed, 19 insertions, 0 deletions
diff --git a/objectivec/GPBUtilities.m b/objectivec/GPBUtilities.m
index 1843478c..5029ec73 100644
--- a/objectivec/GPBUtilities.m
+++ b/objectivec/GPBUtilities.m
@@ -1893,6 +1893,25 @@ NSString *GPBDecodeTextFormatName(const uint8_t *decodeData, int32_t key,
#pragma clang diagnostic pop
+BOOL GPBClassHasSel(Class aClass, SEL sel) {
+ // NOTE: We have to use class_copyMethodList, all other runtime method
+ // lookups actually also resolve the method implementation and this
+ // is called from within those methods.
+
+ BOOL result = NO;
+ unsigned int methodCount = 0;
+ Method *methodList = class_copyMethodList(aClass, &methodCount);
+ for (unsigned int i = 0; i < methodCount; ++i) {
+ SEL methodSelector = method_getName(methodList[i]);
+ if (methodSelector == sel) {
+ result = YES;
+ break;
+ }
+ }
+ free(methodList);
+ return result;
+}
+
#pragma mark - GPBMessageSignatureProtocol
// A series of selectors that are used solely to get @encoding values