{- Copyright (c) Meta Platforms, Inc. and affiliates. All rights reserved. This source code is licensed under the BSD-style license found in the LICENSE file in the root directory of this source tree. -} module Util.Executor ( CppFollyExecutor , Executor(..) , ExecutorKeepAlive(..) , ExecutorProvider(..) , getGlobalCPUExecutor , releaseGlobalCPUExecutor , withGlobalCPUExecutor ) where import Foreign.Ptr import Control.Exception (bracket) -- CppExecutor is a folly::Executor* data CppFollyExecutor newtype Executor = Executor (Ptr CppFollyExecutor) data CppFollyExecutorKeepAlive newtype ExecutorKeepAlive = ExecutorKeepAlive (Ptr CppFollyExecutorKeepAlive) class ExecutorProvider a where getExecutor :: a -> IO Executor instance ExecutorProvider Executor where getExecutor = return instance ExecutorProvider ExecutorKeepAlive where getExecutor (ExecutorKeepAlive p) = Executor <$> c_getExecutorFromKeepAlive p getGlobalCPUExecutor :: IO ExecutorKeepAlive getGlobalCPUExecutor = ExecutorKeepAlive <$> c_getGlobalCPUExecutor releaseGlobalCPUExecutor :: ExecutorKeepAlive -> IO () releaseGlobalCPUExecutor (ExecutorKeepAlive p) = c_releaseGlobalCPUExecutor p withGlobalCPUExecutor :: (ExecutorKeepAlive -> IO b) -> IO b withGlobalCPUExecutor = bracket getGlobalCPUExecutor releaseGlobalCPUExecutor foreign import ccall unsafe "common_hs_getGlobalCPUExecutor" c_getGlobalCPUExecutor :: IO (Ptr CppFollyExecutorKeepAlive) foreign import ccall unsafe "common_hs_releaseGlobalCPUExecutor" c_releaseGlobalCPUExecutor :: Ptr CppFollyExecutorKeepAlive -> IO () foreign import ccall unsafe "common_hs_getExecutorFromKeepAlive" c_getExecutorFromKeepAlive :: Ptr CppFollyExecutorKeepAlive -> IO (Ptr CppFollyExecutor)