aboutsummaryrefslogtreecommitdiff
path: root/file_io/os2/buffer.c
diff options
context:
space:
mode:
authorBrian Havard <bjh@apache.org>2010-03-30 10:35:43 +0000
committerBrian Havard <bjh@apache.org>2010-03-30 10:35:43 +0000
commit2ea737c161153c38fa5f9c826b8bee5b961da8e3 (patch)
tree2872d30f5b4e22b9f9a6e5d53f70958f8dde48e8 /file_io/os2/buffer.c
parent45b199ad97cd3404e9885aa178a3bd6afa20e043 (diff)
downloadapr-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.c34
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)