summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--runtime/debug.c2
-rw-r--r--runtime/stream.c21
-rw-r--r--runtime/stream.h1
-rwxr-xr-xtests/diag.sh2
4 files changed, 15 insertions, 11 deletions
diff --git a/runtime/debug.c b/runtime/debug.c
index ded1c218..807fd3f7 100644
--- a/runtime/debug.c
+++ b/runtime/debug.c
@@ -778,7 +778,7 @@ static void dbgCallStackPrint(dbgThrdInfo_t *pThrd)
/* print all threads call stacks
*/
-static void dbgCallStackPrintAll(void)
+void dbgCallStackPrintAll(void)
{
dbgThrdInfo_t *pThrd;
/* stack info */
diff --git a/runtime/stream.c b/runtime/stream.c
index eae36796..9f363257 100644
--- a/runtime/stream.c
+++ b/runtime/stream.c
@@ -276,11 +276,13 @@ finalize_it:
static inline void
strmWaitAsyncWriterDone(strm_t *pThis)
{
+ BEGINfunc
if(pThis->bAsyncWrite) {
/* awake writer thread and make it write out everything */
pthread_cond_signal(&pThis->notEmpty);
d_pthread_cond_wait(&pThis->isEmpty, &pThis->mut);
}
+ ENDfunc
}
@@ -296,10 +298,16 @@ static rsRetVal strmCloseFile(strm_t *pThis)
ASSERT(pThis->fd != -1);
dbgoprint((obj_t*) pThis, "file %d closing\n", pThis->fd);
- if(pThis->tOperationsMode != STREAMMODE_READ)
- strmFlush(pThis);
-
- strmWaitAsyncWriterDone(pThis);
+ dbgCallStackPrintAll();
+ if(!pThis->bInClose && pThis->tOperationsMode != STREAMMODE_READ) {
+ pThis->bInClose = 1;
+ if(pThis->bAsyncWrite) {
+ strmFlush(pThis);
+ } else {
+ strmWaitAsyncWriterDone(pThis);
+ }
+ pThis->bInClose = 0;
+ }
close(pThis->fd);
pThis->fd = -1;
@@ -796,11 +804,6 @@ finalize_it:
/* write memory buffer to a stream object.
- * To support direct writes of large objects, this method may be called
- * with a buffer pointing to some region other than the stream buffer itself.
- * However, in that case the stream buffer must be empty (strmFlush() has to
- * be called before), because we would otherwise mess up with the sequence
- * inside the stream. -- rgerhards, 2008-01-10
*/
static inline rsRetVal
doWriteInternal(strm_t *pThis, uchar *pBuf, size_t lenBuf)
diff --git a/runtime/stream.h b/runtime/stream.h
index 2c1ac255..1efd29b5 100644
--- a/runtime/stream.h
+++ b/runtime/stream.h
@@ -118,6 +118,7 @@ typedef struct strm_s {
size_t iBufPtr; /* pointer into current buffer */
int iUngetC; /* char set via UngetChar() call or -1 if none set */
bool bInRecord; /* if 1, indicates that we are currently writing a not-yet complete record */
+ bool bInClose; /* used to break "deadly close loops", tells us we are already inside a close */
int iZipLevel; /* zip level (0..9). If 0, zip is completely disabled */
Bytef *pZipBuf;
/* support for async flush procesing */
diff --git a/tests/diag.sh b/tests/diag.sh
index 1514474c..299c5d71 100755
--- a/tests/diag.sh
+++ b/tests/diag.sh
@@ -5,7 +5,7 @@
# not always able to convey back states to the upper-level test driver
# begun 2009-05-27 by rgerhards
# This file is part of the rsyslog project, released under GPLv3
-valgrind="valgrind --log-fd=1"
+#valgrind="valgrind --log-fd=1"
#valgrind="valgrind --tool=drd --log-fd=1"
#valgrind="valgrind --tool=helgrind --log-fd=1"
#set -o xtrace