Add more fns to TSQueue (still untested)
This commit is contained in:
parent
28d832a349
commit
76567d168e
2 changed files with 94 additions and 0 deletions
|
@ -70,3 +70,94 @@ bool TSQueue::pop() {
|
||||||
spinLock.store(false);
|
spinLock.store(false);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TSQueue::clear() {
|
||||||
|
while (spinLock.exchange(true) == true) {
|
||||||
|
}
|
||||||
|
|
||||||
|
head = 0;
|
||||||
|
tail = 0;
|
||||||
|
isEmpty = 0;
|
||||||
|
|
||||||
|
spinLock.store(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TSQueue::changeCapacity(unsigned int newCapacity) {
|
||||||
|
if (newCapacity == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
while (spinLock.exchange(true) == true) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// repeat of size() to avoid deadlock
|
||||||
|
unsigned int size;
|
||||||
|
if (head == tail) {
|
||||||
|
size = capacity;
|
||||||
|
} else if (head < tail) {
|
||||||
|
size = tail - head;
|
||||||
|
} else {
|
||||||
|
size = capacity - head + tail;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int newCap = newCapacity * elemSize;
|
||||||
|
auto newBuffer =
|
||||||
|
std::unique_ptr<unsigned char[]>(new unsigned char[newCap]);
|
||||||
|
|
||||||
|
if (!isEmpty) {
|
||||||
|
unsigned int tempHead = head;
|
||||||
|
if (size > newCap) {
|
||||||
|
unsigned int diff = size - newCap;
|
||||||
|
tempHead = (head + diff) % capacity;
|
||||||
|
}
|
||||||
|
if (tempHead < tail) {
|
||||||
|
memcpy(newBuffer.get(), buffer.get() + tempHead, tail - tempHead);
|
||||||
|
} else {
|
||||||
|
memcpy(newBuffer.get(), buffer.get() + tempHead,
|
||||||
|
capacity - tempHead);
|
||||||
|
if (tail != 0) {
|
||||||
|
memcpy(newBuffer.get() + capacity - tempHead, buffer.get(),
|
||||||
|
tail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size < newCap) {
|
||||||
|
if (head < tail) {
|
||||||
|
tail = tail - head;
|
||||||
|
head = 0;
|
||||||
|
} else {
|
||||||
|
tail = capacity - head + tail;
|
||||||
|
head = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
head = 0;
|
||||||
|
tail = 0;
|
||||||
|
isEmpty = false;
|
||||||
|
}
|
||||||
|
buffer = std::move(newBuffer);
|
||||||
|
capacity = newCap;
|
||||||
|
|
||||||
|
spinLock.store(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int TSQueue::size() {
|
||||||
|
while (spinLock.exchange(true) == true) {
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isEmpty) {
|
||||||
|
spinLock.store(false);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int size;
|
||||||
|
if (head == tail) {
|
||||||
|
size = capacity;
|
||||||
|
} else if (head < tail) {
|
||||||
|
size = tail - head;
|
||||||
|
} else {
|
||||||
|
size = capacity - head + tail;
|
||||||
|
}
|
||||||
|
|
||||||
|
spinLock.store(false);
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
|
@ -23,6 +23,9 @@ class TSQueue {
|
||||||
bool push(void *data);
|
bool push(void *data);
|
||||||
std::unique_ptr<unsigned char[]> top();
|
std::unique_ptr<unsigned char[]> top();
|
||||||
bool pop();
|
bool pop();
|
||||||
|
void clear();
|
||||||
|
void changeCapacity(unsigned int newCapacity);
|
||||||
|
unsigned int size();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
unsigned int elemSize;
|
unsigned int elemSize;
|
||||||
|
|
Loading…
Reference in a new issue