mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-20 07:59:00 +00:00
virFDStreamData: Turn into virObjectLockable
While this is no functional change, it makes the code look a bit nicer. Moreover, it prepares ground for future work. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> Reviewed-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
parent
58667ddd5b
commit
585eb46920
@ -53,6 +53,8 @@ VIR_LOG_INIT("fdstream");
|
|||||||
typedef struct virFDStreamData virFDStreamData;
|
typedef struct virFDStreamData virFDStreamData;
|
||||||
typedef virFDStreamData *virFDStreamDataPtr;
|
typedef virFDStreamData *virFDStreamDataPtr;
|
||||||
struct virFDStreamData {
|
struct virFDStreamData {
|
||||||
|
virObjectLockable parent;
|
||||||
|
|
||||||
int fd;
|
int fd;
|
||||||
int errfd;
|
int errfd;
|
||||||
virCommandPtr cmd;
|
virCommandPtr cmd;
|
||||||
@ -77,10 +79,31 @@ struct virFDStreamData {
|
|||||||
virFDStreamInternalCloseCb icbCb;
|
virFDStreamInternalCloseCb icbCb;
|
||||||
virFDStreamInternalCloseCbFreeOpaque icbFreeOpaque;
|
virFDStreamInternalCloseCbFreeOpaque icbFreeOpaque;
|
||||||
void *icbOpaque;
|
void *icbOpaque;
|
||||||
|
|
||||||
virMutex lock;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static virClassPtr virFDStreamDataClass;
|
||||||
|
|
||||||
|
static void
|
||||||
|
virFDStreamDataDispose(void *obj)
|
||||||
|
{
|
||||||
|
virFDStreamDataPtr fdst = obj;
|
||||||
|
|
||||||
|
VIR_DEBUG("obj=%p", fdst);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int virFDStreamDataOnceInit(void)
|
||||||
|
{
|
||||||
|
if (!(virFDStreamDataClass = virClassNew(virClassForObjectLockable(),
|
||||||
|
"virFDStreamData",
|
||||||
|
sizeof(virFDStreamData),
|
||||||
|
virFDStreamDataDispose)))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
VIR_ONCE_GLOBAL_INIT(virFDStreamData)
|
||||||
|
|
||||||
|
|
||||||
static int virFDStreamRemoveCallback(virStreamPtr stream)
|
static int virFDStreamRemoveCallback(virStreamPtr stream)
|
||||||
{
|
{
|
||||||
@ -93,7 +116,7 @@ static int virFDStreamRemoveCallback(virStreamPtr stream)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
virMutexLock(&fdst->lock);
|
virObjectLock(fdst);
|
||||||
if (fdst->watch == 0) {
|
if (fdst->watch == 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
"%s", _("stream does not have a callback registered"));
|
"%s", _("stream does not have a callback registered"));
|
||||||
@ -115,7 +138,7 @@ static int virFDStreamRemoveCallback(virStreamPtr stream)
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
virMutexUnlock(&fdst->lock);
|
virObjectUnlock(fdst);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,7 +153,7 @@ static int virFDStreamUpdateCallback(virStreamPtr stream, int events)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
virMutexLock(&fdst->lock);
|
virObjectLock(fdst);
|
||||||
if (fdst->watch == 0) {
|
if (fdst->watch == 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
"%s", _("stream does not have a callback registered"));
|
"%s", _("stream does not have a callback registered"));
|
||||||
@ -143,7 +166,7 @@ static int virFDStreamUpdateCallback(virStreamPtr stream, int events)
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
virMutexUnlock(&fdst->lock);
|
virObjectUnlock(fdst);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,9 +185,9 @@ static void virFDStreamEvent(int watch ATTRIBUTE_UNUSED,
|
|||||||
if (!fdst)
|
if (!fdst)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
virMutexLock(&fdst->lock);
|
virObjectLock(fdst);
|
||||||
if (!fdst->cb) {
|
if (!fdst->cb) {
|
||||||
virMutexUnlock(&fdst->lock);
|
virObjectUnlock(fdst);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,21 +195,19 @@ static void virFDStreamEvent(int watch ATTRIBUTE_UNUSED,
|
|||||||
cbopaque = fdst->opaque;
|
cbopaque = fdst->opaque;
|
||||||
ff = fdst->ff;
|
ff = fdst->ff;
|
||||||
fdst->dispatching = true;
|
fdst->dispatching = true;
|
||||||
virMutexUnlock(&fdst->lock);
|
virObjectUnlock(fdst);
|
||||||
|
|
||||||
cb(stream, events, cbopaque);
|
cb(stream, events, cbopaque);
|
||||||
|
|
||||||
virMutexLock(&fdst->lock);
|
virObjectLock(fdst);
|
||||||
fdst->dispatching = false;
|
fdst->dispatching = false;
|
||||||
if (fdst->cbRemoved && ff)
|
if (fdst->cbRemoved && ff)
|
||||||
(ff)(cbopaque);
|
(ff)(cbopaque);
|
||||||
closed = fdst->closed;
|
closed = fdst->closed;
|
||||||
virMutexUnlock(&fdst->lock);
|
virObjectUnlock(fdst);
|
||||||
|
|
||||||
if (closed) {
|
if (closed)
|
||||||
virMutexDestroy(&fdst->lock);
|
virObjectUnref(fdst);
|
||||||
VIR_FREE(fdst);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void virFDStreamCallbackFree(void *opaque)
|
static void virFDStreamCallbackFree(void *opaque)
|
||||||
@ -211,7 +232,7 @@ virFDStreamAddCallback(virStreamPtr st,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
virMutexLock(&fdst->lock);
|
virObjectLock(fdst);
|
||||||
if (fdst->watch != 0) {
|
if (fdst->watch != 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
"%s", _("stream already has a callback registered"));
|
"%s", _("stream already has a callback registered"));
|
||||||
@ -239,7 +260,7 @@ virFDStreamAddCallback(virStreamPtr st,
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
virMutexUnlock(&fdst->lock);
|
virObjectUnlock(fdst);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -307,7 +328,7 @@ virFDStreamCloseInt(virStreamPtr st, bool streamAbort)
|
|||||||
if (!st || !(fdst = st->privateData) || fdst->abortCallbackDispatching)
|
if (!st || !(fdst = st->privateData) || fdst->abortCallbackDispatching)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
virMutexLock(&fdst->lock);
|
virObjectLock(fdst);
|
||||||
|
|
||||||
/* aborting the stream, ensure the callback is called if it's
|
/* aborting the stream, ensure the callback is called if it's
|
||||||
* registered for stream error event */
|
* registered for stream error event */
|
||||||
@ -317,7 +338,7 @@ virFDStreamCloseInt(virStreamPtr st, bool streamAbort)
|
|||||||
VIR_STREAM_EVENT_WRITABLE))) {
|
VIR_STREAM_EVENT_WRITABLE))) {
|
||||||
/* don't enter this function accidentally from the callback again */
|
/* don't enter this function accidentally from the callback again */
|
||||||
if (fdst->abortCallbackCalled) {
|
if (fdst->abortCallbackCalled) {
|
||||||
virMutexUnlock(&fdst->lock);
|
virObjectUnlock(fdst);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -327,12 +348,12 @@ virFDStreamCloseInt(virStreamPtr st, bool streamAbort)
|
|||||||
/* cache the pointers */
|
/* cache the pointers */
|
||||||
cb = fdst->cb;
|
cb = fdst->cb;
|
||||||
opaque = fdst->opaque;
|
opaque = fdst->opaque;
|
||||||
virMutexUnlock(&fdst->lock);
|
virObjectUnlock(fdst);
|
||||||
|
|
||||||
/* call failure callback, poll reports nothing on closed fd */
|
/* call failure callback, poll reports nothing on closed fd */
|
||||||
(cb)(st, VIR_STREAM_EVENT_ERROR, opaque);
|
(cb)(st, VIR_STREAM_EVENT_ERROR, opaque);
|
||||||
|
|
||||||
virMutexLock(&fdst->lock);
|
virObjectLock(fdst);
|
||||||
fdst->abortCallbackDispatching = false;
|
fdst->abortCallbackDispatching = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -356,11 +377,10 @@ virFDStreamCloseInt(virStreamPtr st, bool streamAbort)
|
|||||||
|
|
||||||
if (fdst->dispatching) {
|
if (fdst->dispatching) {
|
||||||
fdst->closed = true;
|
fdst->closed = true;
|
||||||
virMutexUnlock(&fdst->lock);
|
virObjectUnlock(fdst);
|
||||||
} else {
|
} else {
|
||||||
virMutexUnlock(&fdst->lock);
|
virObjectUnlock(fdst);
|
||||||
virMutexDestroy(&fdst->lock);
|
virObjectUnref(fdst);
|
||||||
VIR_FREE(fdst);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -395,13 +415,13 @@ static int virFDStreamWrite(virStreamPtr st, const char *bytes, size_t nbytes)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
virMutexLock(&fdst->lock);
|
virObjectLock(fdst);
|
||||||
|
|
||||||
if (fdst->length) {
|
if (fdst->length) {
|
||||||
if (fdst->length == fdst->offset) {
|
if (fdst->length == fdst->offset) {
|
||||||
virReportSystemError(ENOSPC, "%s",
|
virReportSystemError(ENOSPC, "%s",
|
||||||
_("cannot write to stream"));
|
_("cannot write to stream"));
|
||||||
virMutexUnlock(&fdst->lock);
|
virObjectUnlock(fdst);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -427,7 +447,7 @@ static int virFDStreamWrite(virStreamPtr st, const char *bytes, size_t nbytes)
|
|||||||
fdst->offset += ret;
|
fdst->offset += ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
virMutexUnlock(&fdst->lock);
|
virObjectUnlock(fdst);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -449,11 +469,11 @@ static int virFDStreamRead(virStreamPtr st, char *bytes, size_t nbytes)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
virMutexLock(&fdst->lock);
|
virObjectLock(fdst);
|
||||||
|
|
||||||
if (fdst->length) {
|
if (fdst->length) {
|
||||||
if (fdst->length == fdst->offset) {
|
if (fdst->length == fdst->offset) {
|
||||||
virMutexUnlock(&fdst->lock);
|
virObjectUnlock(fdst);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -479,7 +499,7 @@ static int virFDStreamRead(virStreamPtr st, char *bytes, size_t nbytes)
|
|||||||
fdst->offset += ret;
|
fdst->offset += ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
virMutexUnlock(&fdst->lock);
|
virObjectUnlock(fdst);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -505,25 +525,22 @@ static int virFDStreamOpenInternal(virStreamPtr st,
|
|||||||
VIR_DEBUG("st=%p fd=%d cmd=%p errfd=%d length=%llu",
|
VIR_DEBUG("st=%p fd=%d cmd=%p errfd=%d length=%llu",
|
||||||
st, fd, cmd, errfd, length);
|
st, fd, cmd, errfd, length);
|
||||||
|
|
||||||
|
if (virFDStreamDataInitialize() < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
if ((st->flags & VIR_STREAM_NONBLOCK) &&
|
if ((st->flags & VIR_STREAM_NONBLOCK) &&
|
||||||
virSetNonBlock(fd) < 0) {
|
virSetNonBlock(fd) < 0) {
|
||||||
virReportSystemError(errno, "%s", _("Unable to set non-blocking mode"));
|
virReportSystemError(errno, "%s", _("Unable to set non-blocking mode"));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (VIR_ALLOC(fdst) < 0)
|
if (!(fdst = virObjectLockableNew(virFDStreamDataClass)))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
fdst->fd = fd;
|
fdst->fd = fd;
|
||||||
fdst->cmd = cmd;
|
fdst->cmd = cmd;
|
||||||
fdst->errfd = errfd;
|
fdst->errfd = errfd;
|
||||||
fdst->length = length;
|
fdst->length = length;
|
||||||
if (virMutexInit(&fdst->lock) < 0) {
|
|
||||||
VIR_FREE(fdst);
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
||||||
_("Unable to initialize mutex"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
st->driver = &virFDStreamDrv;
|
st->driver = &virFDStreamDrv;
|
||||||
st->privateData = fdst;
|
st->privateData = fdst;
|
||||||
@ -821,7 +838,7 @@ int virFDStreamSetInternalCloseCb(virStreamPtr st,
|
|||||||
{
|
{
|
||||||
virFDStreamDataPtr fdst = st->privateData;
|
virFDStreamDataPtr fdst = st->privateData;
|
||||||
|
|
||||||
virMutexLock(&fdst->lock);
|
virObjectLock(fdst);
|
||||||
|
|
||||||
if (fdst->icbFreeOpaque)
|
if (fdst->icbFreeOpaque)
|
||||||
(fdst->icbFreeOpaque)(fdst->icbOpaque);
|
(fdst->icbFreeOpaque)(fdst->icbOpaque);
|
||||||
@ -830,6 +847,6 @@ int virFDStreamSetInternalCloseCb(virStreamPtr st,
|
|||||||
fdst->icbOpaque = opaque;
|
fdst->icbOpaque = opaque;
|
||||||
fdst->icbFreeOpaque = fcb;
|
fdst->icbFreeOpaque = fcb;
|
||||||
|
|
||||||
virMutexUnlock(&fdst->lock);
|
virObjectUnlock(fdst);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user