diff options
author | Brian Havard <bjh@apache.org> | 2010-03-30 10:35:43 +0000 |
---|---|---|
committer | Brian Havard <bjh@apache.org> | 2010-03-30 10:35:43 +0000 |
commit | 2ea737c161153c38fa5f9c826b8bee5b961da8e3 (patch) | |
tree | 2872d30f5b4e22b9f9a6e5d53f70958f8dde48e8 /file_io/os2/buffer.c | |
parent | 45b199ad97cd3404e9885aa178a3bd6afa20e043 (diff) | |
download | apr-2ea737c161153c38fa5f9c826b8bee5b961da8e3.tar.gz apr-2ea737c161153c38fa5f9c826b8bee5b961da8e3.zip |
OS/2: Only mutex protect buffer access if APR_FOPEN_XTHREAD is specified.
Also add missing mutex locking in apr_file_flush().
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@929070 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'file_io/os2/buffer.c')
-rw-r--r-- | file_io/os2/buffer.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/file_io/os2/buffer.c b/file_io/os2/buffer.c index 34e4e6393..4fc73804b 100644 --- a/file_io/os2/buffer.c +++ b/file_io/os2/buffer.c @@ -22,35 +22,45 @@ APR_DECLARE(apr_status_t) apr_file_buffer_set(apr_file_t *file, apr_size_t bufsize) { apr_status_t rv; + int do_locking = file->mutex != NULL && file->buffered; - apr_thread_mutex_lock(file->mutex); + if (do_locking) { + apr_thread_mutex_lock(file->mutex); + } - if(file->buffered) { + if (file->buffered) { /* Flush the existing buffer */ rv = apr_file_flush(file); if (rv != APR_SUCCESS) { - apr_thread_mutex_unlock(file->mutex); + if (do_locking) { + apr_thread_mutex_unlock(file->mutex); + } + return rv; } } file->buffer = buffer; file->bufsize = bufsize; - file->buffered = 1; file->bufpos = 0; file->direction = 0; file->dataRead = 0; - - if (file->bufsize == 0) { - /* Setting the buffer size to zero is equivalent to turning - * buffering off. - */ - file->buffered = 0; + + if (bufsize > 0 && file->mutex == NULL && (file->flags & APR_FOPEN_XTHREAD)) { + /* buffering is being turned on but we have no mutex, make one */ + rv = apr_thread_mutex_create(&file->mutex, 0, file->pool); } + + /* Setting the buffer size to zero is equivalent to turning + * buffering off. + */ + file->buffered = file->bufsize > 0; - apr_thread_mutex_unlock(file->mutex); + if (do_locking) { + apr_thread_mutex_unlock(file->mutex); + } - return APR_SUCCESS; + return rv; } APR_DECLARE(apr_size_t) apr_file_buffer_size_get(apr_file_t *file) |