/// <summary> /// Make sure we have obtained the min and max working set limits. /// </summary> private void GetWorkingSetLimits(out IntPtr minWorkingSet, out IntPtr maxWorkingSet) { // We can only do this for the current process on OS X if (_processId != Interop.libc.getpid()) { throw new PlatformNotSupportedException(SR.OsxExternalProcessWorkingSetNotSupported); } // Minimum working set (or resident set, as it is called on *nix) doesn't exist so set to 0 minWorkingSet = IntPtr.Zero; // Get the max working set size Interop.libc.rlimit info = Interop.libc.getrlimit(Interop.libc.RLIMIT_Resources.RLIMIT_RSS); maxWorkingSet = new IntPtr(Convert.ToInt64(info.rlim_cur)); }
/// <summary>Sets one or both of the minimum and maximum working set limits.</summary> /// <param name="newMin">The new minimum working set limit, or null not to change it.</param> /// <param name="newMax">The new maximum working set limit, or null not to change it.</param> /// <param name="resultingMin">The resulting minimum working set limit after any changes applied.</param> /// <param name="resultingMax">The resulting maximum working set limit after any changes applied.</param> private void SetWorkingSetLimitsCore(IntPtr?newMin, IntPtr?newMax, out IntPtr resultingMin, out IntPtr resultingMax) { // We can only do this for the current process on OS X if (_processId != Interop.libc.getpid()) { throw new PlatformNotSupportedException(SR.OsxExternalProcessWorkingSetNotSupported); } // There isn't a way to set the minimum working set, so throw an exception here if (newMin.HasValue) { throw new PlatformNotSupportedException(SR.MinimumWorkingSetNotSupported); } // The minimum resident set will always be 0, default the resulting max to 0 until we set it (to make the compiler happy) resultingMin = IntPtr.Zero; resultingMax = IntPtr.Zero; // The default hard upper limit is absurdly high (over 9000PB) so just change the soft limit...especially since // if you aren't root and move the upper limit down, you need root to move it back up if (newMax.HasValue) { Interop.libc.rlimit limits = new Interop.libc.rlimit() { rlim_cur = (ulong)newMax.Value.ToInt64() }; int result = Interop.libc.setrlimit(Interop.libc.RLIMIT_Resources.RLIMIT_RSS, ref limits); if (result < 0) { throw new System.ComponentModel.Win32Exception(SR.RUsageFailure); } // Grab the actual value, in case the OS decides to fudge the numbers limits = Interop.libc.getrlimit(Interop.libc.RLIMIT_Resources.RLIMIT_RSS); resultingMax = new IntPtr((long)limits.rlim_cur); } }
/// <summary>Sets one or both of the minimum and maximum working set limits.</summary> /// <param name="newMin">The new minimum working set limit, or null not to change it.</param> /// <param name="newMax">The new maximum working set limit, or null not to change it.</param> /// <param name="resultingMin">The resulting minimum working set limit after any changes applied.</param> /// <param name="resultingMax">The resulting maximum working set limit after any changes applied.</param> private void SetWorkingSetLimitsCore(IntPtr? newMin, IntPtr? newMax, out IntPtr resultingMin, out IntPtr resultingMax) { // We can only do this for the current process on OS X if (_processId != Interop.libc.getpid()) throw new PlatformNotSupportedException(SR.OsxExternalProcessWorkingSetNotSupported); // There isn't a way to set the minimum working set, so throw an exception here if (newMin.HasValue) { throw new PlatformNotSupportedException(SR.MinimumWorkingSetNotSupported); } // The minimum resident set will always be 0, default the resulting max to 0 until we set it (to make the compiler happy) resultingMin = IntPtr.Zero; resultingMax = IntPtr.Zero; // The default hard upper limit is absurdly high (over 9000PB) so just change the soft limit...especially since // if you aren't root and move the upper limit down, you need root to move it back up if (newMax.HasValue) { Interop.libc.rlimit limits = new Interop.libc.rlimit() { rlim_cur = (ulong)newMax.Value.ToInt64() }; int result = Interop.libc.setrlimit(Interop.libc.RLIMIT_Resources.RLIMIT_RSS, ref limits); if (result < 0) { throw new System.ComponentModel.Win32Exception(SR.RUsageFailure); } // Grab the actual value, in case the OS decides to fudge the numbers limits = Interop.libc.getrlimit(Interop.libc.RLIMIT_Resources.RLIMIT_RSS); resultingMax = new IntPtr((long)limits.rlim_cur); } }