You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by co...@apache.org on 2005/10/18 16:48:32 UTC
svn commit: r326116 - in /apr/apr/trunk: CHANGES file_io/unix/filedup.c
file_io/unix/open.c file_io/unix/readwrite.c include/apr_file_io.h
include/arch/unix/apr_arch_file_io.h test/testfile.c
Author: colm
Date: Tue Oct 18 07:48:23 2005
New Revision: 326116
URL: http://svn.apache.org/viewcvs?rev=326116&view=rev
Log:
Add apr-wide definitions and unix implementation of apr_file_buffer_set() and
apr_file_buffer_size_get() functions, to support variable buffer sizes for
file handles.
Modified:
apr/apr/trunk/CHANGES
apr/apr/trunk/file_io/unix/filedup.c
apr/apr/trunk/file_io/unix/open.c
apr/apr/trunk/file_io/unix/readwrite.c
apr/apr/trunk/include/apr_file_io.h
apr/apr/trunk/include/arch/unix/apr_arch_file_io.h
apr/apr/trunk/test/testfile.c
Modified: apr/apr/trunk/CHANGES
URL: http://svn.apache.org/viewcvs/apr/apr/trunk/CHANGES?rev=326116&r1=326115&r2=326116&view=diff
==============================================================================
--- apr/apr/trunk/CHANGES (original)
+++ apr/apr/trunk/CHANGES Tue Oct 18 07:48:23 2005
@@ -1,5 +1,9 @@
Changes for APR 1.3.0
+ *) Add apr_file_buffer_set() and apr_file_buffer_size_get() functions
+ to support variable buffer sizes with APR file handles.
+ [Colm MacCarthaigh]
+
*) Add apr_file_open_flags_std[err|out|in]() functions.
[Colm MacCarthaigh]
Modified: apr/apr/trunk/file_io/unix/filedup.c
URL: http://svn.apache.org/viewcvs/apr/apr/trunk/file_io/unix/filedup.c?rev=326116&r1=326115&r2=326116&view=diff
==============================================================================
--- apr/apr/trunk/file_io/unix/filedup.c (original)
+++ apr/apr/trunk/file_io/unix/filedup.c Tue Oct 18 07:48:23 2005
@@ -62,7 +62,8 @@
* got one.
*/
if ((*new_file)->buffered && !(*new_file)->buffer) {
- (*new_file)->buffer = apr_palloc(p, APR_FILE_BUFSIZE);
+ (*new_file)->buffer = apr_palloc(p, old_file->bufsize);
+ (*new_file)->bufsize = old_file->bufsize;
}
/* this is the way dup() works */
@@ -121,7 +122,8 @@
memcpy(*new_file, old_file, sizeof(apr_file_t));
(*new_file)->pool = p;
if (old_file->buffered) {
- (*new_file)->buffer = apr_palloc(p, APR_FILE_BUFSIZE);
+ (*new_file)->buffer = apr_palloc(p, old_file->bufsize);
+ (*new_file)->bufsize = old_file->bufsize;
if (old_file->direction == 1) {
memcpy((*new_file)->buffer, old_file->buffer, old_file->bufpos);
}
Modified: apr/apr/trunk/file_io/unix/open.c
URL: http://svn.apache.org/viewcvs/apr/apr/trunk/file_io/unix/open.c?rev=326116&r1=326115&r2=326116&view=diff
==============================================================================
--- apr/apr/trunk/file_io/unix/open.c (original)
+++ apr/apr/trunk/file_io/unix/open.c Tue Oct 18 07:48:23 2005
@@ -150,7 +150,8 @@
(*new)->buffered = (flag & APR_BUFFERED) > 0;
if ((*new)->buffered) {
- (*new)->buffer = apr_palloc(pool, APR_FILE_BUFSIZE);
+ (*new)->buffer = apr_palloc(pool, APR_FILE_DEFAULT_BUFSIZE);
+ (*new)->bufsize = APR_FILE_DEFAULT_BUFSIZE;
#if APR_HAS_THREADS
if ((*new)->flags & APR_XTHREAD) {
(*new)->thlock = thlock;
@@ -239,7 +240,8 @@
#endif
if ((*file)->buffered) {
- (*file)->buffer = apr_palloc(pool, APR_FILE_BUFSIZE);
+ (*file)->buffer = apr_palloc(pool, APR_FILE_DEFAULT_BUFSIZE);
+ (*file)->bufsize = APR_FILE_DEFAULT_BUFSIZE;
#if APR_HAS_THREADS
if ((*file)->flags & APR_XTHREAD) {
apr_status_t rv;
Modified: apr/apr/trunk/file_io/unix/readwrite.c
URL: http://svn.apache.org/viewcvs/apr/apr/trunk/file_io/unix/readwrite.c?rev=326116&r1=326115&r2=326116&view=diff
==============================================================================
--- apr/apr/trunk/file_io/unix/readwrite.c (original)
+++ apr/apr/trunk/file_io/unix/readwrite.c Tue Oct 18 07:48:23 2005
@@ -70,7 +70,8 @@
}
while (rv == 0 && size > 0) {
if (thefile->bufpos >= thefile->dataRead) {
- int bytesread = read(thefile->filedes, thefile->buffer, APR_FILE_BUFSIZE);
+ int bytesread = read(thefile->filedes, thefile->buffer,
+ thefile->bufsize);
if (bytesread == 0) {
thefile->eof_hit = TRUE;
rv = APR_EOF;
@@ -177,11 +178,11 @@
rv = 0;
while (rv == 0 && size > 0) {
- if (thefile->bufpos == APR_FILE_BUFSIZE) /* write buffer is full*/
+ if (thefile->bufpos == thefile->bufsize) /* write buffer is full*/
rv = apr_file_flush(thefile);
- blocksize = size > APR_FILE_BUFSIZE - thefile->bufpos ?
- APR_FILE_BUFSIZE - thefile->bufpos : size;
+ blocksize = size > thefile->bufsize - thefile->bufpos ?
+ thefile->bufsize - thefile->bufpos : size;
memcpy(thefile->buffer + thefile->bufpos, pos, blocksize);
thefile->bufpos += blocksize;
pos += blocksize;
Modified: apr/apr/trunk/include/apr_file_io.h
URL: http://svn.apache.org/viewcvs/apr/apr/trunk/include/apr_file_io.h?rev=326116&r1=326115&r2=326116&view=diff
==============================================================================
--- apr/apr/trunk/include/apr_file_io.h (original)
+++ apr/apr/trunk/include/apr_file_io.h Tue Oct 18 07:48:23 2005
@@ -576,6 +576,27 @@
apr_pool_t *p);
/**
+ * Give the specified apr file handle a new buffer
+ * @param thefile The file handle that is to be modified
+ * @param buffer The buffer
+ * @param bufsize The size of the buffer
+ * @remark It is possible to add a buffer to previously unbuffered
+ * file handles, the APR_BUFFERED flag will be added to
+ * the file handle's flags. Likewise, with buffer=NULL and
+ * bufsize=0 arguments it is possible to make a previously
+ * buffered file handle unbuffered.
+ */
+APR_DECLARE(apr_status_t) apr_file_buffer_set(apr_file_t *thefile,
+ char * buffer,
+ apr_size_t bufsize);
+
+/**
+ * Get the size of any buffer for the specified apr file handle
+ * @param thefile The file handle
+ */
+APR_DECLARE(apr_size_t) apr_file_buffer_size_get(apr_file_t *thefile);
+
+/**
* Move the read/write file offset to a specified byte within a file.
* @param thefile The file descriptor
* @param where How to move the pointer, one of:
Modified: apr/apr/trunk/include/arch/unix/apr_arch_file_io.h
URL: http://svn.apache.org/viewcvs/apr/apr/trunk/include/arch/unix/apr_arch_file_io.h?rev=326116&r1=326115&r2=326116&view=diff
==============================================================================
--- apr/apr/trunk/include/arch/unix/apr_arch_file_io.h (original)
+++ apr/apr/trunk/include/arch/unix/apr_arch_file_io.h Tue Oct 18 07:48:23 2005
@@ -82,7 +82,9 @@
#endif
/* End System headers */
-#define APR_FILE_BUFSIZE 4096
+#define APR_FILE_DEFAULT_BUFSIZE 4096
+/* For backwards-compat */
+#define APR_FILE_BUFSIZE APR_FILE_DEFAULT_BUFSIZE
struct apr_file_t {
apr_pool_t *pool;
@@ -101,7 +103,8 @@
#endif
/* Stuff for buffered mode */
char *buffer;
- int bufpos; /* Read/Write position in buffer */
+ apr_size_t bufpos; /* Read/Write position in buffer */
+ apr_size_t bufsize; /* The size of the buffer */
unsigned long dataRead; /* amount of valid data read into buffer */
int direction; /* buffer being used for 0 = read, 1 = write */
unsigned long filePtr; /* position in file of handle */
Modified: apr/apr/trunk/test/testfile.c
URL: http://svn.apache.org/viewcvs/apr/apr/trunk/test/testfile.c?rev=326116&r1=326115&r2=326116&view=diff
==============================================================================
--- apr/apr/trunk/test/testfile.c (original)
+++ apr/apr/trunk/test/testfile.c Tue Oct 18 07:48:23 2005
@@ -326,6 +326,35 @@
apr_file_close(filetest);
}
+static void test_buffer_set_get(abts_case *tc, void *data)
+{
+ apr_status_t rv;
+ apr_file_t *filetest = NULL;
+ char * buffer;
+
+ rv = apr_file_open(&filetest, FILENAME,
+ APR_WRITE | APR_BUFFERED,
+ APR_UREAD | APR_UWRITE | APR_GREAD, p);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ rv = apr_file_buffer_size_get(filetest);
+ ABTS_INT_EQUAL(tc, APR_BUFFERSIZE, rv);
+
+ buffer = apr_pcalloc(p, 10240);
+ rv = apr_file_buffer_set(filetest, buffer, 10240);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ rv = apr_file_buffer_size_get(filetest);
+ ABTS_INT_EQUAL(tc, 10240, rv);
+
+ rv = apr_file_buffer_set(filetest, buffer, 12);
+ ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
+
+ rv = apr_file_buffer_size_get(filetest);
+ ABTS_INT_EQUAL(tc, 12, rv);
+
+ apr_file_close(filetest);
+}
static void test_getc(abts_case *tc, void *data)
{
apr_file_t *f = NULL;
@@ -802,6 +831,7 @@
abts_run_test(suite, test_bigfprintf, NULL);
abts_run_test(suite, test_fail_write_flush, NULL);
abts_run_test(suite, test_fail_read_flush, NULL);
+ abts_run_test(suite, test_buffer_set_get, NULL);
return suite;
}