-
Notifications
You must be signed in to change notification settings - Fork 0
Create LockFreeQueue.chpl #1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
example/LockFreeQueue.chpl
Outdated
| * Created by Garvit Dewan - | ||
| * https://github.com/dgarvit/epoch-based-manager/blob/master/src/LockFreeQueue.chpl | ||
| * | ||
| * Lock-Free Queue that uses ABA feature of Distributed Data Structures |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should probably say that it uses the ABA feature of LocalAtomicObject. Sure the LocalAtomicObject was created back in GSoC 2017, but you don't need to state that here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed it.
example/LockFreeQueue.chpl
Outdated
|
|
||
| proc init(type eltType) { | ||
| this.eltType = eltType; | ||
| val = nil; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do not initialize val with a value, leave it as is (it will be initialized to a default value automatically). If eltType is an integral (int,uint, etc.), a tuple or a record, this will result in a compiler error.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Well, I think that would further require changes to peek() and dequeue() in terms that if queue is empty then cannot return nil for eltType int
example/LockFreeQueue.chpl
Outdated
| var curr_head = _head.readABA(); | ||
| var curr_tail = _tail.readABA(); | ||
| var next = curr_head.next.readABA(); | ||
| if (_head.read() == _tail.read()) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why do you read curr_head and curr_tail and then try to read them again? Are you sure you shouldn't do curr_head.getObject() == curr_tail.getObject()?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
My bad, fixed it. Thanks for pointing out!
| } | ||
|
|
||
| iter these() : objType { | ||
| var ptr = _head.read().next.read(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What happens if the queue is empty?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
When queue is empty, it will hold a dummy node, which will have a next, which will be a LocalAtomicObject, which will point to a nil value.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So, nothing will happen, because, if ptr is nil. then the function will finish executing.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Right, I forgot about the dummy node! That should work then.
example/LockFreeQueue.chpl
Outdated
| } | ||
|
|
||
| proc peek() : objType { | ||
| return _head.read().next.read().val; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What happens if the queue is empty?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Similar to the previous reason, this will return nil. There was a bug with it, which I have fixed now.
| var ptr = _head.read(); | ||
| while (ptr != nil) { | ||
| _head = ptr.next; | ||
| delete ptr.val; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nope, don't assume the user will have classes. If they want to have their classes managed, they should use a shared or owned type.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh. Alright.
| } | ||
| } | ||
| } | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add a main function here that tests it, similar to what is done in LockFreeStack.chpl:
LocalAtomics/example/LockFreeStack.chpl
Lines 75 to 80 in 614410c
| proc main() { | |
| var a = new LockFreeStack(int); | |
| forall i in 1..1024 do a.push(i); | |
| a.push(1025..2048); | |
| writeln(+ reduce a); | |
| } |
|
Can you also make
Then I can possibly run |
|
I think that you should make |
No description provided.