Skip to content

Commit ac7c83e

Browse files
committed
sysdeps/managarm: store cancelEvent in shared memory page
1 parent 4ab4cf1 commit ac7c83e

File tree

2 files changed

+11
-1
lines changed

2 files changed

+11
-1
lines changed

sysdeps/managarm/generic/entry.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ namespace {
3131
thread_local unsigned __mlibc_gsf_nesting;
3232
thread_local void *__mlibc_cached_thread_page;
3333
thread_local HelHandle *cachedFileTable;
34+
thread_local HelHandle *cancelEvent;
3435

3536
// This construction is a bit weird: Even though the variables above
3637
// are thread_local we still protect their initialization with a pthread_once_t
@@ -46,6 +47,7 @@ namespace {
4647
__mlibc_cached_thread_page = data.threadPage;
4748
cachedFileTable = data.fileTable;
4849
__mlibc_clk_tracker_page = data.clockTrackerPage;
50+
cancelEvent = data.cancelRequestEvent;
4951
}
5052
}
5153

@@ -103,6 +105,11 @@ HelHandle getHandleForFd(int fd) {
103105
return cacheFileTable()[fd];
104106
}
105107

108+
void setCurrentRequestEvent(HelHandle event) {
109+
pthread_once(&has_cached_infos, &actuallyCacheInfos);
110+
__atomic_store_n(cancelEvent, event, __ATOMIC_RELEASE);
111+
}
112+
106113
void clearCachedInfos() {
107114
has_cached_infos = PTHREAD_ONCE_INIT;
108115
}

sysdeps/managarm/include/mlibc/posix-pipe.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,7 @@ inline HelHandleResult *parseHandle(ElementHandle &element) {
292292
HelHandle getPosixLane();
293293
HelHandle *cacheFileTable();
294294
HelHandle getHandleForFd(int fd);
295+
void setCurrentRequestEvent(HelHandle event);
295296
void clearCachedInfos();
296297

297298
extern thread_local Queue globalQueue;
@@ -324,12 +325,12 @@ auto exchangeMsgsSyncCancellable(HelHandle descriptor, HelHandle event,
324325
auto results = helix_ng::createResultsTuple(args...);
325326
auto actions = helix_ng::chainActionArrays(args...);
326327

328+
setCurrentRequestEvent(event);
327329
HEL_CHECK(helSubmitAsync(descriptor, actions.data(),
328330
actions.size(), globalQueue.getQueue(), 0, 0));
329331

330332
auto element = globalQueue.dequeueSingle(false);
331333
if (!element) {
332-
HEL_CHECK(helRaiseEvent(event));
333334
element = globalQueue.dequeueSingle();
334335
__ensure(element);
335336
}
@@ -339,6 +340,8 @@ auto exchangeMsgsSyncCancellable(HelHandle descriptor, HelHandle event,
339340
(results.template get<p>().parse(ptr, *element), ...);
340341
} (std::make_index_sequence<std::tuple_size_v<decltype(results)>>{});
341342

343+
setCurrentRequestEvent(kHelNullHandle);
344+
342345
return results;
343346
}
344347

0 commit comments

Comments
 (0)