aboutsummaryrefslogtreecommitdiff
path: root/libpkgconf/stdinc.h
diff options
context:
space:
mode:
Diffstat (limited to 'libpkgconf/stdinc.h')
-rw-r--r--libpkgconf/stdinc.h38
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