Skip to content

Commit f53b529

Browse files
committed
Deal with sem_timedwait not being available on Darwin
1 parent 61ba73f commit f53b529

2 files changed

Lines changed: 30 additions & 8 deletions

File tree

‎graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/NFIPosixSupport.java‎

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@
121121
import com.oracle.truffle.api.TruffleLanguage.Env;
122122
import com.oracle.truffle.api.TruffleLogger;
123123
import com.oracle.truffle.api.TruffleSafepoint;
124+
import com.oracle.truffle.api.dsl.Bind;
124125
import com.oracle.truffle.api.dsl.Cached;
125126
import com.oracle.truffle.api.dsl.Cached.Shared;
126127
import com.oracle.truffle.api.dsl.NeverDefault;
@@ -130,6 +131,7 @@
130131
import com.oracle.truffle.api.interop.UnknownIdentifierException;
131132
import com.oracle.truffle.api.interop.UnsupportedMessageException;
132133
import com.oracle.truffle.api.interop.UnsupportedTypeException;
134+
import com.oracle.truffle.api.library.CachedLibrary;
133135
import com.oracle.truffle.api.library.ExportLibrary;
134136
import com.oracle.truffle.api.library.ExportMessage;
135137
import com.oracle.truffle.api.nodes.Node;
@@ -2276,16 +2278,34 @@ boolean semTryWait(long handle,
22762278

22772279
@ExportMessage
22782280
boolean semTimedWait(long handle, long deadlineNs,
2279-
@Shared("invoke") @Cached InvokeNativeFunction invokeNode) throws PosixException {
2280-
int res = invokeNode.callInt(this, PosixNativeFunction.call_sem_timedwait, handle, deadlineNs);
2281-
if (res < 0) {
2282-
int errno = getErrno(invokeNode);
2283-
if (errno == OSErrorEnum.ETIMEDOUT.getNumber()) {
2284-
return false;
2281+
@Bind("$node") Node node,
2282+
@CachedLibrary("this") PosixSupportLibrary thisLib,
2283+
@Shared("invoke") @Cached InvokeNativeFunction invokeNode) throws PosixException {
2284+
if (PythonOS.getPythonOS() == PythonOS.PLATFORM_LINUX) {
2285+
int res = invokeNode.callInt(this, PosixNativeFunction.call_sem_timedwait, handle, deadlineNs);
2286+
if (res < 0) {
2287+
int errno = getErrno(invokeNode);
2288+
if (errno == OSErrorEnum.ETIMEDOUT.getNumber()) {
2289+
return false;
2290+
}
2291+
throw newPosixException(invokeNode, errno);
2292+
}
2293+
return true;
2294+
} else {
2295+
long deadlineMs = deadlineNs / 1_000_000;
2296+
while (true) {
2297+
if (thisLib.semTryWait(this, handle)) {
2298+
return true;
2299+
}
2300+
long currentMs = System.currentTimeMillis();
2301+
if (currentMs > deadlineMs) {
2302+
return false;
2303+
}
2304+
long delayMs = Math.min(deadlineMs - currentMs, 20);
2305+
TruffleSafepoint.setBlockedThreadInterruptible(node, Thread::sleep, delayMs);
2306+
TruffleSafepoint.poll(node);
22852307
}
2286-
throw newPosixException(invokeNode, errno);
22872308
}
2288-
return true;
22892309
}
22902310

22912311
@ExportMessage

‎graalpython/python-libposix/src/posix.c‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -938,11 +938,13 @@ int32_t call_sem_trywait(int64_t handle) {
938938
return sem_trywait((sem_t*)(uintptr_t)handle);
939939
}
940940

941+
#ifdef __linux__
941942
int32_t call_sem_timedwait(int64_t handle, int64_t deadlineNs) {
942943
const int64_t nsInSec = 1000 * 1000 * 1000;
943944
struct timespec deadline = {deadlineNs / nsInSec, deadlineNs % nsInSec};
944945
return sem_timedwait((sem_t*)(uintptr_t)handle, &deadline);
945946
}
947+
#endif
946948

947949
int32_t get_sysconf_getpw_r_size_max() {
948950
return sysconf(_SC_GETPW_R_SIZE_MAX);

0 commit comments

Comments
 (0)