supersat commented on code in PR #11018: URL: https://github.com/apache/tvm/pull/11018#discussion_r853524382
########## src/runtime/threading_backend.cc: ########## @@ -34,13 +34,61 @@ #endif #if defined(__hexagon__) #include <dlfcn.h> +#include <qurt.h> +#include <stdlib.h> +#define HEXAGON_STACK_SIZE 65536 +#define HEXAGON_STACK_ALIGNMENT 32 #endif #include <algorithm> #include <thread> #define CURRENT_THREAD_HANDLE (static_cast<std::thread::native_handle_type>(0)) namespace tvm { namespace runtime { namespace threading { +#ifdef __hexagon__ +// pthreads are broken on older versions of qurt, so +// we need to use native APIs instead of std::threads +class QuRTThread { + typedef std::function<void()> Callback; + + public: + explicit QuRTThread(Callback worker_callback) : f(worker_callback) { + static int id = 1; + qurt_thread_attr_t attr; + char name[32]; + posix_memalign(&stack, HEXAGON_STACK_ALIGNMENT, HEXAGON_STACK_SIZE); + qurt_thread_attr_init(&attr); + qurt_thread_attr_set_stack_size(&attr, HEXAGON_STACK_SIZE); + qurt_thread_attr_set_stack_addr(&attr, stack); + snprintf(name, sizeof(name), "worker %d", id++); + qurt_thread_attr_set_name(&attr, name); + qurt_thread_create(&thread, &attr, (void (*)(void*))run_func, this); + } + QuRTThread(QuRTThread&& other) : thread(other.thread), f(other.f), stack(other.stack) { + other.thread = 0; + } + ~QuRTThread() { + if (thread) { + join(); + free(stack); + } + } + bool joinable() const { return qurt_thread_get_id() != thread; } + void join() { + int status; + qurt_thread_join(thread, &status); Review Comment: qurt_thread_join can return QURT_ENOTHREAD if you already called join() on the thread. This could either be ignored (since the particular thread you're waiting on has already exited) or there could be a CHECK/crash (since you're not supposed to join() a thread multiple times). I could see arguments either way. std::thread::join() throws a std::system_error in this case. qurt_thread_join can also raise a QuRT exception, which I don't think we handle at all. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@tvm.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org