]> granicus.if.org Git - php/commitdiff
another optimization - move inode hash to initial manifest parsing, improves runtime...
authorGreg Beaver <cellog@php.net>
Sun, 15 Jun 2008 21:42:20 +0000 (21:42 +0000)
committerGreg Beaver <cellog@php.net>
Sun, 15 Jun 2008 21:42:20 +0000 (21:42 +0000)
ext/phar/phar.c
ext/phar/phar.phar
ext/phar/phar_internal.h
ext/phar/phar_object.c
ext/phar/stream.c
ext/phar/tar.c
ext/phar/zip.c

index 906020a26ab62b3ea03f6ea2fb35a855bd04eda3..10df6d4c9bf0d64fdf973c343cacb6a4f0dceb27 100644 (file)
@@ -1070,6 +1070,7 @@ static int phar_parse_pharfile(php_stream *fp, char *fname, int fname_len, char
                manifest_flags |= (entry.flags & PHAR_ENT_COMPRESSION_MASK);
                /* if signature matched, no need to check CRC32 for each file */
                entry.is_crc_checked = (manifest_flags & PHAR_HDR_SIGNATURE ? 1 : 0);
+               phar_set_inode(&entry TSRMLS_CC);
                zend_hash_add(&mydata->manifest, entry.filename, entry.filename_len, (void*)&entry, sizeof(phar_entry_info), NULL);
        }
 
index cf4484da2b64ba051894f76def13d690ed866531..d45774867a5873f52758a63f09eb3ecd078756ac 100755 (executable)
Binary files a/ext/phar/phar.phar and b/ext/phar/phar.phar differ
index 3d771f2393c9b810b0d96888a9f04b09988e7106..85a2b8551c96eaa732cc0114fa78da4056e4e30f 100755 (executable)
@@ -268,6 +268,8 @@ typedef struct _phar_entry_info {
        int                      is_zip:1;
        /* for cached phar entries */
        int                      is_persistent:1;
+       /* for stat */
+       unsigned short           inode;
 } phar_entry_info;
 
 /* information about a phar file (the archive itself) */
@@ -408,6 +410,17 @@ static inline int phar_validate_alias(const char *alias, int alias_len) /* {{{ *
 }
 /* }}} */
 
+static inline void phar_set_inode(phar_entry_info *entry TSRMLS_DC) /* {{{ */
+{
+       char tmp[MAXPATHLEN];
+       int tmp_len;
+
+       tmp_len = entry->filename_len + entry->phar->fname_len;
+       memcpy(tmp, entry->phar->fname, entry->phar->fname_len);
+       memcpy(tmp + entry->phar->fname_len, entry->filename, entry->filename_len);
+       entry->inode = (unsigned short)zend_get_hash_value(tmp, tmp_len);
+}
+/* }}} */
 
 void phar_request_initialize(TSRMLS_D);
 
index 8d3becbef3095ec8ce46885f15b9659a7d3bf874..0c76b876d976d8914ceaf97d17e24da810bdad6a 100755 (executable)
@@ -2104,6 +2104,7 @@ no_copy:
                newentry.is_modified = 1;
                newentry.phar = phar;
                newentry.old_flags = newentry.flags & ~PHAR_ENT_COMPRESSION_MASK; /* remove compression from old_flags */
+               phar_set_inode(&newentry TSRMLS_CC);
                zend_hash_add(&(phar->manifest), newentry.filename, newentry.filename_len, (void*)&newentry, sizeof(phar_entry_info), NULL);
                phar_add_virtual_dirs(phar, newentry.filename, newentry.filename_len TSRMLS_CC);
        }
index a12f21c35ca19d1c2e108b198c0cbdd7cb95267a..4854aeb90706baaf747ac39ab73ea0c34c6b3507 100644 (file)
@@ -402,8 +402,6 @@ static int phar_stream_flush(php_stream *stream TSRMLS_DC) /* {{{ */
 void phar_dostat(phar_archive_data *phar, phar_entry_info *data, php_stream_statbuf *ssb, 
                        zend_bool is_temp_dir, char *alias, int alias_len TSRMLS_DC)
 {
-       char *tmp;
-       int tmp_len;
        memset(ssb, 0, sizeof(php_stream_statbuf));
 
        if (!is_temp_dir && !data->is_dir) {
@@ -454,23 +452,12 @@ void phar_dostat(phar_archive_data *phar, phar_entry_info *data, php_stream_stat
 
        ssb->sb.st_nlink = 1;
        ssb->sb.st_rdev = -1;
-       if (data) {
-               tmp_len = data->filename_len + alias_len;
-       } else {
-               tmp_len = alias_len + 1;
-       }
-       tmp = (char *) emalloc(tmp_len);
-       memcpy(tmp, alias, alias_len);
-       if (data) {
-               memcpy(tmp + alias_len, data->filename, data->filename_len);
-       } else {
-               *(tmp+alias_len) = '/';
-       }
        /* this is only for APC, so use /dev/null device - no chance of conflict there! */
        ssb->sb.st_dev = 0xc;
        /* generate unique inode number for alias/filename, so no phars will conflict */
-       ssb->sb.st_ino = (unsigned short)zend_get_hash_value(tmp, tmp_len);
-       efree(tmp);
+       if (!is_temp_dir) {
+               ssb->sb.st_ino = data->inode;
+       }
 #ifndef PHP_WIN32
        ssb->sb.st_blksize = -1;
        ssb->sb.st_blocks = -1;
index 8d4d0355f573f1cad618274f23b756df408b7355..618ff7699743b134ba04704168bd27f52c4b7359 100644 (file)
@@ -413,6 +413,7 @@ bail:
                } else if (entry.tar_type == TAR_SYMLINK) {
                        entry.link = estrdup(hdr->linkname);
                }
+               phar_set_inode(&entry TSRMLS_CC);
                zend_hash_add(&myphar->manifest, entry.filename, entry.filename_len, (void*)&entry, sizeof(phar_entry_info), (void **) &newentry);
                if (entry.filename_len >= sizeof(".phar/.metadata")-1 && !memcmp(entry.filename, ".phar/.metadata", sizeof(".phar/.metadata")-1)) {
                        if (FAILURE == phar_tar_process_metadata(newentry, fp TSRMLS_CC)) {
index 3026c3b6f53e890817464dee0039d74aed4a45b8..c36f2a70cc02cf0892bd042c254921ee3a6b9cb1 100644 (file)
@@ -462,6 +462,7 @@ foundit:
                        /* return to central directory parsing */
                        php_stream_seek(fp, saveloc, SEEK_SET);
                }
+               phar_set_inode(&entry TSRMLS_CC);
                zend_hash_add(&mydata->manifest, entry.filename, entry.filename_len, (void *)&entry,sizeof(phar_entry_info), NULL);
        }
        mydata->fp = fp;