Remove "zombie" queue state and report queue creation failure via
exceptions.  Make Shared object a final container and support array
objects with Shared.  Add message printing to hsa_exception in
debug builds.

Change-Id: I459f38c80846018acbf45538874e95f91dd6b195
Этот коммит содержится в:
Sean Keely
2017-10-20 07:12:04 -05:00
родитель 0c7dde2d1f
Коммит f312a7386e
13 изменённых файлов: 181 добавлений и 162 удалений
+9 -20
Просмотреть файл
@@ -644,8 +644,8 @@ hsa_status_t hsa_queue_create(
TRY;
IS_OPEN();
if ((queue == NULL) || (size == 0) || (!IsPowerOfTwo(size)) ||
(type < HSA_QUEUE_TYPE_MULTI) || (type > HSA_QUEUE_TYPE_SINGLE)) {
if ((queue == nullptr) || (size == 0) || (!IsPowerOfTwo(size)) || (type < HSA_QUEUE_TYPE_MULTI) ||
(type > HSA_QUEUE_TYPE_SINGLE)) {
return HSA_STATUS_ERROR_INVALID_ARGUMENT;
}
@@ -662,22 +662,17 @@ hsa_status_t hsa_queue_create(
return HSA_STATUS_ERROR_INVALID_QUEUE_CREATION;
}
if (callback == NULL) callback = core::Queue::DefaultErrorHandler;
if (callback == nullptr) callback = core::Queue::DefaultErrorHandler;
core::Queue* cmd_queue = NULL;
core::Queue* cmd_queue = nullptr;
status = agent->QueueCreate(size, type, callback, data, private_segment_size,
group_segment_size, &cmd_queue);
if (cmd_queue != NULL) {
*queue = core::Queue::Convert(cmd_queue);
if (*queue == NULL) {
delete cmd_queue;
return HSA_STATUS_ERROR_OUT_OF_RESOURCES;
}
} else {
*queue = NULL;
}
if (status != HSA_STATUS_SUCCESS) return status;
assert(cmd_queue != nullptr && "Queue not returned but status was success.\n");
*queue = core::Queue::Convert(cmd_queue);
return status;
CATCH;
}
@@ -701,13 +696,7 @@ hsa_status_t hsa_soft_queue_create(hsa_region_t region, uint32_t size,
const core::Signal* signal = core::Signal::Convert(doorbell_signal);
IS_VALID(signal);
core::HostQueue* host_queue =
new core::HostQueue(region, size, type, features, doorbell_signal);
if (!host_queue->active()) {
delete host_queue;
return HSA_STATUS_ERROR_OUT_OF_RESOURCES;
}
core::HostQueue* host_queue = new core::HostQueue(region, size, type, features, doorbell_signal);
*queue = core::Queue::Convert(host_queue);