xsi_semaphore: use MemoryDeleter instead of multiple free()
This commit is contained in:
@@ -22,6 +22,7 @@
|
|||||||
#include <util/AutoLock.h>
|
#include <util/AutoLock.h>
|
||||||
#include <util/DoublyLinkedList.h>
|
#include <util/DoublyLinkedList.h>
|
||||||
#include <util/OpenHashTable.h>
|
#include <util/OpenHashTable.h>
|
||||||
|
#include <AutoDeleter.h>
|
||||||
|
|
||||||
|
|
||||||
//#define TRACE_XSI_SEM
|
//#define TRACE_XSI_SEM
|
||||||
@@ -1088,11 +1089,11 @@ _user_xsi_semop(int semaphoreID, struct sembuf *ops, size_t numOps)
|
|||||||
TRACE_ERROR(("xsi_semop: failed to allocate sembuf struct\n"));
|
TRACE_ERROR(("xsi_semop: failed to allocate sembuf struct\n"));
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
}
|
}
|
||||||
|
MemoryDeleter operationsDeleter(operations);
|
||||||
|
|
||||||
if (user_memcpy(operations, ops,
|
if (user_memcpy(operations, ops,
|
||||||
(sizeof(struct sembuf) * numOps)) < B_OK) {
|
(sizeof(struct sembuf) * numOps)) < B_OK) {
|
||||||
TRACE_ERROR(("xsi_semop: user_memcpy failed\n"));
|
TRACE_ERROR(("xsi_semop: user_memcpy failed\n"));
|
||||||
free(operations);
|
|
||||||
return B_BAD_ADDRESS;
|
return B_BAD_ADDRESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1158,10 +1159,8 @@ _user_xsi_semop(int semaphoreID, struct sembuf *ops, size_t numOps)
|
|||||||
if (operation != 0)
|
if (operation != 0)
|
||||||
semaphore->Revert(operation);
|
semaphore->Revert(operation);
|
||||||
}
|
}
|
||||||
if (result != 0) {
|
if (result != 0)
|
||||||
free(operations);
|
|
||||||
return result;
|
return result;
|
||||||
}
|
|
||||||
|
|
||||||
// We have to wait: first enqueue the thread
|
// We have to wait: first enqueue the thread
|
||||||
// in the appropriate set waiting list, then
|
// in the appropriate set waiting list, then
|
||||||
@@ -1248,6 +1247,5 @@ _user_xsi_semop(int semaphoreID, struct sembuf *ops, size_t numOps)
|
|||||||
semaphore->SetPid(getpid());
|
semaphore->SetPid(getpid());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
free(operations);
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user