aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/objective-c/GRPCClient/private/GRPCWrappedCall.m
diff options
context:
space:
mode:
authorGravatar Muxi Yan <mxyan@google.com>2018-11-08 22:01:10 -0800
committerGravatar Muxi Yan <mxyan@google.com>2018-11-08 22:01:10 -0800
commit37dbad80d5254f9bf17076d12b22b7a081e6e9dc (patch)
tree367a86331b789917812b15ec4dde636b32560023 /src/objective-c/GRPCClient/private/GRPCWrappedCall.m
parentd72d5b2c8eaa8a434a7db4624fe6a45bc0d6bde4 (diff)
Refactor channel pool
Diffstat (limited to 'src/objective-c/GRPCClient/private/GRPCWrappedCall.m')
-rw-r--r--src/objective-c/GRPCClient/private/GRPCWrappedCall.m24
1 files changed, 17 insertions, 7 deletions
diff --git a/src/objective-c/GRPCClient/private/GRPCWrappedCall.m b/src/objective-c/GRPCClient/private/GRPCWrappedCall.m
index 577002e7a8..2358c7bb0a 100644
--- a/src/objective-c/GRPCClient/private/GRPCWrappedCall.m
+++ b/src/objective-c/GRPCClient/private/GRPCWrappedCall.m
@@ -24,6 +24,7 @@
#include <grpc/support/alloc.h>
#import "GRPCChannel.h"
+#import "GRPCChannelPool.h"
#import "GRPCCompletionQueue.h"
#import "GRPCHost.h"
#import "NSData+GRPC.h"
@@ -256,13 +257,21 @@
// consuming too many threads and having contention of multiple calls in a single completion
// queue. Currently we use a singleton queue.
_queue = [GRPCCompletionQueue completionQueue];
- _channel = [GRPCChannel channelWithHost:host callOptions:callOptions];
- if (_channel == nil) {
- NSLog(@"Failed to get a channel for the host.");
- return nil;
- }
- _call = [_channel unmanagedCallWithPath:path completionQueue:_queue callOptions:callOptions];
- if (_call == NULL) {
+ BOOL disconnected;
+ do {
+ _channel = [[GRPCChannelPool sharedInstance] channelWithHost:host callOptions:callOptions];
+ if (_channel == nil) {
+ NSLog(@"Failed to get a channel for the host.");
+ return nil;
+ }
+ _call = [_channel unmanagedCallWithPath:path
+ completionQueue:_queue
+ callOptions:callOptions
+ disconnected:&disconnected];
+ // Try create another channel if the current channel is disconnected (due to idleness or
+ // connectivity monitor disconnection).
+ } while (_call == NULL && disconnected);
+ if (_call == nil) {
NSLog(@"Failed to create a call.");
return nil;
}
@@ -317,6 +326,7 @@
- (void)dealloc {
if (_call) {
grpc_call_unref(_call);
+ [_channel unref];
}
[_channel unref];
_channel = nil;