Skip to content

Commit fdce870

Browse files
committed
[GR-41593] Add getpgid, setpgid, setpgrp, getpgrp and killpg to posix module
PullRequest: graalpython/2727
2 parents 5e4203d + d43a070 commit fdce870

File tree

7 files changed

+242
-1
lines changed

7 files changed

+242
-1
lines changed

graalpython/com.oracle.graal.python.cext/posix/posix.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,10 @@ int32_t call_kill(int64_t pid, int32_t signal) {
541541
return kill(pid, signal);
542542
}
543543

544+
int32_t call_killpg(int64_t pgid, int32_t signal) {
545+
return killpg(pgid, signal);
546+
}
547+
544548
int64_t call_getuid() {
545549
return getuid();
546550
}
@@ -553,6 +557,18 @@ int64_t call_getppid() {
553557
return getppid();
554558
}
555559

560+
int64_t call_getpgid(int64_t pid) {
561+
return getpgid(pid);
562+
}
563+
564+
int32_t call_setpgid(int64_t pid, int64_t pgid) {
565+
return setpgid(pid, pgid);
566+
}
567+
568+
int64_t call_getpgrp() {
569+
return getpgrp();
570+
}
571+
556572
int64_t call_getsid(int64_t pid) {
557573
return getsid(pid);
558574
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PosixModuleBuiltins.java

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,72 @@ long getPpid(@CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib) {
577577
}
578578
}
579579

580+
@Builtin(name = "getpgid", minNumOfPositionalArgs = 1, parameterNames = {"pid"})
581+
@ArgumentClinic(name = "pid", conversionClass = PidtConversionNode.class)
582+
@GenerateNodeFactory
583+
public abstract static class GetPgidNode extends PythonUnaryClinicBuiltinNode {
584+
@Override
585+
protected ArgumentClinicProvider getArgumentClinic() {
586+
return PosixModuleBuiltinsClinicProviders.GetPgidNodeClinicProviderGen.INSTANCE;
587+
}
588+
589+
@Specialization
590+
long getPgid(VirtualFrame frame, long pid,
591+
@CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib) {
592+
try {
593+
return posixLib.getpgid(getPosixSupport(), pid);
594+
} catch (PosixException e) {
595+
throw raiseOSErrorFromPosixException(frame, e);
596+
}
597+
}
598+
}
599+
600+
@Builtin(name = "setpgid", minNumOfPositionalArgs = 2, parameterNames = {"pid", "pgid"})
601+
@ArgumentClinic(name = "pid", conversionClass = PidtConversionNode.class)
602+
@ArgumentClinic(name = "pgid", conversionClass = PidtConversionNode.class)
603+
@GenerateNodeFactory
604+
public abstract static class SetPgidNode extends PythonBinaryClinicBuiltinNode {
605+
@Override
606+
protected ArgumentClinicProvider getArgumentClinic() {
607+
return PosixModuleBuiltinsClinicProviders.SetPgidNodeClinicProviderGen.INSTANCE;
608+
}
609+
610+
@Specialization
611+
Object setPgid(VirtualFrame frame, long pid, long pgid,
612+
@CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib) {
613+
try {
614+
posixLib.setpgid(getPosixSupport(), pid, pgid);
615+
return PNone.NONE;
616+
} catch (PosixException e) {
617+
throw raiseOSErrorFromPosixException(frame, e);
618+
}
619+
}
620+
}
621+
622+
@Builtin(name = "setpgrp", minNumOfPositionalArgs = 0)
623+
@GenerateNodeFactory
624+
public abstract static class SetPgrpdNode extends PythonBuiltinNode {
625+
@Specialization
626+
Object getPpid(VirtualFrame frame,
627+
@CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib) {
628+
try {
629+
posixLib.setpgid(getPosixSupport(), 0, 0);
630+
return PNone.NONE;
631+
} catch (PosixException e) {
632+
throw raiseOSErrorFromPosixException(frame, e);
633+
}
634+
}
635+
}
636+
637+
@Builtin(name = "getpgrp", minNumOfPositionalArgs = 0)
638+
@GenerateNodeFactory
639+
public abstract static class GetPgrpNode extends PythonBuiltinNode {
640+
@Specialization
641+
long getPpid(@CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib) {
642+
return posixLib.getpgrp(getPosixSupport());
643+
}
644+
}
645+
580646
@Builtin(name = "getsid", minNumOfPositionalArgs = 1, parameterNames = {"pid"})
581647
@ArgumentClinic(name = "pid", conversionClass = PidtConversionNode.class)
582648
@GenerateNodeFactory
@@ -2389,7 +2455,30 @@ PNone kill(VirtualFrame frame, long pid, int signal,
23892455
} catch (PosixException e) {
23902456
throw raiseOSErrorFromPosixException(frame, e);
23912457
}
2458+
}
2459+
}
23922460

