diff options
Diffstat (limited to 'libpkgconf/stdinc.h')
-rw-r--r-- | libpkgconf/stdinc.h | 38 |
1 files changed, 38 insertions, 0 deletions
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 <unistd.h> #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 <limits.h> +# ifdef PATH_MAX +# define PKGCONF_SBUFSIZE (PATH_MAX + 1024) +# else +# define PKGCONF_SBUFSIZE (4096 + 1024) +# endif +#endif + #endif |