src/java.base/macosx/native/libjava/ProcessHandleImpl_macosx.c
author phh
Sat, 30 Nov 2019 14:33:05 -0800
changeset 59330 5b96c12f909d
parent 47216 71c04702a3d5
permissions -rw-r--r--
8234541: C1 emits an empty message when it inlines successfully Summary: Use "inline" as the message when successfull Reviewed-by: thartmann, mdoerr Contributed-by: navy.xliu@gmail.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
     1
/*
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
     2
 * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
     4
 *
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    10
 *
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    15
 * accompanied this code).
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    16
 *
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    20
 *
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    23
 * questions.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    24
 */
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    25
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    26
#include "jni.h"
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    27
#include "jni_util.h"
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    28
#include "java_lang_ProcessHandleImpl.h"
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    29
#include "java_lang_ProcessHandleImpl_Info.h"
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    30
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
    31
#include "ProcessHandleImpl_unix.h"
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
    32
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    33
#include <stdio.h>
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    34
#include <errno.h>
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    35
#include <signal.h>
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    36
#include <stdlib.h>
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    37
#include <unistd.h>
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    38
#include <string.h>
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    39
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    40
#include <sys/sysctl.h>
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    41
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    42
/**
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
    43
 * Implementation of native ProcessHandleImpl functions for MAC OS X.
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
    44
 * See ProcessHandleImpl_unix.c for more details.
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    45
 */
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    46
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
    47
void os_initNative(JNIEnv *env, jclass clazz) {}
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    48
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    49
/*
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    50
 * Returns the children of the requested pid and optionally each parent.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    51
 *
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    52
 * Use sysctl to accumulate any process whose parent pid is zero or matches.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    53
 * The resulting pids are stored into the array of longs.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    54
 * The number of pids is returned if they all fit.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    55
 * If the parentArray is non-null, store the parent pid.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    56
 * If the array is too short, excess pids are not stored and
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    57
 * the desired length is returned.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    58
 */
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
    59
jint os_getChildren(JNIEnv *env, jlong jpid, jlongArray jarray,
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
    60
                    jlongArray jparentArray, jlongArray jstimesArray) {
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    61
    jlong* pids = NULL;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    62
    jlong* ppids = NULL;
31682
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
    63
    jlong* stimes = NULL;
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
    64
    jsize parentArraySize = 0;
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
    65
    jsize arraySize = 0;
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
    66
    jsize stimesSize = 0;
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
    67
    jsize count = 0;
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    68
    size_t bufSize = 0;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    69
    pid_t pid = (pid_t) jpid;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    70
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    71
    arraySize = (*env)->GetArrayLength(env, jarray);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    72
    JNU_CHECK_EXCEPTION_RETURN(env, -1);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    73
    if (jparentArray != NULL) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    74
        parentArraySize = (*env)->GetArrayLength(env, jparentArray);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    75
        JNU_CHECK_EXCEPTION_RETURN(env, -1);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    76
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    77
        if (arraySize != parentArraySize) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    78
            JNU_ThrowIllegalArgumentException(env, "array sizes not equal");
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    79
            return 0;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    80
        }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    81
    }
31682
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
    82
    if (jstimesArray != NULL) {
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
    83
        stimesSize = (*env)->GetArrayLength(env, jstimesArray);
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
    84
        JNU_CHECK_EXCEPTION_RETURN(env, -1);
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
    85
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
    86
        if (arraySize != stimesSize) {
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
    87
            JNU_ThrowIllegalArgumentException(env, "array sizes not equal");
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
    88
            return 0;
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
    89
        }
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
    90
    }
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    91
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    92
    // Get buffer size needed to read all processes
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    93
    int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0};
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    94
    if (sysctl(mib, 4, NULL, &bufSize, NULL, 0) < 0) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    95
        JNU_ThrowByNameWithLastError(env,
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    96
            "java/lang/RuntimeException", "sysctl failed");
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    97
        return -1;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    98
    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    99
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   100
    // Allocate buffer big enough for all processes
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   101
    void *buffer = malloc(bufSize);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   102
    if (buffer == NULL) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   103
        JNU_ThrowOutOfMemoryError(env, "malloc failed");
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   104
        return -1;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   105
    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   106
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   107
    // Read process info for all processes
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   108
    if (sysctl(mib, 4, buffer, &bufSize, NULL, 0) < 0) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   109
        JNU_ThrowByNameWithLastError(env,
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   110
            "java/lang/RuntimeException", "sysctl failed");
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   111
        free(buffer);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   112
        return -1;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   113
    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   114
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   115
    do { // Block to break out of on Exception
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   116
        struct kinfo_proc *kp = (struct kinfo_proc *) buffer;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   117
        unsigned long nentries = bufSize / sizeof (struct kinfo_proc);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   118
        long i;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   119
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   120
        pids = (*env)->GetLongArrayElements(env, jarray, NULL);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   121
        if (pids == NULL) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   122
            break;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   123
        }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   124
        if (jparentArray != NULL) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   125
            ppids  = (*env)->GetLongArrayElements(env, jparentArray, NULL);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   126
            if (ppids == NULL) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   127
                break;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   128
            }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   129
        }
