From: Ilia Alshanetsky Date: Tue, 29 Jul 2003 18:26:59 +0000 (+0000) Subject: MFH: persistent streams patch X-Git-Tag: php-4.3.3RC2~10 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=349a98d388f52fe54ed4eae15f57f606a7a3eeb3;p=php MFH: persistent streams patch --- diff --git a/ext/dba/dba.c b/ext/dba/dba.c index 001b1ca331..ca00f2634e 100644 --- a/ext/dba/dba.c +++ b/ext/dba/dba.c @@ -321,7 +321,11 @@ static void dba_close(dba_info *info TSRMLS_DC) pefree(info->path, info->flags&DBA_PERSISTENT); } if (info->fp && info->fp!=info->lock.fp) { - php_stream_close(info->fp); + if(info->flags&DBA_PERSISTENT) { + php_stream_pclose(info->fp); + } else { + php_stream_close(info->fp); + } } if (info->lock.fd) { php_flock(info->lock.fd, LOCK_UN); @@ -329,7 +333,11 @@ static void dba_close(dba_info *info TSRMLS_DC) info->lock.fd = 0; } if (info->lock.fp) { - php_stream_close(info->lock.fp); + if(info->flags&DBA_PERSISTENT) { + php_stream_pclose(info->lock.fp); + } else { + php_stream_close(info->lock.fp); + } } if (info->lock.name) { pefree(info->lock.name, info->flags&DBA_PERSISTENT); diff --git a/ext/standard/file.c b/ext/standard/file.c index 96476b5b37..ff45fe74b9 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -1156,7 +1156,11 @@ PHPAPI PHP_FUNCTION(fclose) } php_stream_from_zval(stream, arg1); - zend_list_delete(stream->rsrc_id); + if (!stream->is_persistent) { + zend_list_delete(stream->rsrc_id); + } else { + php_stream_pclose(stream); + } RETURN_TRUE; } diff --git a/main/php_streams.h b/main/php_streams.h index ef65f592fe..636dbf07bf 100755 --- a/main/php_streams.h +++ b/main/php_streams.h @@ -333,11 +333,14 @@ PHPAPI int php_stream_from_persistent_id(const char *persistent_id, php_stream * #define PHP_STREAM_FREE_RELEASE_STREAM 2 /* pefree(stream) */ #define PHP_STREAM_FREE_PRESERVE_HANDLE 4 /* tell ops->close to not close it's underlying handle */ #define PHP_STREAM_FREE_RSRC_DTOR 8 /* called from the resource list dtor */ +#define PHP_STREAM_FREE_PERSISTENT 16 /* manually freeing a persistent connection */ #define PHP_STREAM_FREE_CLOSE (PHP_STREAM_FREE_CALL_DTOR | PHP_STREAM_FREE_RELEASE_STREAM) #define PHP_STREAM_FREE_CLOSE_CASTED (PHP_STREAM_FREE_CLOSE | PHP_STREAM_FREE_PRESERVE_HANDLE) +#define PHP_STREAM_FREE_CLOSE_PERSISTENT (PHP_STREAM_FREE_CLOSE | PHP_STREAM_FREE_PERSISTENT) PHPAPI int _php_stream_free(php_stream *stream, int close_options TSRMLS_DC); #define php_stream_free(stream, close_options) _php_stream_free((stream), (close_options) TSRMLS_CC) #define php_stream_close(stream) _php_stream_free((stream), PHP_STREAM_FREE_CLOSE TSRMLS_CC) +#define php_stream_pclose(stream) _php_stream_free((stream), PHP_STREAM_FREE_CLOSE_PERSISTENT TSRMLS_CC) PHPAPI int _php_stream_seek(php_stream *stream, off_t offset, int whence TSRMLS_DC); #define php_stream_rewind(stream) _php_stream_seek((stream), 0L, SEEK_SET TSRMLS_CC) diff --git a/main/streams.c b/main/streams.c index 641d057ddd..c3154f338a 100755 --- a/main/streams.c +++ b/main/streams.c @@ -280,7 +280,7 @@ fprintf(stderr, "stream_alloc: %s:%p persistent=%s\n", ops->label, ret, persiste static int _php_stream_free_persistent(list_entry *le, void *pStream TSRMLS_DC) { - return (le->ptr == pStream && !((php_stream *)pStream)->in_free); + return le->ptr == pStream; } PHPAPI int _php_stream_free(php_stream *stream, int close_options TSRMLS_DC) /* {{{ */ @@ -378,7 +378,7 @@ fprintf(stderr, "stream_free: %s:%p[%s] preserve_handle=%d release_cast=%d remov stream->readbuf = NULL; } - if (stream->is_persistent) { + if (stream->is_persistent && (close_options & PHP_STREAM_FREE_PERSISTENT)) { /* we don't work with *stream but need its value for comparison */ zend_hash_apply_with_argument(&EG(persistent_list), (apply_func_arg_t) _php_stream_free_persistent, stream TSRMLS_CC); }