static VMCIId ctxUpdateSubID = VMCI_INVALID_ID;
static Atomic_uint32 vmContextID = { VMCI_INVALID_ID };
+static Atomic_uint32 vmciClientCount;
/*
Bool
VMCI_DeviceGet(uint32 *apiVersion)
{
+ Atomic_Inc32(&vmciClientCount);
+
if (*apiVersion > VMCI_KERNEL_API_VERSION) {
*apiVersion = VMCI_KERNEL_API_VERSION;
- return FALSE;
+ goto release;
+ }
+
+ if (!VMCI_DeviceEnabled()) {
+ goto release;
}
- return VMCI_DeviceEnabled();
+
+ if (VMCI_DeviceShutdown()) {
+ goto release;
+ }
+
+ return TRUE;
+
+release:
+ Atomic_Dec32(&vmciClientCount);
+ return FALSE;
}
void
VMCI_DeviceRelease(void)
{
+ Atomic_Dec32(&vmciClientCount);
+}
+
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * VMCI_DeviceInUse --
+ *
+ * Report whether the device is in-use by a client.
+ *
+ * Results:
+ * TRUE if the device is in-use (reference count greater than zero),
+ * FALSE otherwise.
+ *
+ * Side effects:
+ * None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+Bool
+VMCI_DeviceInUse(void)
+{
+ return Atomic_Read32(&vmciClientCount) > 0 ? TRUE : FALSE;
}
Bool VMCI_CheckHostCapabilities(void);
Bool VMCI_InInterrupt(void);
void VMCI_ReadDatagramsFromPort(VMCIIoHandle ioHandle, VMCIIoPort dgInPort,
- uint8 *dgInBuffer, size_t dgInBufferSize);
+ uint8 *dgInBuffer, size_t dgInBufferSize);
+Bool VMCI_DeviceInUse(void);
#endif //__VMCI_UTIL_H__