--- mbuffer.c.orig 2018-03-15 09:04:54.000000000 -0500 +++ mbuffer.c 2018-03-15 11:52:58.000000000 -0500 @@ -42,6 +42,10 @@ #include #include +#ifdef __FreeBSD__ +#include +#endif + #ifdef HAVE_SENDFILE #ifdef HAVE_SENDFILE_H @@ -956,9 +960,16 @@ debugmsg("total # of phys pages: %li\n",NumP); } #elif defined(__FreeBSD__) - size_t nump_size = sizeof(nump_size); - sysctlbyname("hw.availpages", &NumP, &nump_size, NULL, 0); + /* Get free memory average */ + struct vmtotal vmt; + size_t vmt_size = sizeof(vmt); + if (sysctlbyname("vm.vmtotal", &vmt, &vmt_size, NULL, 0) < 0) + fatal("Unable to read vm.vmtotal"); + if (vmt_size != sizeof(vmt)) + fatal("Unable to read (wrong size) vm.vmtotal"); + NumP = vmt.t_free; #endif + long mxnrsem = sysconf(_SC_SEM_VALUE_MAX); #ifdef _SC_PAGESIZE PgSz = sysconf(_SC_PAGESIZE); @@ -972,6 +983,8 @@ Blocksize = PgSz; debugmsg("Blocksize set to physical page size of %u bytes\n",PgSz); Numblocks = NumP/50; + if (mxnrsem < Numblocks) + Numblocks = mxnrsem; debugmsg("set Numblocks to %u\n",Numblocks); } --- settings.c.orig 2018-03-15 10:22:55.000000000 -0500 +++ settings.c 2018-03-15 12:25:51.000000000 -0500 @@ -39,10 +39,6 @@ #include #include -#ifdef __FreeBSD__ -#include -#endif - typedef enum { off, on, invalid } flag_t; @@ -398,13 +394,7 @@ long mxnrsem; /* check that we stay within system limits */ -#ifdef __FreeBSD__ - size_t semvmx_size = sizeof(mxnrsem); - if (sysctlbyname("kern.ipc.semvmx", &mxnrsem, &semvmx_size, 0, 0) == -1) - mxnrsem = -1; -#else mxnrsem = sysconf(_SC_SEM_VALUE_MAX); -#endif if (-1 == mxnrsem) { #ifdef SEM_MAX_VALUE mxnrsem = SEM_MAX_VALUE;