[PHP-CVS] cvs: php-src /ext/standard dir.c /main php_streams.h /main/streams streams.c
iliaa Mon Feb 21 19:24:13 2005 EDT Modified files: /php-src/main php_streams.h /php-src/main/streams streams.c /php-src/ext/standard dir.c Log: Fixed bug #31515 (Improve performance of scandir() by factor of 10 or so). http://cvs.php.net/diff.php/php-src/main/php_streams.h?r1=1.100r2=1.101ty=u Index: php-src/main/php_streams.h diff -u php-src/main/php_streams.h:1.100 php-src/main/php_streams.h:1.101 --- php-src/main/php_streams.h:1.100Sun Feb 6 18:17:09 2005 +++ php-src/main/php_streams.h Mon Feb 21 19:24:13 2005 @@ -16,7 +16,7 @@ +--+ */ -/* $Id: php_streams.h,v 1.100 2005/02/06 23:17:09 wez Exp $ */ +/* $Id: php_streams.h,v 1.101 2005/02/22 00:24:13 iliaa Exp $ */ #ifndef PHP_STREAMS_H #define PHP_STREAMS_H @@ -328,11 +328,11 @@ #define php_stream_closedir(dirstream) php_stream_close((dirstream)) #define php_stream_rewinddir(dirstream)php_stream_rewind((dirstream)) -PHPAPI int php_stream_dirent_alphasort(const php_stream_dirent **a, const php_stream_dirent **b); -PHPAPI int php_stream_dirent_alphasortr(const php_stream_dirent **a, const php_stream_dirent **b); +PHPAPI int php_stream_dirent_alphasort(const char **a, const char **b); +PHPAPI int php_stream_dirent_alphasortr(const char **a, const char **b); -PHPAPI int _php_stream_scandir(char *dirname, php_stream_dirent **namelist[], int flags, php_stream_context *context, - int (*compare) (const php_stream_dirent **a, const php_stream_dirent **b) TSRMLS_DC); +PHPAPI int _php_stream_scandir(char *dirname, char **namelist[], int flags, php_stream_context *context, + int (*compare) (const char **a, const char **b) TSRMLS_DC); #define php_stream_scandir(dirname, namelist, context, compare) _php_stream_scandir((dirname), (namelist), 0, (context), (compare) TSRMLS_CC) PHPAPI int _php_stream_set_option(php_stream *stream, int option, int value, void *ptrparam TSRMLS_DC); http://cvs.php.net/diff.php/php-src/main/streams/streams.c?r1=1.70r2=1.71ty=u Index: php-src/main/streams/streams.c diff -u php-src/main/streams/streams.c:1.70 php-src/main/streams/streams.c:1.71 --- php-src/main/streams/streams.c:1.70 Mon Nov 15 18:43:12 2004 +++ php-src/main/streams/streams.c Mon Feb 21 19:24:13 2005 @@ -19,7 +19,7 @@ +--+ */ -/* $Id: streams.c,v 1.70 2004/11/15 23:43:12 iliaa Exp $ */ +/* $Id: streams.c,v 1.71 2005/02/22 00:24:13 iliaa Exp $ */ #define _GNU_SOURCE #include php.h @@ -1944,28 +1944,28 @@ /* {{{ php_stream_dirent_alphasort */ -PHPAPI int php_stream_dirent_alphasort(const php_stream_dirent **a, const php_stream_dirent **b) +PHPAPI int php_stream_dirent_alphasort(const char **a, const char **b) { - return strcoll((*a)-d_name,(*b)-d_name); + return strcoll(*a, *b); } /* }}} */ /* {{{ php_stream_dirent_alphasortr */ -PHPAPI int php_stream_dirent_alphasortr(const php_stream_dirent **a, const php_stream_dirent **b) +PHPAPI int php_stream_dirent_alphasortr(const char **a, const char **b) { - return strcoll((*b)-d_name,(*a)-d_name); + return strcoll(*b, *a); } /* }}} */ /* {{{ php_stream_scandir */ -PHPAPI int _php_stream_scandir(char *dirname, php_stream_dirent **namelist[], int flags, php_stream_context *context, - int (*compare) (const php_stream_dirent **a, const php_stream_dirent **b) TSRMLS_DC) +PHPAPI int _php_stream_scandir(char *dirname, char **namelist[], int flags, php_stream_context *context, + int (*compare) (const char **a, const char **b) TSRMLS_DC) { php_stream *stream; php_stream_dirent sdp; - php_stream_dirent **vector = NULL; + char **vector = NULL; int vector_size = 0; int nfiles = 0; @@ -1985,11 +1985,10 @@ } else { vector_size *= 2; } - vector = (php_stream_dirent **) erealloc(vector, vector_size * sizeof(php_stream_dirent *)); + vector = (char **) erealloc(vector, vector_size * sizeof(char *)); } - vector[nfiles] = emalloc(sizeof(php_stream_dirent)); - memcpy(vector[nfiles], sdp, sizeof(sdp)); + vector[nfiles] = estrdup(sdp.d_name); nfiles++; } @@ -1998,7 +1997,7 @@ *namelist = vector; if (compare) { - qsort(*namelist, nfiles, sizeof(php_stream_dirent *), (int(*)(const void *, const void *))compare); + qsort(*namelist, nfiles, sizeof(char *), (int(*)(const void *, const void *))compare); } return nfiles; } http://cvs.php.net/diff.php/php-src/ext/standard/dir.c?r1=1.141r2=1.142ty=u Index: php-src/ext/standard/dir.c diff -u
[PHP-CVS] cvs: php-src /ext/standard dir.c /main php_streams.h /main/streams streams.c
pollita Wed Jan 28 17:21:55 2004 EDT Modified files: /php-src/ext/standard dir.c /php-src/main php_streams.h /php-src/main/streams streams.c Log: 'Bug Fix': scandir, being a new function in PHP5 should have always been wrapper aware. http://cvs.php.net/diff.php/php-src/ext/standard/dir.c?r1=1.132r2=1.133ty=u Index: php-src/ext/standard/dir.c diff -u php-src/ext/standard/dir.c:1.132 php-src/ext/standard/dir.c:1.133 --- php-src/ext/standard/dir.c:1.132Thu Jan 8 03:17:31 2004 +++ php-src/ext/standard/dir.c Wed Jan 28 17:21:53 2004 @@ -16,7 +16,7 @@ +--+ */ -/* $Id: dir.c,v 1.132 2004/01/08 08:17:31 andi Exp $ */ +/* $Id: dir.c,v 1.133 2004/01/28 22:21:53 pollita Exp $ */ /* {{{ includes/startup/misc */ @@ -444,74 +444,45 @@ /* }}} */ #endif -/* {{{ php_alphasortr -*/ -static int php_alphasortr(const struct dirent **a, const struct dirent **b) -{ - return strcoll((*b)-d_name, (*a)-d_name); -} -/* }}} */ - -/* {{{ proto array scandir(string dir [, int sorting_order]) +/* {{{ proto array scandir(string dir [, int sorting_order [, resource context]]) List files directories inside the specified path */ PHP_FUNCTION(scandir) { char *dirn; int dirn_len; int flags = 0; - char *path; - struct dirent **namelist; + php_stream_dirent **namelist; int n, i; + zval *zcontext = NULL; + php_stream_context *context = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, s|l, dirn, dirn_len, flags) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, s|lr, dirn, dirn_len, flags, zcontext) == FAILURE) { return; } -#ifdef ZTS - if (!IS_ABSOLUTE_PATH(dirn, dirn_len)) { - path = expand_filepath(dirn, NULL TSRMLS_CC); - } else -#endif - path = dirn; - - if (PG(safe_mode) (!php_checkuid(path, NULL, CHECKUID_CHECK_FILE_AND_DIR))) { - RETVAL_FALSE; - goto err; - } - if (php_check_open_basedir(path TSRMLS_CC)) { - RETVAL_FALSE; - goto err; + if (zcontext) { + context = php_stream_context_from_zval(zcontext, 0); } if (!flags) { - n = php_scandir(path, namelist, 0, php_alphasort); + n = php_stream_scandir(dirn, namelist, context, (void *) php_stream_dirent_alphasort); } else { - n = php_scandir(path, namelist, 0, (void *) php_alphasortr); + n = php_stream_scandir(dirn, namelist, context, (void *) php_stream_dirent_alphasortr); } - if (n 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, (errno %d): %s, errno, strerror(errno)); - RETVAL_FALSE; - goto err; + RETURN_FALSE; } array_init(return_value); for (i = 0; i n; i++) { - add_next_index_string(return_value, namelist[i]-d_name, 1); - free(namelist[i]); + add_next_index_string(return_value, namelist[i]-d_name, 0); } if (n) { - free(namelist); + efree(namelist); } - -err: - if (path path != dirn) { - efree(path); - } - - return; } /* }}} */ http://cvs.php.net/diff.php/php-src/main/php_streams.h?r1=1.91r2=1.92ty=u Index: php-src/main/php_streams.h diff -u php-src/main/php_streams.h:1.91 php-src/main/php_streams.h:1.92 --- php-src/main/php_streams.h:1.91 Thu Jan 8 12:33:04 2004 +++ php-src/main/php_streams.h Wed Jan 28 17:21:53 2004 @@ -16,7 +16,7 @@ +--+ */ -/* $Id: php_streams.h,v 1.91 2004/01/08 17:33:04 sniper Exp $ */ +/* $Id: php_streams.h,v 1.92 2004/01/28 22:21:53 pollita Exp $ */ #ifndef PHP_STREAMS_H #define PHP_STREAMS_H @@ -325,6 +325,13 @@ #define php_stream_closedir(dirstream) php_stream_close((dirstream)) #define php_stream_rewinddir(dirstream)php_stream_rewind((dirstream)) +PHPAPI int php_stream_dirent_alphasort(const php_stream_dirent **a, const php_stream_dirent **b); +PHPAPI int php_stream_dirent_alphasortr(const php_stream_dirent **a, const php_stream_dirent **b); + +PHPAPI int _php_stream_scandir(char *dirname, php_stream_dirent **namelist[], int flags, php_stream_context *context, + int (*compare) (const php_stream_dirent **a, const php_stream_dirent **b) TSRMLS_DC); +#define php_stream_scandir(dirname, namelist, context, compare) _php_stream_scandir((dirname), (namelist), 0, (context), (compare) TSRMLS_CC) + PHPAPI int _php_stream_set_option(php_stream *stream, int option, int value, void *ptrparam TSRMLS_DC); #define php_stream_set_option(stream, option, value, ptrvalue)