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

Reply via email to