2461+
@Builtin(name = "killpg", minNumOfPositionalArgs = 2, parameterNames = {"pgid", "signal"})
2462+
@ArgumentClinic(name = "pgid", conversionClass = PidtConversionNode.class)
2463+
@ArgumentClinic(name = "signal", conversion = ClinicConversion.Index)
2464+
@GenerateNodeFactory
2465+
abstract static class KillPgNode extends PythonBinaryClinicBuiltinNode {
2466+
@Override
2467+
protected ArgumentClinicProvider getArgumentClinic() {
2468+
return PosixModuleBuiltinsClinicProviders.KillNodeClinicProviderGen.INSTANCE;
2469+
}
2470+
2471+
@Specialization
2472+
PNone kill(VirtualFrame frame, long pid, int signal,
2473+
@Cached SysModuleBuiltins.AuditNode auditNode,
2474+
@CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib) {
2475+
auditNode.audit("killpg", pid, signal);
2476+
try {
2477+
posixLib.killpg(getPosixSupport(), pid, signal);
2478+
return PNone.NONE;
2479+
} catch (PosixException e) {
2480+
throw raiseOSErrorFromPosixException(frame, e);
2481+
}
23932482
}
23942483
}
23952484

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/EmulatedPosixSupport.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1838,6 +1838,12 @@ public void kill(long pid, int signal,
18381838
throw new UnsupportedPosixFeatureException("Sending arbitrary signals to child processes. Can only send some kill and term signals.");
18391839
}
18401840

