mirror of
https://github.com/13hannes11/UU_la_parallel_programming_practical_assignments.git
synced 2024-09-04 00:50:58 +02:00
fix LazySet causing segmentation fault or hanging
This commit is contained in:
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
class LazySet:public Set {
|
class LazySet:public Set {
|
||||||
protected:
|
protected:
|
||||||
void locate(int element, Node* prev, Node* cur);
|
void locate(int element, Node** prev, Node** cur);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
LazySet();
|
LazySet();
|
||||||
@@ -19,25 +19,23 @@ LazySet::LazySet() : Set("LazySet") { }
|
|||||||
bool LazySet::add(int element) {
|
bool LazySet::add(int element) {
|
||||||
Node* p;
|
Node* p;
|
||||||
Node* c;
|
Node* c;
|
||||||
locate(element, p, c);
|
|
||||||
|
locate(element, &p, &c);
|
||||||
|
|
||||||
if (c->is_equal(element)) {
|
if (c->is_equal(element)) {
|
||||||
p->unlock();
|
|
||||||
c->unlock();
|
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
Node* n = new Node(element);
|
Node* n = new Node(element);
|
||||||
|
n->next = c;
|
||||||
p->next = n;
|
p->next = n;
|
||||||
|
|
||||||
p->unlock();
|
|
||||||
c->unlock();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bool LazySet::rmv(int element) {
|
bool LazySet::rmv(int element) {
|
||||||
|
std::cout<< "rmv " << element << std::endl;
|
||||||
Node* p;
|
Node* p;
|
||||||
Node* c;
|
Node* c;
|
||||||
locate(element, p, c);
|
locate(element, &p, &c);
|
||||||
|
|
||||||
if (c->is_equal(element)) {
|
if (c->is_equal(element)) {
|
||||||
c->deleted = true;
|
c->deleted = true;
|
||||||
@@ -53,7 +51,7 @@ bool LazySet::rmv(int element) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
bool LazySet::ctn(int element) {
|
bool LazySet::ctn(int element) {
|
||||||
Node* c = first;
|
Node* c = first->next;
|
||||||
while (c->is_smaller_than(element)) {
|
while (c->is_smaller_than(element)) {
|
||||||
c = c->next;
|
c = c->next;
|
||||||
}
|
}
|
||||||
@@ -65,9 +63,9 @@ bool LazySet::ctn(int element) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void LazySet::locate(int element, Node* prev, Node* cur) {
|
void LazySet::locate(int element, Node** prev, Node** cur) {
|
||||||
prev = Node::Dummy();
|
*prev = Node::Dummy();
|
||||||
cur = Node::Dummy();
|
*cur = Node::Dummy();
|
||||||
|
|
||||||
Node* p = first;
|
Node* p = first;
|
||||||
Node* c = p->next;
|
Node* c = p->next;
|
||||||
@@ -78,9 +76,10 @@ void LazySet::locate(int element, Node* prev, Node* cur) {
|
|||||||
}
|
}
|
||||||
p->lock();
|
p->lock();
|
||||||
c->lock();
|
c->lock();
|
||||||
|
|
||||||
if (!p->deleted && !c->deleted && p->next == c) {
|
if (!p->deleted && !c->deleted && p->next == c) {
|
||||||
prev = p;
|
*prev = p;
|
||||||
cur = c;
|
*cur = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
p->unlock();
|
p->unlock();
|
||||||
|
|||||||
Reference in New Issue
Block a user