Re: code cleanup

From: Brian Fundakowski Feldman <green_at_FreeBSD.org>
Date: Thu, 29 Apr 2004 14:55:30 -0400
John Baldwin <jhb_at_FreeBSD.org> wrote:
> On Thursday 29 April 2004 12:06 am, Alex Lyashkov wrote:
> > > Note that the allproc_lock protects the allproc list.  W/o the
> > > FOREACH_PROC macro, I can grep for 'allproc' in the source tree to find
> > > all users to verify locking, etc.  With the extra macro, I now have to do
> > > multiple greps.
> >
> > two greps is multiple ? first of FOREACH_PROC, second allproc or combine
> > at one grep with two -e parameters.
> 
> Multiple means more than one, yes.  When I'm searching the tree when locking a 
> structure or fields of a structure I don't usually come up with complex grep 
> statements, and actually, I wouldn't find the FOREACH_FOO macro until I did 
> the first grep anyway.  When you add lots of macros that do this you get a 
> compounding problem.

For what it's worth, I don't think it is good to hide things as much as
FOREACH_PROC_IN_SYSTEM() -- this specific instance -- does, but grep is not 
a good tool for a tree as large as FreeBSD's.  Try using cscope instead.

(This next part is slow.)
$ cscope -qRb           
(This next part is BLAZING FAST, even with MUTEX_PROFILING.)
$ cscope -qRdL -0 allproc
kern/kern_proc.c <global> 89 struct proclist allproc;
sys/proc.h <global> 811 extern struct proclist allproc;
alpha/alpha/db_trace.c db_stack_trace_cmd 253 LIST_FOREACH(p, &allproc, p_list) {
...
sys/proc.h FOREACH_PROC_IN_SYSTEM 682 LIST_FOREACH((p), &allproc, p_list)
(There's the hidden allproc.  Recursing to find the hidden usage is also 
blazing fast.)
$ cscope -qRdL -0 FOREACH_PROC_IN_SYSTEM
sys/proc.h <global> 681 #define FOREACH_PROC_IN_SYSTEM(p) \
kern/kern_resource.c setpriority 241 FOREACH_PROC_IN_SYSTEM(p) {
kern/sched_4bsd.c schedcpu 296 FOREACH_PROC_IN_SYSTEM(p) {
kern/subr_witness.c DB_SHOW_COMMAND 1833 FOREACH_PROC_IN_SYSTEM(p) {
vm/vm_glue.c vm_proc_swapin_all 389 FOREACH_PROC_IN_SYSTEM(p) {
vm/vm_glue.c scheduler 811 FOREACH_PROC_IN_SYSTEM(p) {
vm/vm_glue.c swapout_procs 919 FOREACH_PROC_IN_SYSTEM(p) {
vm/vm_meter.c vmtotal 115 FOREACH_PROC_IN_SYSTEM(p) {
vm/vm_pageout.c vm_pageout_scan 1171 FOREACH_PROC_IN_SYSTEM(p) {

The macros are obtuse, but using grep wastes time, too.  Please consider the 
alternatives instead.  Here's an example of how much time you can save:

$ alias cs="cscope -qR"
$ alias csupdate="cs -b"    
$ alias csgrep="cs -dL -0"
$ rm /home/green/cscope.*
$ time csupdate # first build
  125.89s real    22.76s user    13.11s system
$ time csupdate # only looking for updates
   11.75s real     0.18s user     2.22s system
$ time csgrep vmspace_dofree              
vm/vm_map.c vmspace_dofree 282 vmspace_dofree(struct vmspace *vm)
vm/vm_map.c vmspace_free 316 vmspace_dofree(vm);
vm/vm_map.c vmspace_exitfree 340 vmspace_dofree(vm);
    0.06s real     0.00s user     0.02s system


-- 
Brian Fundakowski Feldman                           \'[ FreeBSD ]''''''''''\
  <> green_at_FreeBSD.org                               \  The Power to Serve! \
 Opinions expressed are my own.                       \,,,,,,,,,,,,,,,,,,,,,,\
Received on Thu Apr 29 2004 - 09:55:32 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:37:52 UTC