001/*
002 * BridJ - Dynamic and blazing-fast native interop for Java.
003 * http://bridj.googlecode.com/
004 *
005 * Copyright (c) 2010-2013, Olivier Chafik (http://ochafik.com/)
006 * All rights reserved.
007 *
008 * Redistribution and use in source and binary forms, with or without
009 * modification, are permitted provided that the following conditions are met:
010 * 
011 *     * Redistributions of source code must retain the above copyright
012 *       notice, this list of conditions and the following disclaimer.
013 *     * Redistributions in binary form must reproduce the above copyright
014 *       notice, this list of conditions and the following disclaimer in the
015 *       documentation and/or other materials provided with the distribution.
016 *     * Neither the name of Olivier Chafik nor the
017 *       names of its contributors may be used to endorse or promote products
018 *       derived from this software without specific prior written permission.
019 * 
020 * THIS SOFTWARE IS PROVIDED BY OLIVIER CHAFIK AND CONTRIBUTORS ``AS IS'' AND ANY
021 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
022 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
023 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
024 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
025 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
026 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
027 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
028 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
029 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
030 */
031package org.bridj.util;
032
033import org.bridj.ann.Library;
034import java.io.File;
035import java.io.IOException;
036import java.util.ArrayList;
037import java.util.List;
038
039import org.bridj.BridJ;
040import org.bridj.Platform;
041import org.bridj.ann.Convention;
042import static java.lang.System.getProperty;
043
044/**
045 * Util methods to : query the process id from the current process, launch
046 * processes (including JVM processes)
047 *
048 * @author Olivier
049 */
050public class ProcessUtils {
051
052    @Library("kernel32")
053    @Convention(Convention.Style.StdCall)
054    static class Kernel32 {
055
056        public static native int GetCurrentProcessId();
057    }
058
059    @Library("c")
060    static class LibC {
061
062        public static native int getpid();
063    }
064
065    /**
066     * Get the current process native id
067     */
068    public static int getCurrentProcessId() {
069        if (Platform.isWindows()) {
070            BridJ.register(Kernel32.class);
071            return Kernel32.GetCurrentProcessId();
072        } else {
073            BridJ.register(LibC.class);
074            return LibC.getpid();
075        }
076    }
077
078    public static String[] computeJavaProcessArgs(Class<?> mainClass, List<?> mainArgs) {
079        List<String> args = new ArrayList<String>();
080        args.add(new File(new File(getProperty("java.home")), "bin" + File.separator + "java").toString());
081        args.add("-cp");
082        args.add(getProperty("java.class.path"));
083        args.add(mainClass.getName());
084        for (Object arg : mainArgs) {
085            args.add(arg.toString());
086        }
087
088        return args.toArray(new String[args.size()]);
089    }
090
091    public static Process startJavaProcess(Class<?> mainClass, List<?> mainArgs) throws IOException {
092        ProcessBuilder b = new ProcessBuilder();
093        b.command(computeJavaProcessArgs(mainClass, mainArgs));
094        b.redirectErrorStream(true);
095        return b.start();
096    }
097}