@@ -81,13 +81,17 @@ fn parse_cmdline(pid: &str) -> Result<String, Error> {
8181 Ok ( cmdline. into ( ) )
8282}
8383
84- fn process_maps < F > ( pid : & str , mut process_line : F ) -> Result < ( ) , Error >
84+ fn process_maps < F > ( pid : & str , header : Option < & str > , mut process_line : F ) -> Result < ( ) , Error >
8585where
8686 F : FnMut ( & MapLine ) ,
8787{
8888 let path = format ! ( "/proc/{pid}/maps" ) ;
8989 let contents = fs:: read_to_string ( path) ?;
9090
91+ if let Some ( header) = header {
92+ println ! ( "{header}" ) ;
93+ }
94+
9195 for line in contents. lines ( ) {
9296 let map_line = parse_map_line ( line) ?;
9397 process_line ( & map_line) ;
@@ -96,14 +100,18 @@ where
96100 Ok ( ( ) )
97101}
98102
99- fn process_smaps < F > ( pid : & str , mut process_entry : F ) -> Result < ( ) , Error >
103+ fn process_smaps < F > ( pid : & str , header : Option < & str > , mut process_entry : F ) -> Result < ( ) , Error >
100104where
101105 F : FnMut ( & SmapEntry ) ,
102106{
103107 let path = format ! ( "/proc/{pid}/smaps" ) ;
104108 let contents = fs:: read_to_string ( path) ?;
105109 let smap_entries = parse_smap_entries ( & contents) ?;
106110
111+ if let Some ( header) = header {
112+ println ! ( "{header}" ) ;
113+ }
114+
107115 for entry in smap_entries {
108116 process_entry ( & entry) ;
109117 }
@@ -114,7 +122,7 @@ where
114122fn output_default_format ( pid : & str ) -> Result < ( ) , Error > {
115123 let mut total = 0 ;
116124
117- process_maps ( pid, |map_line| {
125+ process_maps ( pid, None , |map_line| {
118126 println ! (
119127 "{} {:>6}K {} {}" ,
120128 map_line. address, map_line. size_in_kb, map_line. perms, map_line. mapping
@@ -132,22 +140,24 @@ fn output_extended_format(pid: &str) -> Result<(), Error> {
132140 let mut total_rss = 0 ;
133141 let mut total_dirty = 0 ;
134142
135- println ! ( "Address Kbytes RSS Dirty Mode Mapping" ) ;
136-
137- process_smaps ( pid, |smap_entry| {
138- println ! (
139- "{} {:>7} {:>7} {:>7} {} {}" ,
140- smap_entry. map_line. address,
141- smap_entry. map_line. size_in_kb,
142- smap_entry. rss_in_kb,
143- smap_entry. shared_dirty_in_kb + smap_entry. private_dirty_in_kb,
144- smap_entry. map_line. perms,
145- smap_entry. map_line. mapping
146- ) ;
147- total_mapped += smap_entry. map_line . size_in_kb ;
148- total_rss += smap_entry. rss_in_kb ;
149- total_dirty += smap_entry. shared_dirty_in_kb + smap_entry. private_dirty_in_kb ;
150- } ) ?;
143+ process_smaps (
144+ pid,
145+ Some ( "Address Kbytes RSS Dirty Mode Mapping" ) ,
146+ |smap_entry| {
147+ println ! (
148+ "{} {:>7} {:>7} {:>7} {} {}" ,
149+ smap_entry. map_line. address,
150+ smap_entry. map_line. size_in_kb,
151+ smap_entry. rss_in_kb,
152+ smap_entry. shared_dirty_in_kb + smap_entry. private_dirty_in_kb,
153+ smap_entry. map_line. perms,
154+ smap_entry. map_line. mapping
155+ ) ;
156+ total_mapped += smap_entry. map_line . size_in_kb ;
157+ total_rss += smap_entry. rss_in_kb ;
158+ total_dirty += smap_entry. shared_dirty_in_kb + smap_entry. private_dirty_in_kb ;
159+ } ,
160+ ) ?;
151161
152162 println ! ( "---------------- ------- ------- ------- " ) ;
153163 println ! ( "total kB {total_mapped:>7} {total_rss:>7} {total_dirty:>7}" ) ;
@@ -160,28 +170,30 @@ fn output_device_format(pid: &str) -> Result<(), Error> {
160170 let mut total_writeable_private = 0 ;
161171 let mut total_shared = 0 ;
162172
163- println ! ( "Address Kbytes Mode Offset Device Mapping" ) ;
164-
165- process_maps ( pid, |map_line| {
166- println ! (
167- "{} {:>7} {} {} {} {}" ,
168- map_line. address,
169- map_line. size_in_kb,
170- map_line. perms,
171- map_line. offset,
172- map_line. device,
173- map_line. mapping
174- ) ;
175- total_mapped += map_line. size_in_kb ;
176-
177- if map_line. perms . writable && !map_line. perms . shared {
178- total_writeable_private += map_line. size_in_kb ;
179- }
173+ process_maps (
174+ pid,
175+ Some ( "Address Kbytes Mode Offset Device Mapping" ) ,
176+ |map_line| {
177+ println ! (
178+ "{} {:>7} {} {} {} {}" ,
179+ map_line. address,
180+ map_line. size_in_kb,
181+ map_line. perms,
182+ map_line. offset,
183+ map_line. device,
184+ map_line. mapping
185+ ) ;
186+ total_mapped += map_line. size_in_kb ;
187+
188+ if map_line. perms . writable && !map_line. perms . shared {
189+ total_writeable_private += map_line. size_in_kb ;
190+ }
180191
181- if map_line. perms . shared {
182- total_shared += map_line. size_in_kb ;
183- }
184- } ) ?;
192+ if map_line. perms . shared {
193+ total_shared += map_line. size_in_kb ;
194+ }
195+ } ,
196+ ) ?;
185197
186198 println ! (
187199 "mapped: {total_mapped}K writeable/private: {total_writeable_private}K shared: {total_shared}K"
0 commit comments