freebsd-ports/graphics/fotocx/files/patch-zfuncs.cc
Alexey Dokuchaev 2a35061dc4 graphics/fotocx: the port had been updated to version 24.70
Amend the port description while here, based on the text from
the program's homepage, to highlight available features.
2024-11-09 07:01:14 +00:00

180 lines
5.4 KiB
C++

--- zfuncs.cc.orig 2024-07-01 07:25:41 UTC
+++ zfuncs.cc
@@ -559,6 +559,7 @@ int zmalloc_test(int64 cc)
double realmemory()
{
+#if defined(__linux__)
FILE *fid;
ch buff[100], *pp;
double rmem = 0;
@@ -577,15 +578,45 @@ double realmemory()
}
fclose(fid);
+#elif defined(__FreeBSD__)
+ long rmem;
+ rmem = sysconf(_SC_PAGESIZE) / 1024 * sysconf(_SC_PHYS_PAGES) / 1024;
+#endif
return rmem;
}
+#ifdef __FreeBSD__
+static int
+freeswap() // return total free swap space in megabytes
+{
+ struct xswdev xsw;
+ size_t mibsize, size;
+ int mib[16], n, total;
+ mibsize = sizeof mib / sizeof mib[0];
+ if (sysctlnametomib("vm.swap_info", mib, &mibsize) == -1) {
+ perror("sysctlnametomib()");
+ return -1;
+ }
+
+ int pagesize = getpagesize() / 1024;
+ for (total = n = 0; ; ++n) {
+ mib[mibsize] = n;
+ size = sizeof xsw;
+ if (sysctl(mib, mibsize + 1, &xsw, &size, NULL, 0) == -1)
+ break;
+ total += pagesize * (xsw.xsw_nblks - xsw.xsw_used) / 1024;
+ }
+ return total;
+}
+#endif
+
// get available memory in MB units (includes swap space)
// typical < 0.1 milliseconds
double availmemory()
{
+#if defined(__linux__)
FILE *fid;
ch buff[100], *pp;
double avmem = 0;
@@ -610,6 +641,11 @@ double availmemory()
}
fclose(fid);
+#elif defined(__FreeBSD__)
+ double avmem;
+ avmem = realmemory();
+ avmem += freeswap();
+#endif
return avmem;
}
@@ -749,7 +785,7 @@ void zappcrash(ch *format, ... )
uname(&unbuff); // get cpu arch. 32/64 bit
arch = unbuff.machine;
- fid1 = popen("lsb_release -d","r"); // get Linux flavor and release
+ fid1 = popen("uname -nv","r");
if (fid1) {
ii = fscanf(fid1,"%s %s %s",OS1,OS2,OS3);
pclose(fid1);
@@ -1062,7 +1098,7 @@ double get_seconds()
timespec time1;
double secs;
- clock_gettime(CLOCK_MONOTONIC_RAW,&time1);
+ clock_gettime(CLOCK_MONOTONIC,&time1);
secs = time1.tv_sec;
secs += time1.tv_nsec * 0.000000001;
return secs;
@@ -1111,7 +1147,7 @@ void logtime_init(ch *text)
using namespace logtime_names;
printf("logtime init: %s\n",text);
- clock_gettime(CLOCK_MONOTONIC_RAW,&time1);
+ clock_gettime(CLOCK_MONOTONIC,&time1);
return;
}
@@ -1119,7 +1155,7 @@ void logtime(ch *text)
{
using namespace logtime_names;
- clock_gettime(CLOCK_MONOTONIC_RAW,&time2);
+ clock_gettime(CLOCK_MONOTONIC,&time2);
elapsed = time2.tv_sec - time1.tv_sec;
elapsed += 0.000000001 * (time2.tv_nsec - time1.tv_nsec);
time1 = time2;
@@ -1808,6 +1844,10 @@ int wait_Jthread(pthread_t tid)
return 0;
}
+int get_nprocs()
+{
+ return sysconf(_SC_NPROCESSORS_ONLN);
+}
/********************************************************************************/
@@ -1858,7 +1898,7 @@ void set_cpu_affinity(int cpu)
{
int err;
static int ftf = 1, Nsmp;
- cpu_set_t cpuset;
+ cpuset_t cpuset;
if (ftf) { // first call
ftf = 0;
@@ -1869,7 +1909,8 @@ void set_cpu_affinity(int cpu)
CPU_ZERO(&cpuset);
CPU_SET(cpu,&cpuset);
- err = sched_setaffinity(0,sizeof(cpuset),&cpuset);
+ err = cpuset_setaffinity(CPU_LEVEL_WHICH,CPU_WHICH_PID,0,
+ sizeof(cpuset),&cpuset);
if (err) Plog(2,"set_cpu_affinity() %s \n",strerror(errno));
return;
}
@@ -2182,7 +2223,7 @@ uint diskspace(ch *file)
FILE *fid;
pp = zescape_quotes(file);
- snprintf(command,200,"df --output=avail \"%s\" ",pp);
+ snprintf(command,200,"df -k '%s' | awk '{print $4}'",pp);
zfree(pp);
fid = popen(command,"r");
@@ -4050,14 +4091,18 @@ ch * SearchWildCase(ch *wpath, int &uflag)
flist and flist[*] are subjects for zfree().
zfind() works for files containing quotes (")
- dotfiles (/. and /..) are not included
+ dotfiles (/. and /..) are not included, if possible
*********************************************************************************/
int zfind(ch *pattern, ch **&flist, int &NF)
{
ch **zfind_filelist = 0; // list of filespecs returned
+#ifdef GLOB_PERIOD
int globflags = GLOB_PERIOD; // include dotfiles
+#else
+ int globflags = 0;
+#endif
int ii, jj, err, cc;
glob_t globdata;
ch *pp;
@@ -6028,9 +6073,16 @@ int zinitapp(ch *appvers, int argc, ch *argv[])
if (argc > 1 && strmatchV(argv[1],"-ver","-v",0)) exit(0); // exit if nothing else wanted
progexe = 0;
+#if defined(__linux__)
cc = readlink("/proc/self/exe",buff,300); // get my executable program path
if (cc <= 0) zexit(1,"readlink() /proc/self/exe) failed");
buff[cc] = 0; // readlink() quirk
+#elif defined(__FreeBSD__)
+ const int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };
+ size_t len = sizeof(buff);
+ cc = sysctl(mib, 4, buff, &len, 0x0, 0);
+ if (cc == -1) zexit(1,"sysctl(KERN_PROC_PATHNAME) failed");
+#endif
progexe = zstrdup(buff,"zinitapp");
Plog(1,"program exe: %s \n",progexe); // executable path