You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@apr.apache.org by Davi Arnaut <da...@haxent.com.br> on 2007/04/27 16:29:25 UTC
[patch 7/9] share apr_file_t buffers
Share buffers for files opened from the same pool. This may a few KBs for
code paths like:
apr_file_open(f, p);
read/write
apr_file_close(f);
apr_file_open(f, p);
read/write
apr_file_close(f);
---
srclib/apr/file_io/unix/open.c | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
Index: 2.2.x/srclib/apr/file_io/unix/open.c
===================================================================
--- 2.2.x.orig/srclib/apr/file_io/unix/open.c 2007-04-27 11:09:48.000000000 -0300
+++ 2.2.x/srclib/apr/file_io/unix/open.c 2007-04-27 11:09:51.000000000 -0300
@@ -26,6 +26,8 @@
#include "fsio.h"
#endif
+static const char file_cache_buffer_key[] = "FILE_CACHE_BUFFER";
+
apr_status_t apr_unix_file_cleanup(void *thefile)
{
apr_file_t *file = thefile;
@@ -34,6 +36,8 @@
if (file->buffered) {
/* XXX: flush here is not mutex protected */
flush_rv = apr_file_flush(file);
+ apr_pool_userdata_setn(file->buffer, file_cache_buffer_key,
+ apr_pool_cleanup_null, file->pool);
}
if (close(file->filedes) == 0) {
file->filedes = -1;
@@ -151,7 +155,18 @@
(*new)->buffered = (flag & APR_BUFFERED) > 0;
if ((*new)->buffered) {
- (*new)->buffer = apr_palloc(pool, APR_FILE_DEFAULT_BUFSIZE);
+ void *buffer = NULL;
+
+ apr_pool_userdata_get(&buffer, file_cache_buffer_key, pool);
+
+ if (!buffer) {
+ buffer = apr_palloc(pool, APR_FILE_DEFAULT_BUFSIZE);
+ }
+ else {
+ apr_pool_userdata_setn(NULL, file_cache_buffer_key,
+ apr_pool_cleanup_null, pool);
+ }
+ (*new)->buffer = buffer;
(*new)->bufsize = APR_FILE_DEFAULT_BUFSIZE;
#if APR_HAS_THREADS
if ((*new)->flags & APR_XTHREAD) {
--