return XenStoreTalkv (XST_NIL, XS_UNWATCH, WriteRequest, 2, NULL, NULL);\r
}\r
\r
+STATIC\r
+XENSTORE_STATUS\r
+XenStoreWaitWatch (\r
+ VOID *Token\r
+ )\r
+{\r
+ XENSTORE_MESSAGE *Message;\r
+ LIST_ENTRY *Entry = NULL;\r
+ LIST_ENTRY *Last = NULL;\r
+ XENSTORE_STATUS Status;\r
+\r
+ while (TRUE) {\r
+ EfiAcquireLock (&xs.WatchEventsLock);\r
+ if (IsListEmpty (&xs.WatchEvents) ||\r
+ Last == GetFirstNode (&xs.WatchEvents)) {\r
+ EfiReleaseLock (&xs.WatchEventsLock);\r
+ Status = XenStoreProcessMessage ();\r
+ if (Status != XENSTORE_STATUS_SUCCESS && Status != XENSTORE_STATUS_EAGAIN) {\r
+ return Status;\r
+ }\r
+ continue;\r
+ }\r
+\r
+ for (Entry = GetFirstNode (&xs.WatchEvents);\r
+ Entry != Last && !IsNull (&xs.WatchEvents, Entry);\r
+ Entry = GetNextNode (&xs.WatchEvents, Entry)) {\r
+ Message = XENSTORE_MESSAGE_FROM_LINK (Entry);\r
+ if (Message->u.Watch.Handle == Token) {\r
+ RemoveEntryList (Entry);\r
+ EfiReleaseLock (&xs.WatchEventsLock);\r
+ FreePool(Message->u.Watch.Vector);\r
+ FreePool(Message);\r
+ return XENSTORE_STATUS_SUCCESS;\r
+ }\r
+ }\r
+ Last = GetFirstNode (&xs.WatchEvents);\r
+ EfiReleaseLock (&xs.WatchEventsLock);\r
+ }\r
+}\r
+\r
VOID\r
EFIAPI\r
NotifyEventChannelCheckForEvent (\r
FreePool (Watch->Node);\r
FreePool (Watch);\r
}\r
+\r
+\r
+//\r
+// XENBUS protocol\r
+//\r
+\r
+XENSTORE_STATUS\r
+EFIAPI\r
+XenBusWaitForWatch (\r
+ IN XENBUS_PROTOCOL *This,\r
+ IN VOID *Token\r
+ )\r
+{\r
+ return XenStoreWaitWatch (Token);\r
+}\r
+\r
+XENSTORE_STATUS\r
+EFIAPI\r
+XenBusXenStoreRead (\r
+ IN XENBUS_PROTOCOL *This,\r
+ IN XENSTORE_TRANSACTION Transaction,\r
+ IN CONST CHAR8 *Node,\r
+ OUT VOID **Value\r
+ )\r
+{\r
+ return XenStoreRead (Transaction, This->Node, Node, NULL, Value);\r
+}\r
+\r
+XENSTORE_STATUS\r
+EFIAPI\r
+XenBusXenStoreBackendRead (\r
+ IN XENBUS_PROTOCOL *This,\r
+ IN XENSTORE_TRANSACTION Transaction,\r
+ IN CONST CHAR8 *Node,\r
+ OUT VOID **Value\r
+ )\r
+{\r
+ return XenStoreRead (Transaction, This->Backend, Node, NULL, Value);\r
+}\r
+\r
+XENSTORE_STATUS\r
+EFIAPI\r
+XenBusXenStoreRemove (\r
+ IN XENBUS_PROTOCOL *This,\r
+ IN XENSTORE_TRANSACTION Transaction,\r
+ IN const char *Node\r
+ )\r
+{\r
+ return XenStoreRemove (Transaction, This->Node, Node);\r
+}\r
+\r
+XENSTORE_STATUS\r
+EFIAPI\r
+XenBusXenStoreTransactionStart (\r
+ IN XENBUS_PROTOCOL *This,\r
+ OUT XENSTORE_TRANSACTION *Transaction\r
+ )\r
+{\r
+ return XenStoreTransactionStart (Transaction);\r
+}\r
+\r
+XENSTORE_STATUS\r
+EFIAPI\r
+XenBusXenStoreTransactionEnd (\r
+ IN XENBUS_PROTOCOL *This,\r
+ IN XENSTORE_TRANSACTION Transaction,\r
+ IN BOOLEAN Abort\r
+ )\r
+{\r
+ return XenStoreTransactionEnd (Transaction, Abort);\r
+}\r
+\r
+XENSTORE_STATUS\r
+EFIAPI\r
+XenBusXenStoreSPrint (\r
+ IN XENBUS_PROTOCOL *This,\r
+ IN XENSTORE_TRANSACTION Transaction,\r
+ IN CONST CHAR8 *DirectoryPath,\r
+ IN CONST CHAR8 *Node,\r
+ IN CONST CHAR8 *FormatString,\r
+ ...\r
+ )\r
+{\r
+ VA_LIST Marker;\r
+ XENSTORE_STATUS Status;\r
+\r
+ VA_START (Marker, FormatString);\r
+ Status = XenStoreVSPrint (Transaction, DirectoryPath, Node, FormatString, Marker);\r
+ VA_END (Marker);\r
+\r
+ return Status;\r
+}\r
+\r
+XENSTORE_STATUS\r
+EFIAPI\r
+XenBusRegisterWatch (\r
+ IN XENBUS_PROTOCOL *This,\r
+ IN CONST CHAR8 *Node,\r
+ OUT VOID **Token\r
+ )\r
+{\r
+ return XenStoreRegisterWatch (This->Node, Node, (XENSTORE_WATCH **) Token);\r
+}\r
+\r
+XENSTORE_STATUS\r
+EFIAPI\r
+XenBusRegisterWatchBackend (\r
+ IN XENBUS_PROTOCOL *This,\r
+ IN CONST CHAR8 *Node,\r
+ OUT VOID **Token\r
+ )\r
+{\r
+ return XenStoreRegisterWatch (This->Backend, Node, (XENSTORE_WATCH **) Token);\r
+}\r
+\r
+VOID\r
+EFIAPI\r
+XenBusUnregisterWatch (\r
+ IN XENBUS_PROTOCOL *This,\r
+ IN VOID *Token\r
+ )\r
+{\r
+ XenStoreUnregisterWatch ((XENSTORE_WATCH *) Token);\r
+}\r