Changeset 14863


Ignore:
Timestamp:
09/04/16 07:16:19 (6 years ago)
Author:
Mark Evenson
Message:

(Vibhu Mohindra) Fix RandomAccessCharacterFile?.java

Location:
trunk/abcl
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/abcl/abcl.rdf

    r14862 r14863  
    6060    rdf:_4 _:astalla ;
    6161    rdf:_5 _:rudi ;
    62     rdf:_5 _:ferada ;
    63     rdf:_5 _:cyrus ;
    64     rdf:_5 _:dmiles ;
    65     rdf:_5 _:alanr ;
    66     rdf:_5 _:pipping ;
     62    rdf:_6 _:ferada ;
     63    rdf:_7 _:cyrus ;
     64    rdf:_8 _:dmiles ;
     65    rdf:_9 _:alanr ;
     66    rdf:_10 _:pipping ;
     67    rdf:_11 _:olof ;
    6768] .
    6869
  • trunk/abcl/src/org/armedbear/lisp/util/RandomAccessCharacterFile.java

    r14735 r14863  
    5252import java.nio.charset.CodingErrorAction;
    5353import java.nio.charset.UnsupportedCharsetException;
     54
    5455import org.armedbear.lisp.Debug;
     56
    5557import static org.armedbear.lisp.Lisp.error;
     58
    5659import org.armedbear.lisp.SimpleError;
    5760import org.armedbear.lisp.SimpleString;
     
    299302        bbufIsDirty = false;
    300303
    301         bbufIsReadable = false;
     304        bbufIsReadable = true;
    302305
    303306        bbufpos = fcn.position();
     
    357360
    358361            if (bbufIsDirty) {
    359                 bbuf.flip();
    360                 fcn.position(bbufpos);
    361                 fcn.write(bbuf);
    362                 bbufpos += bbuf.position();
     362                flushBbuf(false);
    363363                bbuf.clear();
     364                bbufIsReadable = false;
    364365            } else {
    365366                int bbufEnd = bbufIsReadable ? bbuf.limit() : bbuf.position();
    366367                fcn.position(bbufpos + bbufEnd);
    367368                bbufpos += bbuf.position();
    368                 bbuf.compact();
     369                if (bbufIsReadable) {
     370                  bbuf.compact();
     371                  bbufIsReadable = false;
     372                } else //must discard the junk bytes after bbuf.position()
     373                  bbuf.clear();
    369374            }
    370375
     
    376381        return bufReady;
    377382    }
     383
    378384
    379385    final int read(char[] cb, int off, int len) throws IOException {
     
    429435                flushBbuf(false);
    430436                bbuf.clear();
     437                bbufIsReadable = false;
    431438            }
    432439            if (r.isUnmappable()) {
     
    456463        if (newPosition >= bbufpos && newPosition < bbufend) {
    457464            // near seek. within existing data of bbuf.
     465            if (!bbufIsReadable) { //rewinding. keep tail buffered.
     466              bbuf.limit(bbuf.position());
     467              bbufIsReadable = true;
     468            }
    458469            bbuf.position((int)(newPosition - bbufpos));
    459470        } else {
     
    462473            bbuf.clear();
    463474            bbuf.flip(); // "there is no useful data on this buffer yet."
     475            bbufIsReadable = true;
    464476            bbufpos = newPosition;
    465477        }
     
    471483
    472484    public final long length() throws IOException {
    473         flushBbuf(false);
     485        flushBbuf(true);
    474486        return fcn.size();
    475487    }
    476488
    477     private final void flushBbuf(boolean commitOnly) throws IOException {
    478         if (! bbufIsDirty)
     489    final void flushBbuf(boolean commitOnly) throws IOException {
     490        if (commitOnly && !bbufIsDirty)
    479491            return;
     492        //otherwise, we do at least need to increase bbufpos
    480493
    481494        fcn.position(bbufpos);
     
    484497        // before position(): before re-positioning, this.position()
    485498        // calls this function.
    486         if (commitOnly || bbufIsReadable) {
     499        if (commitOnly) {
    487500            ByteBuffer dup = bbuf.duplicate();
    488501            dup.flip();
    489502            fcn.write(dup);
     503            //ideally, should restore fcn.position(). but don't for performance.
     504//            fcn.position(fcn.position()-dup.position());
     505            bbufIsDirty = false; //this fixed stas's bug, but not mine.
    490506            return;
    491507        }
    492         bbuf.flip();
    493         fcn.write(bbuf);
     508       
     509        if (bbufIsDirty) {
     510          bbuf.flip();
     511          fcn.write(bbuf);
     512        }
    494513
    495514        bbufpos += bbuf.position();
     
    497516        bbuf.flip(); // there's no useable data in this buffer
    498517        bbufIsDirty = false;
    499         bbufIsReadable = false;
     518        bbufIsReadable = true;
    500519    }
    501520
     
    506525
    507526            atEof = ! ensureReadBbuf(false);
    508             int want = len - pos;
    509             if (want > bbuf.remaining()) {
    510                 want = bbuf.remaining();
    511             }
     527            int want = Math.min(off + len - pos, bbuf.remaining());
    512528            bbuf.get(b, pos, want);
    513529            pos += want;
     
    559575        int pos = off;
    560576        while (pos < off + len) {
    561             int want = len - pos + off;
    562             if (want > bbuf.remaining()) {
    563                 want = bbuf.remaining();
    564             }
    565             bbuf.put(b, pos, want);
    566             pos += want;
    567             bbufIsDirty = true;
    568577            if (bbuf.remaining() == 0) {
    569578                flushBbuf(false);
    570579                bbuf.clear();
    571             }
     580                bbufIsReadable = false;
     581            }
     582            int thisBatchLen = Math.min(off + len - pos, bbuf.remaining());
     583            bbuf.put(b, pos, thisBatchLen);
     584            pos += thisBatchLen;
     585            bbufIsDirty = true;
    572586        }
    573587    }
Note: See TracChangeset for help on using the changeset viewer.