int vboxNetAdpDestroy(PVBOXNETADP pThis) { int rc = VINF_SUCCESS; if (!ASMAtomicCmpXchgU32((uint32_t volatile *)&pThis->enmState, kVBoxNetAdpState_Transitional, kVBoxNetAdpState_Active)) return VERR_INTNET_FLT_IF_BUSY; Assert(pThis->iUnit >= 0 && pThis->iUnit < VBOXNETADP_MAX_UNITS); vboxNetAdpOsDestroy(pThis); vboxNetAdpReleaseUnit(pThis->iUnit); pThis->iUnit = -1; pThis->szName[0] = '\0'; ASMAtomicWriteU32((uint32_t volatile *)&pThis->enmState, kVBoxNetAdpState_Invalid); return rc; }
int vboxNetAdpDestroy(PVBOXNETADP pThis) { int rc = VINF_SUCCESS; RTSpinlockAcquire(pThis->hSpinlock); if (vboxNetAdpGetState(pThis) != kVBoxNetAdpState_Available || pThis->cBusy) { RTSpinlockRelease(pThis->hSpinlock); return VERR_INTNET_FLT_IF_BUSY; } vboxNetAdpSetState(pThis, kVBoxNetAdpState_Transitional); RTSpinlockRelease(pThis->hSpinlock); vboxNetAdpRelease(pThis); vboxNetAdpOsDestroy(pThis); RTSpinlockAcquire(pThis->hSpinlock); vboxNetAdpSetState(pThis, kVBoxNetAdpState_Invalid); RTSpinlockRelease(pThis->hSpinlock); return rc; }