Skip to content

Commit

Permalink
Repeat sysctl in case of failures; increase the proc info buffer a bi…
Browse files Browse the repository at this point in the history
…t to hold some more very recent procs
  • Loading branch information
MBaesken committed Sep 5, 2024
1 parent a9cd3b2 commit f344502
Showing 1 changed file with 25 additions and 15 deletions.
40 changes: 25 additions & 15 deletions src/java.base/macosx/native/libjava/ProcessHandleImpl_macosx.c
Original file line number Diff line number Diff line change
Expand Up @@ -97,23 +97,33 @@ jint os_getChildren(JNIEnv *env, jlong jpid, jlongArray jarray,
}
}

// Get buffer size needed to read all processes
int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0};
if (sysctl(mib, 4, NULL, &bufSize, NULL, 0) < 0) {
JNU_ThrowByNameWithMessageAndLastError(env,
"java/lang/RuntimeException", "sysctl failed");
return -1;
}
int errsysctl;
int maxRetries = 100;
void *buffer = NULL;
do {
int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0};
if (buffer != NULL) free(buffer);
// Get buffer size needed to read all processes
if (sysctl(mib, 4, NULL, &bufSize, NULL, 0) < 0) {
JNU_ThrowByNameWithMessageAndLastError(env,
"java/lang/RuntimeException", "sysctl failed");
return -1;
}

// Allocate buffer big enough for all processes
void *buffer = malloc(bufSize);
if (buffer == NULL) {
JNU_ThrowOutOfMemoryError(env, "malloc failed");
return -1;
}
// Allocate buffer big enough for all processes; add a little
// bit of space to be able to hold a few more proc infos
// for processes started rigth after the first sysctl call
buffer = malloc(bufSize + 4 * sizeof(struct kinfo_proc));
if (buffer == NULL) {
JNU_ThrowOutOfMemoryError(env, "malloc failed");
return -1;
}

// Read process info for all processes
errsysctl = sysctl(mib, 4, buffer, &bufSize, NULL, 0);
} while (errsysctl < 0 && maxRetries-- > 0);

// Read process info for all processes
if (sysctl(mib, 4, buffer, &bufSize, NULL, 0) < 0) {
if (errsysctl < 0) {
JNU_ThrowByNameWithMessageAndLastError(env,
"java/lang/RuntimeException", "sysctl failed to get info about all processes");
free(buffer);
Expand Down

0 comments on commit f344502

Please sign in to comment.