1841+
@ExportMessage
1842+
@SuppressWarnings("static-method")
1843+
public long killpg(long pgid, int signal) {
1844+
throw new UnsupportedPosixFeatureException("Emulated killpg not supported");
1845+
}
1846+
18411847
@ExportMessage
18421848
public long[] waitpid(long pid, int options,
18431849
@CachedLibrary("this") PosixSupportLibrary posixLib) throws PosixException {
@@ -1960,6 +1966,24 @@ public long getppid() {
19601966
throw new UnsupportedPosixFeatureException("Emulated getppid not supported");
19611967
}
19621968

1969+
@ExportMessage
1970+
@SuppressWarnings("static-method")
1971+
public long getpgid(long pid) {
1972+
throw new UnsupportedPosixFeatureException("Emulated getpgid not supported");
1973+
}
1974+
1975+
@ExportMessage
1976+
@SuppressWarnings("static-method")
1977+
public void setpgid(long pid, long pgid) {
1978+
throw new UnsupportedPosixFeatureException("Emulated setpgid not supported");
1979+
}
1980+
1981+
@ExportMessage
1982+
@SuppressWarnings("static-method")
1983+
public long getpgrp() {
1984+
throw new UnsupportedPosixFeatureException("Emulated getpgrp not supported");
1985+
}
1986+
19631987
@ExportMessage
19641988
@SuppressWarnings("static-method")
19651989
public long getsid(long pid) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/ImageBuildtimePosixSupport.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,13 @@ final void kill(long pid, int signal,
547547
nativeLib.kill(nativePosixSupport, pid, signal);
548548
}
549549

550+
@ExportMessage
551+
final void killpg(long pgid, int signal,
552+
@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException {
553+
checkNotInImageBuildtime();
554+
nativeLib.killpg(nativePosixSupport, pgid, signal);
555+
}
556+
550557
@ExportMessage
551558
final long[] waitpid(long pid, int options,
552559
@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException {
@@ -634,6 +641,26 @@ final long getppid(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary
634641
return nativeLib.getppid(nativePosixSupport);
635642
}
636643

644+
@ExportMessage
645+
final long getpgid(long pid,
646+
@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException {
647+
checkNotInImageBuildtime();
648+
return nativeLib.getpgid(nativePosixSupport, pid);
649+
}
650+
651+
@ExportMessage
652+
final void setpgid(long pid, long pgid,
653+
@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException {
654+
checkNotInImageBuildtime();
655+
nativeLib.setpgid(nativePosixSupport, pid, pgid);
656+
}
657+
658+
@ExportMessage
659+
final long getpgrp(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) {
660+
checkNotInImageBuildtime();
661+
return nativeLib.getpgrp(nativePosixSupport);
662+
}
663+
637664
@ExportMessage
638665
final long getsid(long pid,
639666
@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws PosixException {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/LoggingPosixSupport.java

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,17 @@ final void kill(long pid, int signal,
681681
}
682682
}
683683

684+
@ExportMessage
685+
final void killpg(long pgid, int signal,
686+
@CachedLibrary("this.delegate") PosixSupportLibrary lib) throws PosixException {
687+
logEnter("killpg", "%d, %d", pgid, signal);
688+
try {
689+
lib.killpg(delegate, pgid, signal);
690+
} catch (PosixException e) {
691+
throw logException("killpg", e);
692+
}
693+
}
694+
684695
@ExportMessage
685696
public Object mmap(long length, int prot, int flags, int fd, long offset,
686697
@CachedLibrary("this.delegate") PosixSupportLibrary lib) throws PosixException {
@@ -805,7 +816,36 @@ final long getgid(
805816
final long getppid(
806817
@CachedLibrary("this.delegate") PosixSupportLibrary lib) {
807818
logEnter("getppid", "");
808-
return logExit("getppid", "%d", lib.getuid(delegate));
819+
return logExit("getppid", "%d", lib.getppid(delegate));
820+
}
821+
822+
@ExportMessage
823+
final long getpgid(long pid,
824+
@CachedLibrary("this.delegate") PosixSupportLibrary lib) throws PosixException {
825+
logEnter("getpgid", "%d", pid);
826+
try {
827+
return logExit("getpgid", "%d", lib.getpgid(delegate, pid));
828+
} catch (PosixException e) {
829+
throw logException("getpgid", e);
830+
}
831+
}
832+
833+
@ExportMessage
834+
final void setpgid(long pid, long pgid,
835+
@CachedLibrary("this.delegate") PosixSupportLibrary lib) throws PosixException {
836+
logEnter("setpgid", "%d, %d", pid, pgid);
837+
try {
838+
lib.setpgid(delegate, pid, pgid);
839+
} catch (PosixException e) {
840+
throw logException("setpgid", e);
841+
}
842+
}
843+
844+
@ExportMessage
845+
final long getpgrp(
846+
@CachedLibrary("this.delegate") PosixSupportLibrary lib) {
847+
logEnter("getpgrp", "");
848+
return logExit("getpgrp", "%d", lib.getpgrp(delegate));
809849
}
810850

811851
@ExportMessage

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

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ private enum PosixNativeFunction {
194194
set_blocking("(sint32, sint32):sint32"),
195195
get_terminal_size("(sint32, [sint32]):sint32"),
196196
call_kill("(sint64, sint32):sint32"),
197+
call_killpg("(sint64, sint32):sint32"),
197198
call_abort("():void"),
198199
call_waitpid("(sint64, [sint32], sint32):sint64"),
199200
call_wcoredump("(sint32):sint32"),
@@ -207,6 +208,9 @@ private enum PosixNativeFunction {
207208
call_getuid("():sint64"),
208209
call_getgid("():sint64"),
209210
call_getppid("():sint64"),
211+
call_getpgid("(sint64):sint64"),
212+
call_setpgid("(sint64,sint64):sint32"),
213+
call_getpgrp("():sint64"),
210214
call_getsid("(sint64):sint64"),
211215
call_ctermid("([sint8]):sint32"),
212216
call_setenv("([sint8], [sint8], sint32):sint32"),
@@ -1013,6 +1017,15 @@ public void kill(long pid, int signal,
10131017
}
10141018
}
10151019

1020+
@ExportMessage
1021+
public void killpg(long pgid, int signal,
1022+
@Shared("invoke") @Cached InvokeNativeFunction invokeNode) throws PosixException {
1023+
int res = invokeNode.callInt(this, PosixNativeFunction.call_killpg, pgid, signal);
1024+
if (res == -1) {
1025+
throw getErrnoAndThrowPosixException(invokeNode);
1026+
}
1027+
}
1028+
10161029
@ExportMessage
10171030
public long[] waitpid(long pid, int options,
10181031
@Shared("invoke") @Cached InvokeNativeFunction invokeNode) throws PosixException {
@@ -1101,6 +1114,30 @@ public long getppid(@Shared("invoke") @Cached InvokeNativeFunction invokeNode) {
11011114
return invokeNode.callLong(this, PosixNativeFunction.call_getppid);
11021115
}
11031116

1117+
@ExportMessage
1118+
public void setpgid(long pid, long pgid,
1119+
@Shared("invoke") @Cached InvokeNativeFunction invokeNode) throws PosixException {
1120+
int res = invokeNode.callInt(this, PosixNativeFunction.call_setpgid, pid, pgid);
1121+
if (res < 0) {
1122+
throw getErrnoAndThrowPosixException(invokeNode);
1123+
}
1124+
}
1125+
1126+
@ExportMessage
1127+
public long getpgid(long pid,
1128+
@Shared("invoke") @Cached InvokeNativeFunction invokeNode) throws PosixException {
1129+
long res = invokeNode.callLong(this, PosixNativeFunction.call_getpgid, pid);
1130+
if (res < 0) {
1131+
throw getErrnoAndThrowPosixException(invokeNode);
1132+
}
1133+
return res;
1134+
}
1135+
1136+
@ExportMessage
1137+
public long getpgrp(@Shared("invoke") @Cached InvokeNativeFunction invokeNode) {
1138+
return invokeNode.callLong(this, PosixNativeFunction.call_getpgrp);
1139+
}
1140+
11041141
@ExportMessage
11051142
public long getsid(long pid,
11061143
@Shared("invoke") @Cached InvokeNativeFunction invokeNode) throws PosixException {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixSupportLibrary.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,8 @@ public abstract class PosixSupportLibrary extends Library {
248248

249249
public abstract void kill(Object receiver, long pid, int signal) throws PosixException;
250250

251+
public abstract void killpg(Object receiver, long pid, int signal) throws PosixException;
252+
251253
public abstract long[] waitpid(Object receiver, long pid, int options) throws PosixException;
252254

253255
public abstract void abort(Object receiver);
@@ -274,6 +276,12 @@ public abstract class PosixSupportLibrary extends Library {
274276

275277
public abstract long getppid(Object receiver);
276278

279+
public abstract long getpgid(Object receiver, long pid) throws PosixException;
280+
281+
public abstract void setpgid(Object receiver, long pid, long pgid) throws PosixException;
282+
283+
public abstract long getpgrp(Object receiver);
284+
277285
public abstract long getsid(Object receiver, long pid) throws PosixException;
278286

279287
public abstract TruffleString ctermid(Object receiver) throws PosixException;

0 commit comments

Comments
 (0)