Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:ALP:Workbench:1.0
rpm
zstdpool.diff
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File zstdpool.diff of Package rpm
--- rpmio/rpmio.c.orig 2021-06-21 12:00:44.648612706 +0000 +++ rpmio/rpmio.c 2022-04-13 13:48:55.224954032 +0000 @@ -8,6 +8,7 @@ #include <ctype.h> #include <dirent.h> #include <fcntl.h> +#include <pthread.h> #if defined(__linux__) #include <sys/personality.h> #endif @@ -1034,6 +1035,7 @@ static const FDIO_t lzdio = &lzdio_s; /* Support for ZSTD library. */ #ifdef HAVE_ZSTD +#define ZSTD_STATIC_LINKING_ONLY #include <zstd.h> typedef struct rpmzstd_s { @@ -1048,6 +1050,29 @@ typedef struct rpmzstd_s { ZSTD_outBuffer zob; /*!< ZSTD_outBuffer */ } * rpmzstd; +#if ZSTD_VERSION_NUMBER >= 10407 + +static pthread_once_t zstdThreadPoolCreated = PTHREAD_ONCE_INIT; +static ZSTD_threadPool *zstdThreadPool; +static int zstdThreadPoolThreads; + +static void zstdCreateThreadPool(void) +{ + int numthreads = rpmExpandNumeric("%{?_zstd_pool_threads}%{?!_zstd_pool_threads:-1}"); + if (numthreads >= 0) + numthreads = get_compression_threads(numthreads > 0 ? numthreads : -1); + if (numthreads > 0) { + zstdThreadPoolThreads = numthreads; + zstdThreadPool = ZSTD_createThreadPool(numthreads); + if (!zstdThreadPool) + rpmlog(RPMLOG_WARNING, "Could not create zstd thread pool for %d threads\n", numthreads); + else + rpmlog(RPMLOG_DEBUG, "Created zstd thread pool for %d threads\n", numthreads); + } +} + +#endif + static rpmzstd rpmzstdNew(int fdno, const char *fmode) { int flags = 0; @@ -1133,8 +1158,18 @@ static rpmzstd rpmzstdNew(int fdno, cons threads = get_compression_threads(threads); if (threads > 0) { - if (ZSTD_isError (ZSTD_CCtx_setParameter(_stream, ZSTD_c_nbWorkers, threads))) + if (ZSTD_isError (ZSTD_CCtx_setParameter(_stream, ZSTD_c_nbWorkers, threads))) { rpmlog(RPMLOG_DEBUG, "zstd library does not support multi-threading\n"); + } else { +#if ZSTD_VERSION_NUMBER >= 10407 + pthread_once(&zstdThreadPoolCreated, zstdCreateThreadPool); + if (zstdThreadPool) { + if (threads > zstdThreadPoolThreads) + ZSTD_CCtx_setParameter(_stream, ZSTD_c_nbWorkers, zstdThreadPoolThreads); + ZSTD_CCtx_refThreadPool(_stream, zstdThreadPool); + } +#endif + } } nb = ZSTD_CStreamOutSize();
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor