@@ -53,56 +53,71 @@ class ExecutorModule[F[_]: Sync](
53
53
54
54
object ExecutorModule {
55
55
56
+ private final val DefaultBlockingExecutorConfig = ThreadPoolExecutorConfig (0 , Int .MaxValue , allowCoreThreadTimeout = true )
57
+
56
58
/** Makes [[com.avast.sst.jvm.execution.ExecutorModule ]] with default callback executor and extra [[cats.effect.Blocker ]] executor
57
59
* for blocking operations.
58
60
*/
59
61
def makeDefault [F [_]: Sync ]: Resource [F , ExecutorModule [F ]] = {
60
62
for {
61
63
numOfCpus <- Resource .eval(Sync [F ].delay(Runtime .getRuntime.availableProcessors))
62
64
coreSize = numOfCpus * 2
63
- executor <- makeThreadPoolExecutor(ThreadPoolExecutorConfig (coreSize, coreSize), toolkitThreadFactory, new LinkedBlockingQueue )
65
+ executor <- makeThreadPoolExecutor(
66
+ ThreadPoolExecutorConfig (coreSize, coreSize, allowCoreThreadTimeout = true ),
67
+ toolkitThreadFactory,
68
+ new LinkedBlockingQueue
69
+ )
64
70
.map(ExecutionContext .fromExecutorService)
65
- blockingExecutor <- makeBlockingExecutor.map(ExecutionContext .fromExecutorService)
71
+ blockingExecutor <- makeBlockingExecutor( DefaultBlockingExecutorConfig ) .map(ExecutionContext .fromExecutorService)
66
72
} yield new ExecutorModule [F ](numOfCpus, executor, blockingExecutor)
67
73
}
68
74
69
75
/** Makes [[com.avast.sst.jvm.execution.ExecutorModule ]] with the provided callback executor and extra [[cats.effect.Blocker ]]
70
76
* executor for blocking operations.
71
77
*/
72
- def makeFromExecutionContext [F [_]: Sync ](executor : ExecutionContext ): Resource [F , ExecutorModule [F ]] = {
78
+ def makeFromExecutionContext [F [_]: Sync ](
79
+ executor : ExecutionContext ,
80
+ blockingExecutorConfig : ThreadPoolExecutorConfig = DefaultBlockingExecutorConfig
81
+ ): Resource [F , ExecutorModule [F ]] = {
73
82
for {
74
83
numOfCpus <- Resource .eval(Sync [F ].delay(Runtime .getRuntime.availableProcessors))
75
- blockingExecutor <- makeBlockingExecutor.map(ExecutionContext .fromExecutorService)
84
+ blockingExecutor <- makeBlockingExecutor(blockingExecutorConfig) .map(ExecutionContext .fromExecutorService)
76
85
} yield new ExecutorModule [F ](numOfCpus, executor, blockingExecutor)
77
86
}
78
87
79
88
/** Makes [[com.avast.sst.jvm.execution.ExecutorModule ]] with executor and extra [[cats.effect.Blocker ]] executor
80
89
* for blocking operations.
81
90
*/
82
- def makeFromConfig [F [_]: Sync ](executorConfig : ThreadPoolExecutorConfig ): Resource [F , ExecutorModule [F ]] = {
91
+ def makeFromConfig [F [_]: Sync ](
92
+ executorConfig : ThreadPoolExecutorConfig ,
93
+ blockingExecutorConfig : ThreadPoolExecutorConfig = DefaultBlockingExecutorConfig
94
+ ): Resource [F , ExecutorModule [F ]] = {
83
95
for {
84
96
numOfCpus <- Resource .eval(Sync [F ].delay(Runtime .getRuntime.availableProcessors))
85
97
executor <- makeThreadPoolExecutor(executorConfig, toolkitThreadFactory, new LinkedBlockingQueue )
86
98
.map(ExecutionContext .fromExecutorService)
87
- blockingExecutor <- makeBlockingExecutor.map(ExecutionContext .fromExecutorService)
99
+ blockingExecutor <- makeBlockingExecutor(blockingExecutorConfig) .map(ExecutionContext .fromExecutorService)
88
100
} yield new ExecutorModule [F ](numOfCpus, executor, blockingExecutor)
89
101
}
90
102
91
103
/** Makes [[com.avast.sst.jvm.execution.ExecutorModule ]] with fork-join executor and extra [[cats.effect.Blocker ]] executor
92
104
* for blocking operations.
93
105
*/
94
- def makeForkJoinFromConfig [F [_]: Sync ](executorConfig : ForkJoinPoolConfig ): Resource [F , ExecutorModule [F ]] = {
106
+ def makeForkJoinFromConfig [F [_]: Sync ](
107
+ executorConfig : ForkJoinPoolConfig ,
108
+ blockingExecutorConfig : ThreadPoolExecutorConfig = DefaultBlockingExecutorConfig
109
+ ): Resource [F , ExecutorModule [F ]] = {
95
110
for {
96
111
numOfCpus <- Resource .eval(Sync [F ].delay(Runtime .getRuntime.availableProcessors))
97
112
executor <- makeForkJoinPool(executorConfig, numOfCpus, toolkitThreadFactory)
98
113
.map(ExecutionContext .fromExecutorService)
99
- blockingExecutor <- makeBlockingExecutor.map(ExecutionContext .fromExecutorService)
114
+ blockingExecutor <- makeBlockingExecutor(blockingExecutorConfig) .map(ExecutionContext .fromExecutorService)
100
115
} yield new ExecutorModule [F ](numOfCpus, executor, blockingExecutor)
101
116
}
102
117
103
- private def makeBlockingExecutor [F [_]: Sync ] =
118
+ private def makeBlockingExecutor [F [_]: Sync ]( config : ThreadPoolExecutorConfig ) =
104
119
makeThreadPoolExecutor[F ](
105
- ThreadPoolExecutorConfig ( 0 , Int . MaxValue ) ,
120
+ config ,
106
121
new ConfigurableThreadFactory (Config (nameFormat = Some (" default-blocking-%02d" ), daemon = true )),
107
122
new SynchronousQueue
108
123
)
0 commit comments