|
|
|
@ -35,6 +35,8 @@ namespace Grpc.Core |
|
|
|
|
const int MinDefaultThreadPoolSize = 4; |
|
|
|
|
const int DefaultBatchContextPoolSharedCapacity = 10000; |
|
|
|
|
const int DefaultBatchContextPoolThreadLocalCapacity = 64; |
|
|
|
|
const int DefaultRequestCallContextPoolSharedCapacity = 10000; |
|
|
|
|
const int DefaultRequestCallContextPoolThreadLocalCapacity = 64; |
|
|
|
|
|
|
|
|
|
static object staticLock = new object(); |
|
|
|
|
static GrpcEnvironment instance; |
|
|
|
@ -44,12 +46,15 @@ namespace Grpc.Core |
|
|
|
|
static bool inlineHandlers; |
|
|
|
|
static int batchContextPoolSharedCapacity = DefaultBatchContextPoolSharedCapacity; |
|
|
|
|
static int batchContextPoolThreadLocalCapacity = DefaultBatchContextPoolThreadLocalCapacity; |
|
|
|
|
static int requestCallContextPoolSharedCapacity = DefaultRequestCallContextPoolSharedCapacity; |
|
|
|
|
static int requestCallContextPoolThreadLocalCapacity = DefaultRequestCallContextPoolThreadLocalCapacity; |
|
|
|
|
static readonly HashSet<Channel> registeredChannels = new HashSet<Channel>(); |
|
|
|
|
static readonly HashSet<Server> registeredServers = new HashSet<Server>(); |
|
|
|
|
|
|
|
|
|
static ILogger logger = new LogLevelFilterLogger(new ConsoleLogger(), LogLevel.Off, true); |
|
|
|
|
|
|
|
|
|
readonly IObjectPool<BatchContextSafeHandle> batchContextPool; |
|
|
|
|
readonly IObjectPool<RequestCallContextSafeHandle> requestCallContextPool; |
|
|
|
|
readonly GrpcThreadPool threadPool; |
|
|
|
|
readonly DebugStats debugStats = new DebugStats(); |
|
|
|
|
readonly AtomicCounter cqPickerCounter = new AtomicCounter(); |
|
|
|
@ -262,6 +267,26 @@ namespace Grpc.Core |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// <summary> |
|
|
|
|
/// Sets the parameters for a pool that caches request call context instances. Reusing request call context instances |
|
|
|
|
/// instead of creating a new one for every requested call in C core helps reducing the GC pressure. |
|
|
|
|
/// Can be only invoked before the <c>GrpcEnviroment</c> is started and cannot be changed afterwards. |
|
|
|
|
/// This is an advanced setting and you should only use it if you know what you are doing. |
|
|
|
|
/// Most users should rely on the default value provided by gRPC library. |
|
|
|
|
/// Note: this method is part of an experimental API that can change or be removed without any prior notice. |
|
|
|
|
/// </summary> |
|
|
|
|
public static void SetRequestCallContextPoolParams(int sharedCapacity, int threadLocalCapacity) |
|
|
|
|
{ |
|
|
|
|
lock (staticLock) |
|
|
|
|
{ |
|
|
|
|
GrpcPreconditions.CheckState(instance == null, "Can only be set before GrpcEnvironment is initialized"); |
|
|
|
|
GrpcPreconditions.CheckArgument(sharedCapacity >= 0, "Shared capacity needs to be a non-negative number"); |
|
|
|
|
GrpcPreconditions.CheckArgument(threadLocalCapacity >= 0, "Thread local capacity needs to be a non-negative number"); |
|
|
|
|
requestCallContextPoolSharedCapacity = sharedCapacity; |
|
|
|
|
requestCallContextPoolThreadLocalCapacity = threadLocalCapacity; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// <summary> |
|
|
|
|
/// Occurs when <c>GrpcEnvironment</c> is about the start the shutdown logic. |
|
|
|
|
/// If <c>GrpcEnvironment</c> is later initialized and shutdown, the event will be fired again (unless unregistered first). |
|
|
|
@ -275,6 +300,7 @@ namespace Grpc.Core |
|
|
|
|
{ |
|
|
|
|
GrpcNativeInit(); |
|
|
|
|
batchContextPool = new DefaultObjectPool<BatchContextSafeHandle>(() => BatchContextSafeHandle.Create(this.batchContextPool), batchContextPoolSharedCapacity, batchContextPoolThreadLocalCapacity); |
|
|
|
|
requestCallContextPool = new DefaultObjectPool<RequestCallContextSafeHandle>(() => RequestCallContextSafeHandle.Create(this.requestCallContextPool), requestCallContextPoolSharedCapacity, requestCallContextPoolThreadLocalCapacity); |
|
|
|
|
threadPool = new GrpcThreadPool(this, GetThreadPoolSizeOrDefault(), GetCompletionQueueCountOrDefault(), inlineHandlers); |
|
|
|
|
threadPool.Start(); |
|
|
|
|
} |
|
|
|
@ -292,6 +318,8 @@ namespace Grpc.Core |
|
|
|
|
|
|
|
|
|
internal IObjectPool<BatchContextSafeHandle> BatchContextPool => batchContextPool; |
|
|
|
|
|
|
|
|
|
internal IObjectPool<RequestCallContextSafeHandle> RequestCallContextPool => requestCallContextPool; |
|
|
|
|
|
|
|
|
|
internal bool IsAlive |
|
|
|
|
{ |
|
|
|
|
get |
|
|
|
|