mirror of
https://github.com/php/php-src.git
synced 2024-09-21 18:07:23 +00:00
Fixed bug #31515 (Improve performance of scandir() by factor of 10 or so).
This commit is contained in:
parent
498cce1f80
commit
c7b931d80d
@ -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) {
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user