From 598b0256a354cb2e65ea240e50662d4378f5462c Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Sat, 14 Oct 2017 00:05:03 +0300 Subject: Merge with latest original package version (master branch) --- libpkgconf/stdinc.h | 65 +++++++++++++++++++++++------------------------------ 1 file changed, 28 insertions(+), 37 deletions(-) (limited to 'libpkgconf/stdinc.h') diff --git a/libpkgconf/stdinc.h b/libpkgconf/stdinc.h index abebe03..418a06a 100644 --- a/libpkgconf/stdinc.h +++ b/libpkgconf/stdinc.h @@ -26,14 +26,36 @@ #include #include +/* + * The 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 512KB 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 460KB. The measurement was made as a difference 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, inventing the smaller PKGCONF_ITEM_SIZE, and using it + * wherever it is possible instead. The PKGCONF_ITEM_SIZE 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 + * 140KB. + * + * Issue #149 is reported. + */ #ifdef _WIN32 # define WIN32_LEAN_AND_MEAN # include # include # define PATH_DEV_NULL "nul" -/* - * Fix MinGW GCC print format warnings (issue #142 is reported). - */ # ifdef _WIN64 # define SIZE_FMT_SPECIFIER "%I64u" # else @@ -52,48 +74,17 @@ # else # include # endif +# define PKGCONF_ITEM_SIZE (_MAX_PATH + 1024) #else # define PATH_DEV_NULL "/dev/null" # define SIZE_FMT_SPECIFIER "%zu" # include # 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) +# define PKGCONF_ITEM_SIZE (PATH_MAX + 1024) # else -# define PKGCONF_SBUFSIZE (4096 + 1024) +# define PKGCONF_ITEM_SIZE (4096 + 1024) # endif #endif -- cgit v1.1