summaryrefslogtreecommitdiffstats
path: root/pki/base/osutil/src/com/netscape/osutil/ResourceLimit.java
blob: 23a99836b9d5e8bb493887757d17ae917f1f82c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
// --- BEGIN COPYRIGHT BLOCK ---
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; version 2 of the License.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, write to the Free Software Foundation, Inc.,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
//
// (C) 2007 Red Hat, Inc.
// All rights reserved.
// --- END COPYRIGHT BLOCK ---
package com.netscape.osutil;


import java.io.*;


/**
 * This class is to enabled reading/setting of various resource limits
 * on unix
 */
public class ResourceLimit {

    /**
     * Return the current process id of the Java VM
     */

    /**
     * See /usr/include/sys/resource.h
     */
    public static int RLIMIT_CPU = 0;
    public static int RLIMIT_FSIZE = 1;
    public static int RLIMIT_DATA = 2;
    public static int RLIMIT_STACK = 3;
    public static int RLIMIT_CORE = 4;
    public static int RLIMIT_NOFILE = 5;
    public static int RLIMIT_VMEM = 6;

    /**
     * Return the hard limit of the specified resource 
     */
    public static native int getHardLimit(int resource);

    /**
     * Return the soft limit of the specified resource 
     */
    public static native int getSoftLimit(int resource);

    /**
     * Set limits on the resource
     */
    public static native int setLimits(int resource, int soft, int hard);

    static {
        boolean mNativeLibrariesLoaded = false;
        if (File.separatorChar == '/') {
            String os = System.getProperty( "os.name" );
            if( ( os.equals( "Linux" ) ) ) {
                // Check for 64-bit library availability
                // prior to 32-bit library availability.
                mNativeLibrariesLoaded =
                    OSUtil.tryLoad( "/usr/lib64/osutil/libosutil.so" );
                if( mNativeLibrariesLoaded ) {
                    System.out.println( "64-bit osutil library loaded" );
                } else {
                    // REMINDER:  May be trying to run a 32-bit app
                    //            on 64-bit platform.
                    mNativeLibrariesLoaded =
                        OSUtil.tryLoad( "/usr/lib/osutil/libosutil.so" );
                    if( mNativeLibrariesLoaded ) {
                        System.out.println( "32-bit osutil library loaded");
                    } else {
                        System.out.println( "FAILED loading osutil library!");
                        System.exit( -1 );
                    }
                }
            } else {
                try {
                    System.loadLibrary( "osutil" );
                    System.out.println( "osutil library loaded" );
                    mNativeLibrariesLoaded = true;
                } catch( Throwable t ) {
                    // This is bad news, the program is doomed at this point
                    t.printStackTrace();
                }
            }
        }
    }

    /* little test program here... */

    public static void main(String args[]) {
        try {
            testFDlimit("64");
            printFDLimit();
            System.gc();
            System.out.println("Changing softlimit to be equal to hardlimit()");

            setLimits(RLIMIT_NOFILE, 
                getHardLimit(RLIMIT_NOFILE),
                getHardLimit(RLIMIT_NOFILE)
            );

            testFDlimit("1024");
            printFDLimit();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    private static void printFDLimit() {
        System.out.println("Max filedescs (hardlimit) " + getHardLimit(RLIMIT_NOFILE));
        System.out.println("Max filedescs (softlimit) " + getSoftLimit(RLIMIT_NOFILE));
    }

    /* this creates as many files as it can. The files will be closed when this
     function exits, as they will be garbage collected. */

    private static void testFDlimit(String a) {
        int count = 0;
        FileOutputStream f[] = new FileOutputStream[1024];

        try {
            for (count = 0; count < 1024; count++) {
                f[count] = new FileOutputStream("test_" + a + "_" + count);
            }
        } catch (Exception e) {
        }
    }

}