From: Ilia Alshanetsky Date: Tue, 22 Feb 2005 00:24:13 +0000 (+0000) Subject: Fixed bug #31515 (Improve performance of scandir() by factor of 10 or so). X-Git-Tag: RELEASE_0_3~270 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c7b931d80d7960040ab51f07f04d0d1e1f05525b;p=php Fixed bug #31515 (Improve performance of scandir() by factor of 10 or so). --- diff --git a/ext/standard/dir.c b/ext/standard/dir.c index 2ee0ed7112..e60dcb0aaf 100644 --- a/ext/standard/dir.c +++ b/ext/standard/dir.c @@ -488,7 +488,7 @@ PHP_FUNCTION(scandir) array_init(return_value); for (i = 0; i < n; i++) { - add_next_index_string(return_value, namelist[i]->d_name, 0); + add_next_index_string(return_value, namelist[i], 0); } if (n) { diff --git a/main/php_streams.h b/main/php_streams.h index 36a022141c..10fc248a00 100755 --- a/main/php_streams.h +++ b/main/php_streams.h @@ -328,11 +328,11 @@ PHPAPI php_stream_dirent *_php_stream_readdir(php_stream *dirstream, php_stream_ #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); diff --git a/main/streams/streams.c b/main/streams/streams.c index 7d2700e08c..066662c9b6 100755 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -1944,28 +1944,28 @@ PHPAPI int php_stream_context_del_link(php_stream_context *context, /* {{{ 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 @@ PHPAPI int _php_stream_scandir(char *dirname, php_stream_dirent **namelist[], in } 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 @@ PHPAPI int _php_stream_scandir(char *dirname, php_stream_dirent **namelist[], in *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; }