@@ -64,7 +64,7 @@ size_t get_current_rss() {
64
64
--------------------------------------------------- */
65
65
#else
66
66
/* ----------------------------------------------------
67
- Linux/OSX version for get_peak_rss and get_current_rss
67
+ Linux/FreeBSD/ OSX version for get_peak_rss and get_current_rss
68
68
--------------------------------------------------- */
69
69
#include < unistd.h>
70
70
#include < sys/resource.h>
@@ -73,6 +73,18 @@ size_t get_current_rss() {
73
73
#include < mach/mach.h>
74
74
#endif
75
75
76
+ #if defined(__FreeBSD__)
77
+ // for procstat_*
78
+ #include < sys/param.h>
79
+ #include < sys/queue.h>
80
+ #include < sys/socket.h>
81
+ #include < libprocstat.h>
82
+ // for struct kinfo_proc
83
+ #include < sys/user.h>
84
+ // for KERN_PROC_PID
85
+ #include < sys/sysctl.h>
86
+ #endif
87
+
76
88
namespace lean {
77
89
size_t get_peak_rss () {
78
90
struct rusage rusage ;
@@ -91,6 +103,28 @@ size_t get_current_rss() {
91
103
if (task_info (mach_task_self (), MACH_TASK_BASIC_INFO, reinterpret_cast <task_info_t >(&info), &infoCount) != KERN_SUCCESS)
92
104
return static_cast <size_t >(0 );
93
105
return static_cast <size_t >(info.resident_size );
106
+ #elif defined(__FreeBSD__)
107
+ // initialize
108
+ unsigned int count = 0 ;
109
+
110
+ struct procstat *pstat = procstat_open_sysctl ();
111
+ if (!pstat)
112
+ return static_cast <size_t >(0 );
113
+
114
+ struct kinfo_proc *kp = procstat_getprocs (pstat, KERN_PROC_PID, getpid (), &count);
115
+ if (!kp) {
116
+ procstat_close (pstat);
117
+ return static_cast <size_t >(0 );
118
+ }
119
+
120
+ // compute
121
+ size_t rss_size = kp->ki_rssize *getpagesize ();
122
+
123
+ // cleanup
124
+ procstat_freeprocs (pstat, kp);
125
+ procstat_close (pstat);
126
+
127
+ return rss_size;
94
128
#else
95
129
long rss = 0 ;
96
130
FILE * fp = nullptr ;
0 commit comments