From d227a477fd9f81b409298e4981b419430695c402 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Fri, 13 Oct 2017 02:57:39 +0300 Subject: Relax thread stack size requirements --- libpkgconf/stdinc.h | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'libpkgconf/stdinc.h') diff --git a/libpkgconf/stdinc.h b/libpkgconf/stdinc.h index a4c7c84..abebe03 100644 --- a/libpkgconf/stdinc.h +++ b/libpkgconf/stdinc.h @@ -59,4 +59,42 @@ # include #endif +/* + * Stack-allocated buffer sizes. + * + * Original libpkgconf package uses PKGCONF_BUFSIZE size for all + * stack-allocated buffers, imposing high requirements for the thread stack + * size. This make it unusable on MacOS (as of 10.12) for non-main threads that + * are created with the default 512K stack size. In particular that make it + * impossible to use libpkgconf API in threads created with C++11 std::thread + * class, that doesn't allow stack size customization. + * + * As an example, using pkgconf_pkg_find() for quite a simple .pc file consumes + * at least 460K. The measurment was made as a differece between addresses of 2 + * stack-allocated variables: one was defined right before the function call, + * another right after the buffer definition in pkgconf_tuple_parse() function. + * + * To relax the stack size requirements we will minimize the usage of + * PKGCONF_BUFSIZE, using the smaller PKGCONF_SBUFSIZE instead, wherever it is + * possible. The PKGCONF_SBUFSIZE is selected in such a way that a buffer of + * this size can accommodate the file system path, the value fragment, the + * variable name or the package dependency specification. The latest implies it + * also fits for the package key or the package version. This optimization + * decreased the stack usage for the described use case to 140K. + * + * Note that we moved PKGCONF_BUFSIZE definition from libpkgconf.h. + */ +#define PKGCONF_BUFSIZE (65535) + +#ifdef _WIN32 +# define PKGCONF_SBUFSIZE (_MAX_PATH + 1024) +#else +# include +# ifdef PATH_MAX +# define PKGCONF_SBUFSIZE (PATH_MAX + 1024) +# else +# define PKGCONF_SBUFSIZE (4096 + 1024) +# endif +#endif + #endif -- cgit v1.1