31682
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
   130
        if (jstimesArray != NULL) {
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
   131
            stimes  = (*env)->GetLongArrayElements(env, jstimesArray, NULL);
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
   132
            if (stimes == NULL) {
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
   133
                break;
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
   134
            }
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
   135
        }
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   136
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   137
        // Process each entry in the buffer
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   138
        for (i = nentries; --i >= 0; ++kp) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   139
            if (pid == 0 || kp->kp_eproc.e_ppid == pid) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   140
                if (count < arraySize) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   141
                    // Only store if it fits
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   142
                    pids[count] = (jlong) kp->kp_proc.p_pid;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   143
                    if (ppids != NULL) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   144
                        // Store the parentPid
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   145
                        ppids[count] = (jlong) kp->kp_eproc.e_ppid;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   146
                    }
31682
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
   147
                    if (stimes != NULL) {
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
   148
                        // Store the process start time
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
   149
                        jlong startTime = kp->kp_proc.p_starttime.tv_sec * 1000 +
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
   150
                                          kp->kp_proc.p_starttime.tv_usec / 1000;
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
   151
                        stimes[count] = startTime;
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
   152
                    }
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   153
                }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   154
                count++; // Count to tabulate size needed
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   155
            }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   156
        }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   157
    } while (0);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   158
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   159
    if (pids != NULL) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   160
        (*env)->ReleaseLongArrayElements(env, jarray, pids, 0);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   161
    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   162
    if (ppids != NULL) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   163
        (*env)->ReleaseLongArrayElements(env, jparentArray, ppids, 0);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   164
    }
