unread
commit edae18ccf5c51ae0bcc0e9655ead7540fd42dd9f
Author: Martin Pelikan pelikan@storkhole.cz
Date: Wed May 8 02:06:09 2013 +0200
Faster and safer parsing of fpm configuration.
The current fpm config parser did a read(2) syscall per character,
which obfuscated debugging strace/ktrace output somewhat. This also
makes the 1024 characters per line limit more explicit, so the users
will know what were they hitting.
It might improve performance during php-fpm load (.03 vs .00 seconds
on my laptop) but primarily serves to help observing fpm system call
traces during deployment (in chroot for example).
Signed-off-by: Martin Pelikan <martin.pelikan@gmail.com>
diff --git a/sapi/fpm/fpm/fpm_conf.c b/sapi/fpm/fpm/fpm_conf.c
index 0a8a0e3..e004934 100644
--- a/sapi/fpm/fpm/fpm_conf.c
+++ b/sapi/fpm/fpm/fpm_conf.c
@@ -1447,11 +1447,11 @@ static void fpm_conf_ini_parser(zval *arg1, zval *arg2, zval *arg3, int callback
int fpm_conf_load_ini_file(char filename TSRMLS_DC) / {{{ */
{
- const int bufsize = 1024;
int error = 0;
- char buf[1024+1];
- int fd, n;
- char buf[bufsize], *newl;
- int fd, pos = 0;
int nb_read = 1;
-
char c = '*';
int ret = 1;
@@ -1473,36 +1473,48 @@ int fpm_conf_load_ini_file(char filename TSRMLS_DC) / {{{ */
}
ini_lineno = 0;
- memset(buf, 0, sizeof buf);
while (nb_read > 0) {
int tmp;
-
memset(buf, 0, sizeof(char) * (1024 + 1));
-
for (n = 0; n < 1024 && (nb_read = read(fd, &c, sizeof(char))) == sizeof(char) && c != '\n'; n++) {
-
buf[n] = c;
-
}
-
buf[n++] = '\n';
-
ini_lineno++;
-
ini_filename = filename;
-
tmp = zend_parse_ini_string(buf, 1, ZEND_INI_SCANNER_NORMAL, (zend_ini_parser_cb_t)fpm_conf_ini_parser, &error TSRMLS_CC);
-
ini_filename = filename;
-
if (error || tmp == FAILURE) {
-
if (ini_include) free(ini_include);
-
ini_recursion--;
-
close(fd);
-
return -1;
-
}
-
if (ini_include) {
-
char *tmp = ini_include;
-
ini_include = NULL;
-
fpm_evaluate_full_path(&tmp, NULL, NULL, 0);
-
fpm_conf_ini_parser_include(tmp, &error TSRMLS_CC);
-
if (error) {
-
free(tmp);
-
nb_read = read(fd, buf + pos, sizeof buf - pos);
-
pos = 0;
-
while ((newl = strchr(buf + pos, '\n')) != NULL) {
-
newl[0] = '\0';
-
ini_lineno++;
-
ini_filename = filename;
-
tmp = zend_parse_ini_string(buf + pos, 1, ZEND_INI_SCANNER_NORMAL, (zend_ini_parser_cb_t)fpm_conf_ini_parser, &error TSRMLS_CC);
-
ini_filename = filename;
-
if (error || tmp == FAILURE) {
-
if (ini_include) free(ini_include); ini_recursion--; close(fd); return -1; }
-
free(tmp);
-
if (ini_include) {
-
char *tmp = ini_include;
-
ini_include = NULL;
-
fpm_evaluate_full_path(&tmp, NULL, NULL, 0);
-
fpm_conf_ini_parser_include(tmp, &error TSRMLS_CC);
-
if (error) {
-
free(tmp);
-
ini_recursion--;
-
close(fd);
-
return -1;
-
}
-
free(tmp);
-
}
-
pos = newl - buf + 1;
-
}
-
if (nb_read > 0 && pos == 0) {
-
zlog(ZLOG_ERROR, "line %u too long", ini_lineno + 1);
-
close(fd);
-
return -1; }
-
memmove(buf, buf + pos, sizeof buf - pos);
-
pos = sizeof buf - pos;
}
ini_recursion--;