mirror of
https://github.com/logos-messaging/nim-sds.git
synced 2026-01-02 14:13:07 +00:00
feat: thread pool (#40)
* feat: thread pool * proper pass ARCH in Makefile when building for Android --------- Co-authored-by: Ivan Folgueira Bande <ivansete@status.im>
This commit is contained in:
parent
e67639ee08
commit
8d33a7f7da
18
Makefile
18
Makefile
@ -115,7 +115,7 @@ build-libsds-for-android-arch: NIM_PARAMS := $(NIM_PARAMS) --passC="-I$(ANDROID_
|
|||||||
build-libsds-for-android-arch: NIM_PARAMS := $(NIM_PARAMS) --passL="-L$(ANDROID_TOOLCHAIN_DIR)/sysroot/usr/lib/$(ARCH_DIRNAME)/$(ANDROID_TARGET)"
|
build-libsds-for-android-arch: NIM_PARAMS := $(NIM_PARAMS) --passL="-L$(ANDROID_TOOLCHAIN_DIR)/sysroot/usr/lib/$(ARCH_DIRNAME)/$(ANDROID_TARGET)"
|
||||||
build-libsds-for-android-arch:
|
build-libsds-for-android-arch:
|
||||||
CC=$(ANDROID_TOOLCHAIN_DIR)/bin/$(ANDROID_ARCH)$(ANDROID_TARGET)-clang \
|
CC=$(ANDROID_TOOLCHAIN_DIR)/bin/$(ANDROID_ARCH)$(ANDROID_TARGET)-clang \
|
||||||
CPU=$(CPU) ABIDIR=$(ABIDIR) \
|
ARCH=$(ARCH) ABIDIR=$(ABIDIR) \
|
||||||
ARCH_DIRNAME=$(ARCH_DIRNAME) \
|
ARCH_DIRNAME=$(ARCH_DIRNAME) \
|
||||||
ANDROID_ARCH=$(ANDROID_ARCH) \
|
ANDROID_ARCH=$(ANDROID_ARCH) \
|
||||||
ANDROID_TOOLCHAIN_DIR=$(ANDROID_TOOLCHAIN_DIR) \
|
ANDROID_TOOLCHAIN_DIR=$(ANDROID_TOOLCHAIN_DIR) \
|
||||||
@ -123,37 +123,37 @@ build-libsds-for-android-arch:
|
|||||||
nim libsdsAndroid $(NIM_PARAMS) sds.nims
|
nim libsdsAndroid $(NIM_PARAMS) sds.nims
|
||||||
|
|
||||||
libsds-android-arm64: ANDROID_ARCH=aarch64-linux-android
|
libsds-android-arm64: ANDROID_ARCH=aarch64-linux-android
|
||||||
libsds-android-arm64: CPU=arm64
|
libsds-android-arm64: ARCH=arm64
|
||||||
libsds-android-arm64: ABIDIR=arm64-v8a
|
libsds-android-arm64: ABIDIR=arm64-v8a
|
||||||
libsds-android-arm64: ARCH_DIRNAME=aarch64-linux-android
|
libsds-android-arm64: ARCH_DIRNAME=aarch64-linux-android
|
||||||
libsds-android-arm64: | libsds-android-precheck build deps
|
libsds-android-arm64: | libsds-android-precheck build deps
|
||||||
$(MAKE) build-libsds-for-android-arch ANDROID_ARCH=$(ANDROID_ARCH) \
|
$(MAKE) build-libsds-for-android-arch ANDROID_ARCH=$(ANDROID_ARCH) \
|
||||||
CPU=$(CPU) ABIDIR=$(ABIDIR) ARCH_DIRNAME=$(ARCH_DIRNAME)
|
ARCH=$(ARCH) ABIDIR=$(ABIDIR) ARCH_DIRNAME=$(ARCH_DIRNAME)
|
||||||
|
|
||||||
libsds-android-amd64: ANDROID_ARCH=x86_64-linux-android
|
libsds-android-amd64: ANDROID_ARCH=x86_64-linux-android
|
||||||
libsds-android-amd64: CPU=amd64
|
libsds-android-amd64: ARCH=amd64
|
||||||
libsds-android-amd64: ABIDIR=x86_64
|
libsds-android-amd64: ABIDIR=x86_64
|
||||||
libsds-android-amd64: ARCH_DIRNAME=x86_64-linux-android
|
libsds-android-amd64: ARCH_DIRNAME=x86_64-linux-android
|
||||||
libsds-android-amd64: | libsds-android-precheck build deps
|
libsds-android-amd64: | libsds-android-precheck build deps
|
||||||
$(MAKE) build-libsds-for-android-arch ANDROID_ARCH=$(ANDROID_ARCH) \
|
$(MAKE) build-libsds-for-android-arch ANDROID_ARCH=$(ANDROID_ARCH) \
|
||||||
CPU=$(CPU) ABIDIR=$(ABIDIR) ARCH_DIRNAME=$(ARCH_DIRNAME)
|
ARCH=$(ARCH) ABIDIR=$(ABIDIR) ARCH_DIRNAME=$(ARCH_DIRNAME)
|
||||||
|
|
||||||
libsds-android-x86: ANDROID_ARCH=i686-linux-android
|
libsds-android-x86: ANDROID_ARCH=i686-linux-android
|
||||||
libsds-android-x86: CPU=i386
|
libsds-android-x86: ARCH=i386
|
||||||
libsds-android-x86: ABIDIR=x86
|
libsds-android-x86: ABIDIR=x86
|
||||||
libsds-android-x86: ARCH_DIRNAME=i686-linux-android
|
libsds-android-x86: ARCH_DIRNAME=i686-linux-android
|
||||||
libsds-android-x86: | libsds-android-precheck build deps
|
libsds-android-x86: | libsds-android-precheck build deps
|
||||||
$(MAKE) build-libsds-for-android-arch ANDROID_ARCH=$(ANDROID_ARCH) \
|
$(MAKE) build-libsds-for-android-arch ANDROID_ARCH=$(ANDROID_ARCH) \
|
||||||
CPU=$(CPU) ABIDIR=$(ABIDIR) ARCH_DIRNAME=$(ARCH_DIRNAME)
|
ARCH=$(ARCH) ABIDIR=$(ABIDIR) ARCH_DIRNAME=$(ARCH_DIRNAME)
|
||||||
|
|
||||||
libsds-android-arm: ANDROID_ARCH=armv7a-linux-androideabi
|
libsds-android-arm: ANDROID_ARCH=armv7a-linux-androideabi
|
||||||
libsds-android-arm: CPU=arm
|
libsds-android-arm: ARCH=arm
|
||||||
libsds-android-arm: ABIDIR=armeabi-v7a
|
libsds-android-arm: ABIDIR=armeabi-v7a
|
||||||
libsds-android-arm: ARCH_DIRNAME=arm-linux-androideabi
|
libsds-android-arm: ARCH_DIRNAME=arm-linux-androideabi
|
||||||
libsds-android-arm: | libsds-android-precheck build deps
|
libsds-android-arm: | libsds-android-precheck build deps
|
||||||
# cross-rs target architecture name does not match the one used in android
|
# cross-rs target architecture name does not match the one used in android
|
||||||
$(MAKE) build-libsds-for-android-arch ANDROID_ARCH=$(ANDROID_ARCH) \
|
$(MAKE) build-libsds-for-android-arch ANDROID_ARCH=$(ANDROID_ARCH) \
|
||||||
CPU=$(CPU) ABIDIR=$(ABIDIR) ARCH_DIRNAME=$(ARCH_DIRNAME) \
|
ARCH=$(ARCH) ABIDIR=$(ABIDIR) ARCH_DIRNAME=$(ARCH_DIRNAME) \
|
||||||
|
|
||||||
libsds-android:
|
libsds-android:
|
||||||
ifeq ($(ARCH),arm64)
|
ifeq ($(ARCH),arm64)
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
when defined(linux):
|
when defined(linux):
|
||||||
{.passl: "-Wl,-soname,libsds.so".}
|
{.passl: "-Wl,-soname,libsds.so".}
|
||||||
|
|
||||||
import std/[typetraits, tables, atomics], chronos, chronicles
|
import std/[typetraits, tables, atomics, locks], chronos, chronicles
|
||||||
import
|
import
|
||||||
./sds_thread/sds_thread,
|
./sds_thread/sds_thread,
|
||||||
./alloc,
|
./alloc,
|
||||||
@ -57,6 +57,29 @@ template callEventCallback(ctx: ptr SdsContext, eventName: string, body: untyped
|
|||||||
RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), ctx[].eventUserData
|
RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), ctx[].eventUserData
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var
|
||||||
|
ctxPool: seq[ptr SdsContext]
|
||||||
|
ctxPoolLock: Lock
|
||||||
|
|
||||||
|
proc acquireCtx(callback: SdsCallBack, userData: pointer): ptr SdsContext =
|
||||||
|
ctxPoolLock.acquire()
|
||||||
|
defer: ctxPoolLock.release()
|
||||||
|
if ctxPool.len > 0:
|
||||||
|
result = ctxPool.pop()
|
||||||
|
else:
|
||||||
|
result = sds_thread.createSdsThread().valueOr:
|
||||||
|
let msg = "Error in createSdsThread: " & $error
|
||||||
|
callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData)
|
||||||
|
return nil
|
||||||
|
|
||||||
|
proc releaseCtx(ctx: ptr SdsContext) =
|
||||||
|
ctxPoolLock.acquire()
|
||||||
|
defer: ctxPoolLock.release()
|
||||||
|
ctx.userData = nil
|
||||||
|
ctx.eventCallback = nil
|
||||||
|
ctx.eventUserData = nil
|
||||||
|
ctxPool.add(ctx)
|
||||||
|
|
||||||
proc handleRequest(
|
proc handleRequest(
|
||||||
ctx: ptr SdsContext,
|
ctx: ptr SdsContext,
|
||||||
requestType: RequestType,
|
requestType: RequestType,
|
||||||
@ -140,10 +163,9 @@ proc SdsNewReliabilityManager(
|
|||||||
echo "error: missing callback in NewReliabilityManager"
|
echo "error: missing callback in NewReliabilityManager"
|
||||||
return nil
|
return nil
|
||||||
|
|
||||||
## Create the SDS thread that will keep waiting for req from the main thread.
|
## Create or reuse the SDS thread that will keep waiting for req from the main thread.
|
||||||
var ctx = sds_thread.createSdsThread().valueOr:
|
var ctx = acquireCtx(callback, userData)
|
||||||
let msg = "Error in createSdsThread: " & $error
|
if ctx.isNil():
|
||||||
callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData)
|
|
||||||
return nil
|
return nil
|
||||||
|
|
||||||
ctx.userData = userData
|
ctx.userData = userData
|
||||||
@ -183,14 +205,20 @@ proc SdsCleanupReliabilityManager(
|
|||||||
initializeLibrary()
|
initializeLibrary()
|
||||||
checkLibsdsParams(ctx, callback, userData)
|
checkLibsdsParams(ctx, callback, userData)
|
||||||
|
|
||||||
sds_thread.destroySdsThread(ctx).isOkOr:
|
let resetRes = handleRequest(
|
||||||
let msg = "libsds error: " & $error
|
ctx,
|
||||||
callback(RET_ERR, unsafeAddr msg[0], cast[csize_t](len(msg)), userData)
|
RequestType.LIFECYCLE,
|
||||||
|
SdsLifecycleRequest.createShared(SdsLifecycleMsgType.RESET_RELIABILITY_MANAGER),
|
||||||
|
callback,
|
||||||
|
userData,
|
||||||
|
)
|
||||||
|
|
||||||
|
if resetRes == RET_ERR:
|
||||||
return RET_ERR
|
return RET_ERR
|
||||||
|
|
||||||
## always need to invoke the callback although we don't retrieve value to the caller
|
releaseCtx(ctx)
|
||||||
callback(RET_OK, nil, 0, userData)
|
|
||||||
|
|
||||||
|
# handleRequest already invoked the callback; nothing else to signal here.
|
||||||
return RET_OK
|
return RET_OK
|
||||||
|
|
||||||
proc SdsResetReliabilityManager(
|
proc SdsResetReliabilityManager(
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user