Annotation of researchv10no/sys/io/dsort.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Seek sort for disks.
                      3:  *
                      4:  * actf and actl are the ends of an ordered list of buffers
                      5:  * bp is a new buffer, to be inserted in the list in a good place
                      6:  * the buffers are ordered by `cylinder' which is expected in b_resid.
                      7:  *
                      8:  * the list is two ascending lists: those greater than the head end
                      9:  * (the block being read or written now), and those less.
                     10:  * the idea is to sweep across the disk slowly doing io, then
                     11:  * seek quickly back and sweep again
                     12:  */
                     13: #include "sys/param.h"
                     14: #include "sys/buf.h"
                     15: 
                     16: #define        b_cylin b_resid
                     17: 
                     18: disksort(actf, actl, bp)
                     19: register struct buf **actf, **actl, *bp;
                     20: {
                     21:        register struct buf *ap;
                     22:        register long cyl;
                     23: 
                     24:        if((ap = *actf) == NULL) {
                     25:                *actf = *actl = bp;
                     26:                bp->av_forw = NULL;
                     27:                return;
                     28:        }
                     29:        if(bp->b_cylin < ap->b_cylin) {
                     30:                while(ap->av_forw) {
                     31:                        if(ap->av_forw->b_cylin < ap->b_cylin) {
                     32:                                cyl = 0;
                     33:                                break;
                     34:                        }
                     35:                        ap = ap->av_forw;
                     36:                }
                     37:        }
                     38:        else
                     39:                cyl = ap->b_cylin;
                     40:        while(ap->av_forw) {
                     41:                if(ap->av_forw->b_cylin < cyl ||
                     42:                   bp->b_cylin < ap->av_forw->b_cylin)
                     43:                        break;
                     44:                ap = ap->av_forw;
                     45:                cyl = ap->b_cylin;
                     46:        }
                     47:        bp->av_forw = ap->av_forw;
                     48:        ap->av_forw = bp;
                     49:        if(ap == *actl)
                     50:                *actl = bp;
                     51: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.