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;
};
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);
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;
+}
/*
* fdstream.h: generic streams impl for file descriptors
*
- * Copyright (C) 2009-2011 Red Hat, Inc.
+ * Copyright (C) 2009-2012 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
# include "internal.h"
# include "command.h"
+/* internal callback, the generic one is used up by daemon stream driver */
+/* the close callback is called with fdstream private data locked */
+typedef void (*virFDStreamInternalCloseCb)(virStreamPtr st, void *opaque);
+
+typedef void (*virFDStreamInternalCloseCbFreeOpaque)(void *opaque);
+
+
int virFDStreamOpen(virStreamPtr st,
int fd);
int oflags,
mode_t mode);
+int virFDStreamSetInternalCloseCb(virStreamPtr st,
+ virFDStreamInternalCloseCb cb,
+ void *opaque,
+ virFDStreamInternalCloseCbFreeOpaque fcb);
#endif /* __VIR_FDSTREAM_H_ */