Skip to content

Commit c0bc859

Browse files
authored
hexagon: fix Windows crash when op_poll is enabled (#26029)
1 parent 1425386 commit c0bc859

2 files changed

Lines changed: 19 additions & 7 deletions

File tree

ggml/src/ggml-hexagon/ggml-hexagon.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1662,7 +1662,7 @@ void ggml_hexagon_session::flush_pending(bool all) {
16621662
const uint32_t timeo = opt_oppoll ? 0 : DSPQUEUE_TIMEOUT;
16631663

16641664
int err = dspqueue_read(this->queue, &flags, 1, &n_dbufs, &dbuf, sizeof(rsp), &rsp_size, (uint8_t *) &rsp, timeo);
1665-
if (err == AEE_EEXPIRED) {
1665+
if (err == AEE_EEXPIRED || err == AEE_EWOULDBLOCK) {
16661666
continue;
16671667
}
16681668

ggml/src/ggml-hexagon/htp-drv.cpp

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,11 @@ typedef AEEResult (*dspqueue_read_pfn_t)(dspqueue_t queue, uint32_t *flags,
5959
uint32_t max_message_length,
6060
uint32_t *message_length, uint8_t *message,
6161
uint32_t timeout_us);
62-
62+
typedef AEEResult (*dspqueue_read_noblock_pfn_t)(dspqueue_t queue, uint32_t *flags,
63+
uint32_t max_buffers, uint32_t *num_buffers,
64+
struct dspqueue_buffer *buffers,
65+
uint32_t max_message_length,
66+
uint32_t *message_length, uint8_t *message);
6367
typedef int (*fastrpc_mmap_pfn_t)(int domain, int fd, void *addr, int offset, size_t length, enum fastrpc_map_flags flags);
6468
typedef int (*fastrpc_munmap_pfn_t)(int domain, int fd, void *addr, size_t length);
6569

@@ -82,11 +86,12 @@ rpcmem_to_fd_pfn_t rpcmem_to_fd_pfn = nullptr;
8286
fastrpc_mmap_pfn_t fastrpc_mmap_pfn = nullptr;
8387
fastrpc_munmap_pfn_t fastrpc_munmap_pfn = nullptr;
8488

85-
dspqueue_create_pfn_t dspqueue_create_pfn = nullptr;
86-
dspqueue_close_pfn_t dspqueue_close_pfn = nullptr;
87-
dspqueue_export_pfn_t dspqueue_export_pfn = nullptr;
88-
dspqueue_write_pfn_t dspqueue_write_pfn = nullptr;
89-
dspqueue_read_pfn_t dspqueue_read_pfn = nullptr;
89+
dspqueue_create_pfn_t dspqueue_create_pfn = nullptr;
90+
dspqueue_close_pfn_t dspqueue_close_pfn = nullptr;
91+
dspqueue_export_pfn_t dspqueue_export_pfn = nullptr;
92+
dspqueue_write_pfn_t dspqueue_write_pfn = nullptr;
93+
dspqueue_read_pfn_t dspqueue_read_pfn = nullptr;
94+
dspqueue_read_noblock_pfn_t dspqueue_read_noblock_pfn = nullptr;
9095

9196
remote_handle64_open_pfn_t remote_handle64_open_pfn = nullptr;
9297
remote_handle64_invoke_pfn_t remote_handle64_invoke_pfn = nullptr;
@@ -167,6 +172,12 @@ AEEResult dspqueue_read(dspqueue_t queue,
167172
uint32_t * message_length,
168173
uint8_t * message,
169174
uint32_t timeout_us) {
175+
#ifdef _WIN32
176+
if (timeout_us == 0) {
177+
return dspqueue_read_noblock_pfn(queue, flags, max_buffers, num_buffers, buffers, max_message_length,
178+
message_length, message);
179+
}
180+
#endif
170181
return dspqueue_read_pfn(queue, flags, max_buffers, num_buffers, buffers, max_message_length, message_length,
171182
message, timeout_us);
172183
}
@@ -349,6 +360,7 @@ int htpdrv_init() {
349360
dlsym(handle.get(), dspqueue_export_pfn_t, dspqueue_export_pfn, dspqueue_export, false);
350361
dlsym(handle.get(), dspqueue_write_pfn_t, dspqueue_write_pfn, dspqueue_write, false);
351362
dlsym(handle.get(), dspqueue_read_pfn_t, dspqueue_read_pfn, dspqueue_read, false);
363+
dlsym(handle.get(), dspqueue_read_noblock_pfn_t, dspqueue_read_noblock_pfn, dspqueue_read_noblock, false);
352364
dlsym(handle.get(), remote_handle64_open_pfn_t, remote_handle64_open_pfn, remote_handle64_open, false);
353365
dlsym(handle.get(), remote_handle64_invoke_pfn_t, remote_handle64_invoke_pfn, remote_handle64_invoke, false);
354366
dlsym(handle.get(), remote_handle_control_pfn_t, remote_handle_control_pfn, remote_handle_control, false);

0 commit comments

Comments
 (0)