]> granicus.if.org Git - php/commitdiff
Remove ZEND_HANDLE_MAPPED
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 16 Jul 2019 15:17:19 +0000 (17:17 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 16 Jul 2019 15:44:32 +0000 (17:44 +0200)
The buf/len members are now simply used in addition to the main
stream, without changing the handle kind.

Zend/zend_stream.c
Zend/zend_stream.h
ext/opcache/ZendAccelerator.c
ext/phar/phar.c
main/main.c
sapi/phpdbg/phpdbg_prompt.c

index 9e81e3acaba2529967e8d45dc4ce40a63a19b32d..0360c38b344b9b8069cd2977f3d7cb2bf031b614 100644 (file)
@@ -51,35 +51,11 @@ static size_t zend_stream_stdio_fsizer(void *handle) /* {{{ */
        return 0;
 } /* }}} */
 
-static void zend_stream_unmap(zend_stream *stream) { /* {{{ */
-       if (stream->mmap.buf) {
-               efree(stream->mmap.buf);
-       }
-       stream->mmap.len = 0;
-       stream->mmap.buf = 0;
-       stream->handle   = stream->mmap.old_handle;
-} /* }}} */
-
-static void zend_stream_mmap_closer(zend_stream *stream) /* {{{ */
-{
-       zend_stream_unmap(stream);
-       if (stream->mmap.old_closer && stream->handle) {
-               stream->mmap.old_closer(stream->handle);
-       }
-} /* }}} */
-
-static inline int zend_stream_is_mmap(zend_file_handle *file_handle) { /* {{{ */
-       return file_handle->type == ZEND_HANDLE_MAPPED;
-} /* }}} */
-
 static size_t zend_stream_fsize(zend_file_handle *file_handle) /* {{{ */
 {
        zend_stat_t buf;
 
-       if (zend_stream_is_mmap(file_handle)) {
-               return file_handle->handle.stream.mmap.len;
-       }
-       if (file_handle->type == ZEND_HANDLE_STREAM || file_handle->type == ZEND_HANDLE_MAPPED) {
+       if (file_handle->type == ZEND_HANDLE_STREAM) {
                return file_handle->handle.stream.fsizer(file_handle->handle.stream.handle);
        }
        if (file_handle->handle.fp && zend_fstat(fileno(file_handle->handle.fp), &buf) == 0) {
@@ -109,16 +85,14 @@ ZEND_API void zend_stream_init_filename(zend_file_handle *handle, const char *fi
 
 ZEND_API int zend_stream_open(const char *filename, zend_file_handle *handle) /* {{{ */
 {
+       zend_string *opened_path;
        if (zend_stream_open_function) {
                return zend_stream_open_function(filename, handle);
        }
-       handle->type = ZEND_HANDLE_FP;
-       handle->opened_path = NULL;
-       handle->handle.fp = zend_fopen(filename, &handle->opened_path);
-       handle->filename = filename;
-       memset(&handle->handle.stream.mmap, 0, sizeof(zend_mmap));
 
-       return (handle->handle.fp) ? SUCCESS : FAILURE;
+       zend_stream_init_fp(handle, zend_fopen(filename, &opened_path), filename);
+       handle->opened_path = opened_path;
+       return handle->handle.fp ? SUCCESS : FAILURE;
 } /* }}} */
 
 static int zend_stream_getc(zend_file_handle *file_handle) /* {{{ */
@@ -133,7 +107,7 @@ static int zend_stream_getc(zend_file_handle *file_handle) /* {{{ */
 
 static size_t zend_stream_read(zend_file_handle *file_handle, char *buf, size_t len) /* {{{ */
 {
-       if (!zend_stream_is_mmap(file_handle) && file_handle->handle.stream.isatty) {
+       if (file_handle->handle.stream.isatty) {
                int c = '*';
                size_t n;
 
@@ -154,35 +128,29 @@ ZEND_API int zend_stream_fixup(zend_file_handle *file_handle, char **buf, size_t
        size_t size;
        zend_stream_type old_type;
 
+       if (file_handle->buf) {
+               *buf = file_handle->buf;
+               *len = file_handle->len;
+               return SUCCESS;
+       }
+
        if (file_handle->type == ZEND_HANDLE_FILENAME) {
                if (zend_stream_open(file_handle->filename, file_handle) == FAILURE) {
                        return FAILURE;
                }
        }
 
-       switch (file_handle->type) {
-               case ZEND_HANDLE_FP:
-                       if (!file_handle->handle.fp) {
-                               return FAILURE;
-                       }
-                       memset(&file_handle->handle.stream.mmap, 0, sizeof(zend_mmap));
-                       file_handle->handle.stream.isatty     = isatty(fileno((FILE *)file_handle->handle.stream.handle));
-                       file_handle->handle.stream.reader     = (zend_stream_reader_t)zend_stream_stdio_reader;
-                       file_handle->handle.stream.closer     = (zend_stream_closer_t)zend_stream_stdio_closer;
-                       file_handle->handle.stream.fsizer     = (zend_stream_fsizer_t)zend_stream_stdio_fsizer;
-                       memset(&file_handle->handle.stream.mmap, 0, sizeof(file_handle->handle.stream.mmap));
-                       /* no break; */
-               case ZEND_HANDLE_STREAM:
-                       /* nothing to do */
-                       break;
-
-               case ZEND_HANDLE_MAPPED:
-                       *buf = file_handle->handle.stream.mmap.buf;
-                       *len = file_handle->handle.stream.mmap.len;
-                       return SUCCESS;
-
-               default:
+       if (file_handle->type == ZEND_HANDLE_FP) {
+               if (!file_handle->handle.fp) {
                        return FAILURE;
+               }
+
+               file_handle->type = ZEND_HANDLE_STREAM;
+               file_handle->handle.stream.handle = file_handle->handle.fp;
+               file_handle->handle.stream.isatty = isatty(fileno((FILE *)file_handle->handle.stream.handle));
+               file_handle->handle.stream.reader = (zend_stream_reader_t)zend_stream_stdio_reader;
+               file_handle->handle.stream.closer = (zend_stream_closer_t)zend_stream_stdio_closer;
+               file_handle->handle.stream.fsizer = (zend_stream_fsizer_t)zend_stream_stdio_fsizer;
        }
 
        size = zend_stream_fsize(file_handle);
@@ -194,8 +162,8 @@ ZEND_API int zend_stream_fixup(zend_file_handle *file_handle, char **buf, size_t
        file_handle->type = ZEND_HANDLE_STREAM;  /* we might still be _FP but we need fsize() work */
 
        if (old_type == ZEND_HANDLE_FP && !file_handle->handle.stream.isatty && size) {
-               file_handle->handle.stream.mmap.buf = *buf = safe_emalloc(1, size, ZEND_MMAP_AHEAD);
-               file_handle->handle.stream.mmap.len = zend_stream_read(file_handle, *buf, size);
+               file_handle->buf = *buf = safe_emalloc(1, size, ZEND_MMAP_AHEAD);
+               file_handle->len = zend_stream_read(file_handle, *buf, size);
        } else {
                size_t read, remain = 4*1024;
                *buf = emalloc(remain);
@@ -210,29 +178,22 @@ ZEND_API int zend_stream_fixup(zend_file_handle *file_handle, char **buf, size_t
                                remain = size;
                        }
                }
-               file_handle->handle.stream.mmap.len = size;
+               file_handle->len = size;
                if (size && remain < ZEND_MMAP_AHEAD) {
                        *buf = safe_erealloc(*buf, size, 1, ZEND_MMAP_AHEAD);
                }
-               file_handle->handle.stream.mmap.buf = *buf;
+               file_handle->buf = *buf;
        }
 
-       if (file_handle->handle.stream.mmap.len == 0) {
+       if (file_handle->len == 0) {
                *buf = erealloc(*buf, ZEND_MMAP_AHEAD);
-               file_handle->handle.stream.mmap.buf = *buf;
+               file_handle->buf = *buf;
        }
 
-       if (ZEND_MMAP_AHEAD) {
-               memset(file_handle->handle.stream.mmap.buf + file_handle->handle.stream.mmap.len, 0, ZEND_MMAP_AHEAD);
-       }
-       file_handle->type = ZEND_HANDLE_MAPPED;
-       file_handle->handle.stream.mmap.old_handle = file_handle->handle.stream.handle;
-       file_handle->handle.stream.mmap.old_closer = file_handle->handle.stream.closer;
-       file_handle->handle.stream.handle          = &file_handle->handle.stream;
-       file_handle->handle.stream.closer          = (zend_stream_closer_t)zend_stream_mmap_closer;
+       memset(file_handle->buf + file_handle->len, 0, ZEND_MMAP_AHEAD);
 
-       *buf = file_handle->handle.stream.mmap.buf;
-       *len = file_handle->handle.stream.mmap.len;
+       *buf = file_handle->buf;
+       *len = file_handle->len;
 
        return SUCCESS;
 } /* }}} */
@@ -244,7 +205,6 @@ ZEND_API void zend_file_handle_dtor(zend_file_handle *fh) /* {{{ */
                        fclose(fh->handle.fp);
                        break;
                case ZEND_HANDLE_STREAM:
-               case ZEND_HANDLE_MAPPED:
                        if (fh->handle.stream.closer && fh->handle.stream.handle) {
                                fh->handle.stream.closer(fh->handle.stream.handle);
                        }
@@ -260,6 +220,10 @@ ZEND_API void zend_file_handle_dtor(zend_file_handle *fh) /* {{{ */
                zend_string_release_ex(fh->opened_path, 0);
                fh->opened_path = NULL;
        }
+       if (fh->buf) {
+               efree(fh->buf);
+               fh->buf = NULL;
+       }
 }
 /* }}} */
 
@@ -273,11 +237,6 @@ ZEND_API int zend_compare_file_handles(zend_file_handle *fh1, zend_file_handle *
                        return fh1->handle.fp == fh2->handle.fp;
                case ZEND_HANDLE_STREAM:
                        return fh1->handle.stream.handle == fh2->handle.stream.handle;
-               case ZEND_HANDLE_MAPPED:
-                       return (fh1->handle.stream.handle == &fh1->handle.stream &&
-                               fh2->handle.stream.handle == &fh2->handle.stream &&
-                               fh1->handle.stream.mmap.old_handle == fh2->handle.stream.mmap.old_handle)
-                               || fh1->handle.stream.handle == fh2->handle.stream.handle;
                default:
                        return 0;
        }
index a554bb884c5610ec609d6214e0ae1b44461be3b4..87aec7aff3cd161abc21c7788b29c548b500b524 100644 (file)
@@ -37,21 +37,12 @@ typedef void   (*zend_stream_closer_t)(void* handle);
 typedef enum {
        ZEND_HANDLE_FILENAME,
        ZEND_HANDLE_FP,
-       ZEND_HANDLE_STREAM,
-       ZEND_HANDLE_MAPPED
+       ZEND_HANDLE_STREAM
 } zend_stream_type;
 
-typedef struct _zend_mmap {
-       size_t      len;
-       char        *buf;
-       void                  *old_handle;
-       zend_stream_closer_t   old_closer;
-} zend_mmap;
-
 typedef struct _zend_stream {
        void        *handle;
        int         isatty;
-       zend_mmap   mmap;
        zend_stream_reader_t   reader;
        zend_stream_fsizer_t   fsizer;
        zend_stream_closer_t   closer;
@@ -65,6 +56,8 @@ typedef struct _zend_file_handle {
        const char        *filename;
        zend_string       *opened_path;
        zend_stream_type  type;
+       char              *buf;
+       size_t            len;
 } zend_file_handle;
 
 BEGIN_EXTERN_C()
index cc576376424fe08933f62673340ff850cc0d2143..6fe08d6faa87138d9726276aaa376e461eea4658 100644 (file)
@@ -970,7 +970,6 @@ accel_time_t zend_get_file_handle_timestamp(zend_file_handle *file_handle, size_
                        }
                        break;
                case ZEND_HANDLE_FILENAME:
-               case ZEND_HANDLE_MAPPED:
                        if (file_handle->opened_path) {
                                char *file_path = ZSTR_VAL(file_handle->opened_path);
 
index 8da3c364e1515590d4c04aa6cd091ecec433f9c3..db81b14d8e9f672c5f8bcfef5ab7f049c87af3a6 100644 (file)
@@ -3264,7 +3264,6 @@ static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type)
 
                                        switch (file_handle->type) {
                                                case ZEND_HANDLE_STREAM:
-                                               case ZEND_HANDLE_MAPPED:
                                                        if (file_handle->handle.stream.closer && file_handle->handle.stream.handle) {
                                                                file_handle->handle.stream.closer(file_handle->handle.stream.handle);
                                                        }
@@ -3288,7 +3287,6 @@ static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type)
                                phar->is_persistent ?
                                        php_stream_rewind(PHAR_G(cached_fp)[phar->phar_pos].fp) :
                                        php_stream_rewind(phar->fp);
-                               memset(&file_handle->handle.stream.mmap, 0, sizeof(file_handle->handle.stream.mmap));
                        }
                }
        }
index d3eae3c148014daa533ad5e672a60d9ca92351d4..8b1ad1df2e7a189760d72f9bb4ef8a317abea018 100644 (file)
@@ -1580,16 +1580,17 @@ static int php_stream_open_for_zend(const char *filename, zend_file_handle *hand
 
 PHPAPI int php_stream_open_for_zend_ex(const char *filename, zend_file_handle *handle, int mode) /* {{{ */
 {
-       php_stream *stream = php_stream_open_wrapper((char *)filename, "rb", mode, &handle->opened_path);
-
+       zend_string *opened_path;
+       php_stream *stream = php_stream_open_wrapper((char *)filename, "rb", mode, &opened_path);
        if (stream) {
+               memset(handle, 0, sizeof(zend_file_handle));
                handle->type = ZEND_HANDLE_STREAM;
                handle->filename = (char*)filename;
+               handle->opened_path = opened_path;
                handle->handle.stream.handle  = stream;
                handle->handle.stream.reader  = (zend_stream_reader_t)_php_stream_read;
                handle->handle.stream.fsizer  = php_zend_stream_fsizer;
                handle->handle.stream.isatty  = 0;
-               memset(&handle->handle.stream.mmap, 0, sizeof(handle->handle.stream.mmap));
                handle->handle.stream.closer = php_zend_stream_closer;
                /* suppress warning if this stream is not explicitly closed */
                php_stream_auto_cleanup(stream);
index fc7a9b4290f87487185251f066fcf560c5d2525d..24155a7860447e43a26d0c8eaf2695b81b93338e 100644 (file)
@@ -577,9 +577,6 @@ int phpdbg_compile(void) /* {{{ */
        if (php_stream_open_for_zend_ex(PHPDBG_G(exec), &fh, USE_PATH|STREAM_OPEN_FOR_INCLUDE) == SUCCESS && zend_stream_fixup(&fh, &buf, &len) == SUCCESS) {
                CG(skip_shebang) = 1;
                PHPDBG_G(ops) = zend_compile_file(&fh, ZEND_INCLUDE);
-
-               fh.handle.stream.mmap.buf = buf;
-               fh.handle.stream.mmap.len = len;
                zend_destroy_file_handle(&fh);
                if (EG(exception)) {
                        zend_exception_error(EG(exception), E_ERROR);