aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Krempa <pkrempa@redhat.com>2012-02-23 13:45:25 +0100
committerPeter Krempa <pkrempa@redhat.com>2012-02-27 15:05:17 +0100
commit0c4bfdda42f176633a9db7c52703802e3f0123fe (patch)
tree89978487dbde1b40a2c52f0993ba476b83b4d7aa /src/fdstream.c
parentfdstream: Emit stream abort callback even if poll() doesnt. (diff)
downloadlibvirt-0c4bfdda42f176633a9db7c52703802e3f0123fe.tar.gz
libvirt-0c4bfdda42f176633a9db7c52703802e3f0123fe.tar.bz2
libvirt-0c4bfdda42f176633a9db7c52703802e3f0123fe.zip
fdstream: Add internal callback on stream close
This patch adds another callback to a FDstream object. The original callback is used by the daemon stream driver to handle events. This callback is called if and only if the stream is about to be closed. This might be used to handle cleanup steps after a fdstream exits. This will be used later on in ensuring mutually exclusive access to consoles. * src/fdstream.c: - emit the callback, when stream is being closed - add data structures needed to handle the callback - add function to register callback * src/fdstream.h: - define function prototypes for the callback
Diffstat (limited to 'src/fdstream.c')
-rw-r--r--src/fdstream.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/fdstream.c b/src/fdstream.c
index 39a875364..32d386dce 100644
--- a/src/fdstream.c
+++ b/src/fdstream.c
@@ -67,6 +67,12 @@ struct virFDStreamData {
bool abortCallbackCalled;
bool abortCallbackDispatching;
+ /* internal callback, as the regular one (from generic streams) gets
+ * eaten up by the server stream driver */
+ virFDStreamInternalCloseCb icbCb;
+ virFDStreamInternalCloseCbFreeOpaque icbFreeOpaque;
+ void *icbOpaque;
+
virMutex lock;
};
@@ -313,6 +319,14 @@ virFDStreamCloseInt(virStreamPtr st, bool streamAbort)
st->privateData = NULL;
+ /* call the internal stream closing callback */
+ if (fdst->icbCb) {
+ /* the mutex is not accessible anymore, as private data is null */
+ (fdst->icbCb)(st, fdst->icbOpaque);
+ if (fdst->icbFreeOpaque)
+ (fdst->icbFreeOpaque)(fdst->icbOpaque);
+ }
+
if (fdst->dispatching) {
fdst->closed = true;
virMutexUnlock(&fdst->lock);
@@ -687,3 +701,23 @@ int virFDStreamCreateFile(virStreamPtr st,
offset, length,
oflags | O_CREAT, mode);
}
+
+int virFDStreamSetInternalCloseCb(virStreamPtr st,
+ virFDStreamInternalCloseCb cb,
+ void *opaque,
+ virFDStreamInternalCloseCbFreeOpaque fcb)
+{
+ struct virFDStreamData *fdst = st->privateData;
+
+ virMutexLock(&fdst->lock);
+
+ if (fdst->icbFreeOpaque)
+ (fdst->icbFreeOpaque)(fdst->icbOpaque);
+
+ fdst->icbCb = cb;
+ fdst->icbOpaque = opaque;
+ fdst->icbFreeOpaque = fcb;
+
+ virMutexUnlock(&fdst->lock);
+ return 0;
+}