P4 to Git Change 1082950 by lmoriche@lmoriche_opencl_dev on 2014/09/30 16:50:37
ECR #304775 - Implement the changes recommended in review#5943
Pre-checkin: http://ocltc.amd.com:8111/viewModification.html?modId=40717&personal=true&buildTypeId=&tab=vcsModificationBuilds&show_all_builds=true
Affected files ...
... //depot/stg/opencl/drivers/opencl/runtime/platform/command.cpp#65 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/memory.cpp#109 edit
... //depot/stg/opencl/drivers/opencl/runtime/thread/semaphore.cpp#7 edit
... //depot/stg/opencl/drivers/opencl/runtime/utils/concurrent.hpp#6 edit
[ROCm/clr commit: aaf533287b]
このコミットが含まれているのは:
@@ -129,10 +129,8 @@ Event::setCallback(cl_int status, Event::CallBackFunction callback, void* data)
|
||||
}
|
||||
|
||||
entry->next_ = callbacks_;
|
||||
while (!callbacks_.compare_exchange_weak(entry->next_, entry)) {
|
||||
// Someone else is also updating the head of the linked list! reload.
|
||||
entry->next_ = callbacks_;
|
||||
}
|
||||
while (!callbacks_.compare_exchange_weak(entry->next_, entry))
|
||||
; // Someone else is also updating the head of the linked list! reload.
|
||||
|
||||
// Check if the event has already reached 'status'
|
||||
if (status_ <= status && entry->callback_ != CallBackFunction(0)) {
|
||||
|
||||
@@ -439,10 +439,8 @@ Memory::setDestructorCallback(DestructorCallBackFunction callback, void* data)
|
||||
}
|
||||
|
||||
entry->next_ = destructorCallbacks_;
|
||||
while (!destructorCallbacks_.compare_exchange_weak(entry->next_, entry)) {
|
||||
// Someone else is also updating the head of the linked list! reload.
|
||||
entry->next_ = destructorCallbacks_;
|
||||
}
|
||||
while (!destructorCallbacks_.compare_exchange_weak(entry->next_, entry))
|
||||
; // Someone else is also updating the head of the linked list! reload.
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -43,9 +43,8 @@ Semaphore::~Semaphore()
|
||||
void
|
||||
Semaphore::post()
|
||||
{
|
||||
int state;
|
||||
while (true) {
|
||||
state = state_;
|
||||
int state = state_;
|
||||
for (;;) {
|
||||
if (state > 0) {
|
||||
if (state == state_.load(std::memory_order_acquire)) {
|
||||
return;
|
||||
|
||||
@@ -151,11 +151,11 @@ ConcurrentLinkedQueue<T,N>::enqueue(T elem)
|
||||
node->value_ = elem;
|
||||
node->next_ = NULL;
|
||||
|
||||
while (true) {
|
||||
for (;;) {
|
||||
typename Node::Ptr tail = tail_.load(std::memory_order_acquire);
|
||||
typename Node::Ptr next =
|
||||
tail->ptr()->next_.load(std::memory_order_acquire);
|
||||
if (tail == tail_.load(std::memory_order_acquire)) {
|
||||
if (likely(tail == tail_.load(std::memory_order_acquire))) {
|
||||
if (next->ptr() == NULL) {
|
||||
if (tail->ptr()->next_.compare_exchange_weak(
|
||||
next, Node::ptr(node, next->tag()+1),
|
||||
@@ -179,12 +179,12 @@ template <typename T, int N>
|
||||
inline T
|
||||
ConcurrentLinkedQueue<T,N>::dequeue()
|
||||
{
|
||||
while (true) {
|
||||
for (;;) {
|
||||
typename Node::Ptr head = head_.load(std::memory_order_acquire);
|
||||
typename Node::Ptr tail = tail_.load(std::memory_order_acquire);
|
||||
typename Node::Ptr next =
|
||||
head->ptr()->next_.load(std::memory_order_acquire);
|
||||
if (head == head_.load(std::memory_order_acquire)) {
|
||||
if (likely(head == head_.load(std::memory_order_acquire))) {
|
||||
if (head->ptr() == tail->ptr()) {
|
||||
if (next->ptr() == NULL) {
|
||||
return NULL;
|
||||
|
||||
新しいイシューから参照
ユーザーをブロックする