Damjan Jovanovic : server: Implement vm counters on FreeBSD.

Alexandre Julliard julliard at winehq.org
Fri Nov 19 15:45:33 CST 2021


Module: wine
Branch: master
Commit: 93852599c20f0ba7859ef9dcafa5fbc05cce86f1
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=93852599c20f0ba7859ef9dcafa5fbc05cce86f1

Author: Damjan Jovanovic <damjan.jov at gmail.com>
Date:   Fri Nov 19 17:31:39 2021 +0200

server: Implement vm counters on FreeBSD.

Signed-off-by: Damjan Jovanovic <damjan.jov at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 server/Makefile.in |  2 +-
 server/process.c   | 40 ++++++++++++++++++++++++++++++++++++++--
 2 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/server/Makefile.in b/server/Makefile.in
index 84e78d0aa56..739d0517339 100644
--- a/server/Makefile.in
+++ b/server/Makefile.in
@@ -49,6 +49,6 @@ MANPAGES = \
 	wineserver.fr.UTF-8.man.in \
 	wineserver.man.in
 
-EXTRALIBS = $(LDEXECFLAGS) $(RT_LIBS) $(INOTIFY_LIBS)
+EXTRALIBS = $(LDEXECFLAGS) $(RT_LIBS) $(INOTIFY_LIBS) $(PROCSTAT_LIBS)
 
 unicode_EXTRADEFS = -DNLSDIR="\"${nlsdir}\"" -DBIN_TO_NLSDIR=\"`${MAKEDEP} -R ${bindir} ${nlsdir}`\"
diff --git a/server/process.c b/server/process.c
index 343ad78270c..6d794ba5ead 100644
--- a/server/process.c
+++ b/server/process.c
@@ -36,6 +36,23 @@
 #endif
 #include <unistd.h>
 #include <poll.h>
+#ifdef HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+#ifdef HAVE_SYS_QUEUE_H
+# include <sys/queue.h>
+#endif
+#ifdef HAVE_SYS_SYSCTL_H
+# include <sys/sysctl.h>
+#endif
+#ifdef HAVE_SYS_USER_H
+# define thread __unix_thread
+# include <sys/user.h>
+# undef thread
+#endif
+#ifdef HAVE_LIBPROCSTAT
+# include <libprocstat.h>
+#endif
 
 #include "ntstatus.h"
 #define WIN32_NO_STATUS
@@ -1550,9 +1567,9 @@ DECL_HANDLER(get_process_vm_counters)
     struct process *process = get_process_from_handle( req->handle, PROCESS_QUERY_LIMITED_INFORMATION );
 
     if (!process) return;
-#ifdef linux
     if (process->unix_pid != -1)
     {
+#ifdef linux
         FILE *f;
         char proc_path[32], line[256];
         unsigned long value;
@@ -1579,9 +1596,28 @@ DECL_HANDLER(get_process_vm_counters)
             fclose( f );
         }
         else set_error( STATUS_ACCESS_DENIED );
+#elif defined(HAVE_LIBPROCSTAT)
+        struct procstat *procstat;
+        unsigned int count;
+
+        if ((procstat = procstat_open_sysctl()))
+        {
+            struct kinfo_proc *kp = procstat_getprocs( procstat, KERN_PROC_PID, process->unix_pid, &count );
+            if (kp)
+            {
+                reply->virtual_size = kp->ki_size;
+                reply->peak_virtual_size = reply->virtual_size;
+                reply->working_set_size = kp->ki_rssize << PAGE_SHIFT;
+                reply->peak_working_set_size = kp->ki_rusage.ru_maxrss * 1024;
+                procstat_freeprocs( procstat, kp );
+            }
+            else set_error( STATUS_ACCESS_DENIED );
+            procstat_close( procstat );
+        }
+        else set_error( STATUS_ACCESS_DENIED );
+#endif
     }
     else set_error( STATUS_ACCESS_DENIED );
-#endif
     release_object( process );
 }
 




More information about the wine-cvs mailing list