version 1.47, 2015/03/20 00:26:38 |
version 1.48, 2015/03/20 23:04:07 |
|
|
* SUCH DAMAGE. |
* SUCH DAMAGE. |
*/ |
*/ |
|
|
|
#include <sys/resource.h> |
#include <sys/stat.h> |
#include <sys/stat.h> |
|
#include <sys/sysctl.h> |
#include <sys/types.h> |
#include <sys/types.h> |
|
|
#include <err.h> |
#include <err.h> |
|
|
static void |
static void |
set_hw_params(void) |
set_hw_params(void) |
{ |
{ |
long pages, psize; |
long long user_memory; |
|
struct rlimit rl; |
|
size_t len; |
|
int mib[] = { CTL_HW, HW_USERMEM64 }; |
|
|
pages = sysconf(_SC_PHYS_PAGES); |
/* Get total user (non-kernel) memory. */ |
if (pages < 1) { |
len = sizeof(user_memory); |
warn("sysconf pages"); |
if (sysctl(mib, 2, &user_memory, &len, NULL, 0) == -1) |
pages = 1; |
user_memory = -1; |
} |
|
psize = sysconf(_SC_PAGESIZE); |
|
if (psize < 1) { |
|
warn("sysconf psize"); |
|
psize = 4096; |
|
} |
|
|
|
free_memory = (unsigned long long) pages * (unsigned long long) psize; |
/* Increase our data size to the max */ |
available_free_memory = free_memory / 2; |
if (getrlimit(RLIMIT_DATA, &rl) == 0) { |
|
free_memory = (unsigned long long)rl.rlim_cur; |
|
rl.rlim_cur = rl.rlim_max; |
|
if (setrlimit(RLIMIT_DATA, &rl) == 0) { |
|
free_memory = (unsigned long long)rl.rlim_max; |
|
} else { |
|
warn("Can't set resource limit to max data size"); |
|
} |
|
} else |
|
warn("Can't get resource limit for data size"); |
|
|
if (available_free_memory < 1024) |
/* We prefer to use temp files rather than swap space. */ |
available_free_memory = 1024; |
if (user_memory != -1 && free_memory > user_memory) |
|
free_memory = user_memory; |
|
|
|
available_free_memory = free_memory / 2; |
} |
} |
|
|
/* |
/* |