* VMCIQPair structure, too.
*
* Results:
- * None.
+ * An error, if < 0.
*
* Side effects:
* Will clear the caller's pointer to the VMCIQPair structure.
*-----------------------------------------------------------------------------
*/
-void
+int
VMCIQPair_Detach(VMCIQPair **qpair) // IN/OUT
{
- VMCIQPair *oldQPair = *qpair;
+ int result;
+ VMCIQPair *oldQPair;
- VMCIQueuePair_Detach(oldQPair->handle);
+ if (!qpair || !(*qpair)) {
+ return VMCI_ERROR_INVALID_ARGS;
+ }
+
+ oldQPair = *qpair;
+ result = VMCIQueuePair_Detach(oldQPair->handle);
+ if (result >= VMCI_SUCCESS) {
#ifdef DEBUG
- oldQPair->handle = VMCI_INVALID_HANDLE;
- oldQPair->produceQ = NULL;
- oldQPair->consumeQ = NULL;
- oldQPair->produceQSize = 0;
- oldQPair->consumeQSize = 0;
- oldQPair->flags = 0;
- oldQPair->privFlags = 0;
- oldQPair->peer = VMCI_INVALID_ID;
+ oldQPair->handle = VMCI_INVALID_HANDLE;
+ oldQPair->produceQ = NULL;
+ oldQPair->consumeQ = NULL;
+ oldQPair->produceQSize = 0;
+ oldQPair->consumeQSize = 0;
+ oldQPair->flags = 0;
+ oldQPair->privFlags = 0;
+ oldQPair->peer = VMCI_INVALID_ID;
#endif
- VMCI_FreeKernelMem(oldQPair, sizeof *oldQPair);
+ VMCI_FreeKernelMem(oldQPair, sizeof *oldQPair);
+
+ *qpair = NULL;
+ }
- *qpair = NULL;
+ return result;
}
* pointers.
*
* Results:
- * None.
+ * err, if < 0
*
* Side effects:
* Windows blocking call.
{
VMCIQPairLock(qpair);
- if (NULL != qpair->produceQ && NULL != qpair->produceQ->qHeader) {
+ if (NULL != qpair &&
+ NULL != qpair->produceQ &&
+ NULL != qpair->produceQ->qHeader) {
VMCIQueueHeader_Init(qpair->produceQ->qHeader, qpair->handle);
}
* QPair from the point of the view of the caller as the producer.
*
* Results:
- * None.
+ * err, if < 0
+ * Success otherwise.
*
* Side effects:
* Windows blocking call.
*-----------------------------------------------------------------------------
*/
-void
+int
VMCIQPair_GetProduceIndexes(const VMCIQPair *qpair, // IN
uint64 *producerTail, // OUT
uint64 *consumerHead) // OUT
{
+ if (!qpair) {
+ return VMCI_ERROR_INVALID_ARGS;
+ }
+
VMCIQPairLock(qpair);
VMCIQueueHeader_GetPointers(qpair->produceQ->qHeader,
consumerHead);
VMCIQPairUnlock(qpair);
+
+ if ((producerTail && *producerTail >= qpair->produceQSize) ||
+ (consumerHead && *consumerHead >= qpair->produceQSize)) {
+ return VMCI_ERROR_INVALID_SIZE;
+ }
+
+ return VMCI_SUCCESS;
}
* QPair from the point of the view of the caller as the consumer.
*
* Results:
- * None.
+ * err, if < 0
+ * Success otherwise.
*
* Side effects:
* Windows blocking call.
*-----------------------------------------------------------------------------
*/
-void
+int
VMCIQPair_GetConsumeIndexes(const VMCIQPair *qpair, // IN
uint64 *consumerTail, // OUT
uint64 *producerHead) // OUT
{
+ if (!qpair) {
+ return VMCI_ERROR_INVALID_ARGS;
+ }
+
VMCIQPairLock(qpair);
VMCIQueueHeader_GetPointers(qpair->consumeQ->qHeader,
producerHead);
VMCIQPairUnlock(qpair);
+
+ if ((consumerTail && *consumerTail >= qpair->consumeQSize) ||
+ (producerHead && *producerHead >= qpair->consumeQSize)) {
+ return VMCI_ERROR_INVALID_SIZE;
+ }
+
+ return VMCI_SUCCESS;
}
#if defined __linux__ && !defined VMKERNEL
{
int64 result;
+ if (!qpair) {
+ return VMCI_ERROR_INVALID_ARGS;
+ }
+
VMCIQPairLock(qpair);
result = VMCIQueueHeader_FreeSpace(qpair->produceQ->qHeader,
{
int64 result;
+ if (!qpair) {
+ return VMCI_ERROR_INVALID_ARGS;
+ }
+
VMCIQPairLock(qpair);
result = VMCIQueueHeader_FreeSpace(qpair->consumeQ->qHeader,
{
int64 result;
+ if (!qpair) {
+ return VMCI_ERROR_INVALID_ARGS;
+ }
+
VMCIQPairLock(qpair);
result = VMCIQueueHeader_BufReady(qpair->produceQ->qHeader,
{
int64 result;
+ if (!qpair) {
+ return VMCI_ERROR_INVALID_ARGS;
+ }
+
VMCIQPairLock(qpair);
result = VMCIQueueHeader_BufReady(qpair->consumeQ->qHeader,
{
ssize_t result;
+ if (!qpair || !buf) {
+ return VMCI_ERROR_INVALID_ARGS;
+ }
+
VMCIQPairLock(qpair);
result = EnqueueLocked(qpair->produceQ,
{
ssize_t result;
+ if (!qpair || !buf) {
+ return VMCI_ERROR_INVALID_ARGS;
+ }
+
VMCIQPairLock(qpair);
result = DequeueLocked(qpair->produceQ,
{
ssize_t result;
+ if (!qpair || !buf) {
+ return VMCI_ERROR_INVALID_ARGS;
+ }
+
VMCIQPairLock(qpair);
result = DequeueLocked(qpair->produceQ,
{
ssize_t result;
+ if (!qpair || !iov) {
+ return VMCI_ERROR_INVALID_ARGS;
+ }
+
VMCIQPairLock(qpair);
result = EnqueueLocked(qpair->produceQ,
VMCIQPairLock(qpair);
+ if (!qpair || !iov) {
+ return VMCI_ERROR_INVALID_ARGS;
+ }
+
result = DequeueLocked(qpair->produceQ,
qpair->consumeQ,
qpair->consumeQSize,
{
ssize_t result;
+ if (!qpair || !iov) {
+ return VMCI_ERROR_INVALID_ARGS;
+ }
+
VMCIQPairLock(qpair);
result = DequeueLocked(qpair->produceQ,