Skip to content

Commit 3454760

Browse files
committed
[GR-30397] Remove usages of signal() and sigset().
PullRequest: graal/9613
2 parents 00acbca + ef7f043 commit 3454760

File tree

4 files changed

+43
-13
lines changed

4 files changed

+43
-13
lines changed

substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/PosixSubstrateSegfaultHandler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ protected void install() {
102102
/* Register sa_sigaction signal handler */
103103
structSigAction.sa_flags(Signal.SA_SIGINFO() | Signal.SA_NODEFER());
104104
structSigAction.sa_sigaction(advancedSignalDispatcher.getFunctionPointer());
105-
Signal.sigaction(Signal.SignalEnum.SIGSEGV, structSigAction, WordFactory.nullPointer());
106-
Signal.sigaction(Signal.SignalEnum.SIGBUS, structSigAction, WordFactory.nullPointer());
105+
Signal.sigaction(Signal.SignalEnum.SIGSEGV.getCValue(), structSigAction, WordFactory.nullPointer());
106+
Signal.sigaction(Signal.SignalEnum.SIGBUS.getCValue(), structSigAction, WordFactory.nullPointer());
107107
}
108108
}

substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/PosixUtils.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@
2828
import java.io.IOException;
2929
import java.util.function.Function;
3030

31-
import com.oracle.svm.core.posix.linux.libc.GLibC;
32-
import com.oracle.svm.core.c.libc.LibCBase;
3331
import org.graalvm.compiler.serviceprovider.JavaVersionUtil;
3432
import org.graalvm.nativeimage.ImageSingletons;
3533
import org.graalvm.nativeimage.Platform;
@@ -49,11 +47,14 @@
4947
import com.oracle.svm.core.annotate.Alias;
5048
import com.oracle.svm.core.annotate.TargetClass;
5149
import com.oracle.svm.core.annotate.Uninterruptible;
50+
import com.oracle.svm.core.c.libc.LibCBase;
5251
import com.oracle.svm.core.posix.headers.Dlfcn;
5352
import com.oracle.svm.core.posix.headers.Errno;
5453
import com.oracle.svm.core.posix.headers.Locale;
54+
import com.oracle.svm.core.posix.headers.Signal;
5555
import com.oracle.svm.core.posix.headers.Unistd;
5656
import com.oracle.svm.core.posix.headers.Wait;
57+
import com.oracle.svm.core.posix.linux.libc.GLibC;
5758
import com.oracle.svm.core.util.VMError;
5859

5960
public class PosixUtils {
@@ -259,4 +260,24 @@ public static int readBytes(int fd, CCharPointer buffer, int bufferLen, int read
259260
}
260261
return readBytes;
261262
}
263+
264+
/**
265+
* Emulates the deprecated {@code signal} function via its replacement {@code sigaction},
266+
* assuming BSD semantics (like glibc does, for example).
267+
*
268+
* Use this or {@code sigaction} directly instead of calling {@code signal} or {@code sigset}:
269+
* they are not portable and when running in HotSpot, signal chaining (libjsig) prints warnings.
270+
*/
271+
public static Signal.SignalDispatcher installSignalHandler(int signum, Signal.SignalDispatcher handler) {
272+
Signal.sigaction old = StackValue.get(Signal.sigaction.class);
273+
Signal.sigaction act = StackValue.get(Signal.sigaction.class);
274+
Signal.sigemptyset(act.sa_mask());
275+
Signal.sigaddset(act.sa_mask(), signum);
276+
act.sa_flags(Signal.SA_RESTART());
277+
act.sa_handler(handler);
278+
if (Signal.sigaction(signum, act, old) != 0) {
279+
return Signal.SIG_ERR();
280+
}
281+
return old.sa_handler();
282+
}
262283
}

substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/SunMiscSubstitutions.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -135,20 +135,19 @@ private Util_jdk_internal_misc_Signal() {
135135
* This implementation does not complain (by returning -1) about registering signal handlers for
136136
* signals that the VM itself uses.
137137
*/
138-
protected static long handle0(int sig, long nativeH) {
138+
static long handle0(int sig, long nativeH) {
139139
ensureInitialized();
140140
final Signal.SignalDispatcher newDispatcher = nativeHToDispatcher(nativeH);
141141
/* If the dispatcher is the CSunMiscSignal handler, then check if the signal is in range. */
142142
if ((newDispatcher == CSunMiscSignal.countingHandlerFunctionPointer()) && (CSunMiscSignal.signalRangeCheck(sig) != 1)) {
143143
return sunMiscSignalErrorHandler;
144144
}
145145
updateDispatcher(sig, newDispatcher);
146-
final Signal.SignalDispatcher oldDispatcher = Signal.signal(sig, newDispatcher);
146+
final Signal.SignalDispatcher oldDispatcher = PosixUtils.installSignalHandler(sig, newDispatcher);
147147
CIntPointer sigset = StackValue.get(CIntPointer.class);
148148
sigset.write(1 << (sig - 1));
149149
Signal.sigprocmask(Signal.SIG_UNBLOCK(), (Signal.sigset_tPointer) sigset, WordFactory.nullPointer());
150-
final long result = dispatcherToNativeH(oldDispatcher);
151-
return result;
150+
return dispatcherToNativeH(oldDispatcher);
152151
}
153152

154153
/** Runtime initialization. */
@@ -409,7 +408,7 @@ final class IgnoreSIGPIPEStartupHook implements Runnable {
409408
*/
410409
@Override
411410
public void run() {
412-
final SignalDispatcher signalResult = Signal.signal(Signal.SignalEnum.SIGPIPE.getCValue(), Signal.SIG_IGN());
411+
final SignalDispatcher signalResult = PosixUtils.installSignalHandler(Signal.SignalEnum.SIGPIPE.getCValue(), Signal.SIG_IGN());
413412
VMError.guarantee(signalResult != Signal.SIG_ERR(), "IgnoreSIGPIPEFeature.run: Could not ignore SIGPIPE");
414413
}
415414
}

substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/headers/Signal.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444

4545
import com.oracle.svm.core.RegisterDumper;
4646
import com.oracle.svm.core.SubstrateSegfaultHandler;
47+
import com.oracle.svm.core.posix.PosixUtils;
4748

4849
// Checkstyle: stop
4950

@@ -72,14 +73,16 @@ public class Signal {
7273
public interface sigset_tPointer extends PointerBase {
7374
}
7475

76+
/**
77+
* Warning: use {@link #sigaction} or {@link PosixUtils#installSignalHandler}. Do NOT introduce
78+
* calls to {@code signal} or {@code sigset}, which are not portable, and when running in
79+
* HotSpot, signal chaining (libjsig) will print warnings.
80+
*/
7581
public interface SignalDispatcher extends CFunctionPointer {
7682
@InvokeCFunctionPointer
7783
void dispatch(int sig);
7884
}
7985

80-
@CFunction
81-
public static native SignalDispatcher signal(int signum, SignalDispatcher handler);
82-
8386
@CConstant
8487
public static native SignalDispatcher SIG_DFL();
8588

@@ -288,6 +291,9 @@ public interface AdvancedSignalDispatcher extends CFunctionPointer {
288291
void dispatch(int signum, siginfo_t siginfo, WordPointer opaque);
289292
}
290293

294+
@CConstant
295+
public static native int SA_RESTART();
296+
291297
@CConstant
292298
public static native int SA_SIGINFO();
293299

@@ -318,8 +324,9 @@ public interface sigaction extends PointerBase {
318324
sigset_tPointer sa_mask();
319325
}
320326

327+
/** @param signum from {@link SignalEnum#getCValue()} */
321328
@CFunction
322-
public static native int sigaction(SignalEnum signum, sigaction act, sigaction oldact);
329+
public static native int sigaction(int signum, sigaction act, sigaction oldact);
323330

324331
@CEnum
325332
@CContext(PosixDirectives.class)
@@ -383,4 +390,7 @@ public enum DarwinSignalEnum {
383390

384391
@CFunction
385392
public static native int sigemptyset(sigset_tPointer set);
393+
394+
@CFunction
395+
public static native int sigaddset(sigset_tPointer set, int signum);
386396
}

0 commit comments

Comments
 (0)