From 440691899c6e73525393be989682b64e5922cf4b Mon Sep 17 00:00:00 2001 From: Marcus Boerger Date: Mon, 14 May 2007 19:14:00 +0000 Subject: [PATCH] - Optimize flushing, don't generate metadata twice --- ext/phar/phar.c | 29 ++++++++++++++--------------- ext/phar/phar_internal.h | 1 + 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/ext/phar/phar.c b/ext/phar/phar.c index 9d895ce9d2..cb1f9adf64 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -273,6 +273,10 @@ static void destroy_phar_manifest(void *pDest) /* {{{ */ zval_ptr_dtor(&entry->metadata); entry->metadata = 0; } + if (entry->metadata_str.c) { + smart_str_free(&entry->metadata_str); + entry->metadata_str.c = 0; + } efree(entry->filename); } /* }}} */ @@ -2229,17 +2233,20 @@ int phar_flush(phar_archive_data *archive, char *user_stub, long len, char **err } /* after excluding deleted files, calculate manifest size in bytes and number of entries */ ++new_manifest_count; - offset += 4 + entry->filename_len + sizeof(entry_buffer); - metadata_str.c = 0; if (entry->metadata) { + if (entry->metadata_str.c) { + smart_str_free(&entry->metadata_str); + } PHP_VAR_SERIALIZE_INIT(metadata_hash); - php_var_serialize(&metadata_str, &entry->metadata, &metadata_hash TSRMLS_CC); + php_var_serialize(&entry->metadata_str, &entry->metadata, &metadata_hash TSRMLS_CC); PHP_VAR_SERIALIZE_DESTROY(metadata_hash); - offset += metadata_str.len; - smart_str_free(&metadata_str); + } else { + entry->metadata_str.len = 0; } + offset += 4 + entry->filename_len + sizeof(entry_buffer) + entry->metadata_str.len; + /* compress and rehash as necessary */ if (oldfile && !entry->is_modified) { continue; @@ -2433,22 +2440,15 @@ int phar_flush(phar_archive_data *archive, char *user_stub, long len, char **err 4: metadata-len +: metadata */ - metadata_str.c = 0; - if (entry->metadata) { - PHP_VAR_SERIALIZE_INIT(metadata_hash); - php_var_serialize(&metadata_str, &entry->metadata, &metadata_hash TSRMLS_CC); - PHP_VAR_SERIALIZE_DESTROY(metadata_hash); - } mytime = time(NULL); phar_set_32(entry_buffer, entry->uncompressed_filesize); phar_set_32(entry_buffer+4, mytime); phar_set_32(entry_buffer+8, entry->compressed_filesize); phar_set_32(entry_buffer+12, entry->crc32); phar_set_32(entry_buffer+16, entry->flags); - phar_set_32(entry_buffer+20, metadata_str.len); + phar_set_32(entry_buffer+20, entry->metadata_str.len); if (sizeof(entry_buffer) != php_stream_write(newfile, entry_buffer, sizeof(entry_buffer)) - || metadata_str.len != php_stream_write(newfile, metadata_str.c, metadata_str.len)) { - smart_str_free(&metadata_str); + || entry->metadata_str.len != php_stream_write(newfile, entry->metadata_str.c, entry->metadata_str.len)) { if (closeoldfile) { php_stream_close(oldfile); } @@ -2458,7 +2458,6 @@ int phar_flush(phar_archive_data *archive, char *user_stub, long len, char **err } return EOF; } - smart_str_free(&metadata_str); } /* now copy the actual file data to the new phar */ diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h index 7a14d93fb7..5acbf41720 100755 --- a/ext/phar/phar_internal.h +++ b/ext/phar/phar_internal.h @@ -157,6 +157,7 @@ typedef struct _phar_entry_info { int is_modified:1; int is_deleted:1; phar_archive_data *phar; + smart_str metadata_str; } phar_entry_info; /* information about a phar file (the archive itself) */ -- 2.40.0