31682
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
   165
    if (stimes != NULL) {
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
   166
        (*env)->ReleaseLongArrayElements(env, jstimesArray, stimes, 0);
c19dcf5e0b6d 8078099: (process) ProcessHandle should uniquely identify processes
rriggs
parents: 30899
diff changeset
   167
    }
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   168
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   169
    free(buffer);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   170
    // If more pids than array had size for; count will be greater than array size
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   171
    return count;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   172
}
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   173
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   174
/**
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   175
 * Use sysctl and return the ppid, total cputime and start time.
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   176
 * Return: -1 is fail;  >=  0 is parent pid
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   177
 * 'total' will contain the running time of 'pid' in nanoseconds.
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   178
 * 'start' will contain the start time of 'pid' in milliseconds since epoch.
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   179
 */
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   180
pid_t os_getParentPidAndTimings(JNIEnv *env, pid_t jpid,
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   181
                                jlong *totalTime, jlong *startTime) {
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   182
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   183
    const pid_t pid = (pid_t) jpid;
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   184
    pid_t ppid = -1;
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   185
    struct kinfo_proc kp;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   186
    size_t bufSize = sizeof kp;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   187
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   188
    // Read the process info for the specific pid
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   189
    int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, pid};
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   190
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   191
    if (sysctl(mib, 4, &kp, &bufSize, NULL, 0) < 0) {
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   192
        JNU_ThrowByNameWithLastError(env,
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   193
            "java/lang/RuntimeException", "sysctl failed");
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   194
        return -1;
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   195
    }
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   196
    if (bufSize > 0 && kp.kp_proc.p_pid == pid) {
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   197
        *startTime = (jlong) (kp.kp_proc.p_starttime.tv_sec * 1000 +
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   198
                              kp.kp_proc.p_starttime.tv_usec / 1000);
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   199
        ppid = kp.kp_eproc.e_ppid;
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   200
    }
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   201
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   202
    // Get cputime if for current process
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   203
    if (pid == getpid()) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   204
        struct rusage usage;
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   205
        if (getrusage(RUSAGE_SELF, &usage) == 0) {
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   206
          jlong microsecs =
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   207
              usage.ru_utime.tv_sec * 1000 * 1000 + usage.ru_utime.tv_usec +
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   208
              usage.ru_stime.tv_sec * 1000 * 1000 + usage.ru_stime.tv_usec;
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   209
          *totalTime = microsecs * 1000;
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   210
        }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   211
    }
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   212
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   213
    return ppid;
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   214
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   215
}
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   216
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   217
/**
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   218
 * Return the uid of a process or -1 on error
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   219
 */
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   220
static uid_t getUID(pid_t pid) {
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   221
    struct kinfo_proc kp;
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   222
    size_t bufSize = sizeof kp;
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   223
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   224
    // Read the process info for the specific pid
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   225
    int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, pid};
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   226
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   227
    if (sysctl(mib, 4, &kp, &bufSize, NULL, 0) == 0) {
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   228
        if (bufSize > 0 && kp.kp_proc.p_pid == pid) {
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   229
            return kp.kp_eproc.e_ucred.cr_uid;
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   230
        }
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   231
    }
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   232
    return (uid_t)-1;
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   233
}
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   234
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   235
/**
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   236
 * Retrieve the command and arguments for the process and store them
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   237
 * into the Info object.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   238
 */
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   239
void os_getCmdlineAndUserInfo(JNIEnv *env, jobject jinfo, pid_t pid) {
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   240
    int mib[3], maxargs, nargs, i;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   241
    size_t size;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   242
    char *args, *cp, *sp, *np;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   243
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   244
    // Get the UID first. This is done here because it is cheap to do it here
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   245
    // on other platforms like Linux/Solaris/AIX where the uid comes from the
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   246
    // same source like the command line info.
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   247
    unix_getUserInfo(env, jinfo, getUID(pid));
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   248
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   249
    // Get the maximum size of the arguments
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   250
    mib[0] = CTL_KERN;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   251
    mib[1] = KERN_ARGMAX;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   252
    size = sizeof(maxargs);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   253
    if (sysctl(mib, 2, &maxargs, &size, NULL, 0) == -1) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   254
            JNU_ThrowByNameWithLastError(env,
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   255
                "java/lang/RuntimeException", "sysctl failed");
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   256
        return;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   257
    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   258
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   259
    // Allocate an args buffer and get the arguments
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   260
    args = (char *)malloc(maxargs);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   261
    if (args == NULL) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   262
        JNU_ThrowOutOfMemoryError(env, "malloc failed");
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   263
        return;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   264
    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   265
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   266
    do {            // a block to break out of on error
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   267
        char *argsEnd;
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   268
        jstring cmdexe = NULL;
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   269
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   270
        mib[0] = CTL_KERN;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   271
        mib[1] = KERN_PROCARGS2;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   272
        mib[2] = pid;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   273
        size = (size_t) maxargs;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   274
        if (sysctl(mib, 3, args, &size, NULL, 0) == -1) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   275
            if (errno != EINVAL) {
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   276
                JNU_ThrowByNameWithLastError(env,
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   277
                    "java/lang/RuntimeException", "sysctl failed");
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   278
            }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   279
            break;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   280
        }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   281
        memcpy(&nargs, args, sizeof(nargs));
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   282
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   283
        cp = &args[sizeof(nargs)];      // Strings start after nargs
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   284
        argsEnd = &args[size];
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   285
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   286
        // Store the command executable path
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   287
        if ((cmdexe = JNU_NewStringPlatform(env, cp)) == NULL) {
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   288
            break;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   289
        }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   290
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   291
        // Skip trailing nulls after the executable path
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   292
        for (cp = cp + strnlen(cp, argsEnd - cp); cp < argsEnd; cp++) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   293
            if (*cp != '\0') {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   294
                break;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   295
            }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   296
        }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   297
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31682
diff changeset
   298
        unix_fillArgArray(env, jinfo, nargs, cp, argsEnd, cmdexe, NULL);
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   299
    } while (0);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   300
    // Free the arg buffer
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   301
    free(args);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   302
}
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   303