comparison src/org/tmatesoft/hg/repo/HgDataFile.java @ 619:868b2ffdcd5c

Close FIS, not FileChannel, to clear both references to FileDescriptor right away
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Fri, 17 May 2013 22:04:23 +0200
parents e1b29756f901
children 99ad1e3a4e4d
comparison
equal deleted inserted replaced
618:7c0d2ce340b8 619:868b2ffdcd5c
18 18
19 import static org.tmatesoft.hg.core.HgIterateDirection.OldToNew; 19 import static org.tmatesoft.hg.core.HgIterateDirection.OldToNew;
20 import static org.tmatesoft.hg.repo.HgInternals.wrongRevisionIndex; 20 import static org.tmatesoft.hg.repo.HgInternals.wrongRevisionIndex;
21 import static org.tmatesoft.hg.repo.HgRepository.*; 21 import static org.tmatesoft.hg.repo.HgRepository.*;
22 import static org.tmatesoft.hg.util.LogFacility.Severity.Info; 22 import static org.tmatesoft.hg.util.LogFacility.Severity.Info;
23 import static org.tmatesoft.hg.util.LogFacility.Severity.Warn;
24 23
25 import java.io.File; 24 import java.io.File;
26 import java.io.FileInputStream; 25 import java.io.FileInputStream;
27 import java.io.IOException; 26 import java.io.IOException;
28 import java.nio.ByteBuffer; 27 import java.nio.ByteBuffer;
35 import org.tmatesoft.hg.core.Nodeid; 34 import org.tmatesoft.hg.core.Nodeid;
36 import org.tmatesoft.hg.internal.BlameHelper; 35 import org.tmatesoft.hg.internal.BlameHelper;
37 import org.tmatesoft.hg.internal.DataAccess; 36 import org.tmatesoft.hg.internal.DataAccess;
38 import org.tmatesoft.hg.internal.FileHistory; 37 import org.tmatesoft.hg.internal.FileHistory;
39 import org.tmatesoft.hg.internal.FileRevisionHistoryChunk; 38 import org.tmatesoft.hg.internal.FileRevisionHistoryChunk;
39 import org.tmatesoft.hg.internal.FileUtils;
40 import org.tmatesoft.hg.internal.FilterByteChannel; 40 import org.tmatesoft.hg.internal.FilterByteChannel;
41 import org.tmatesoft.hg.internal.FilterDataAccess; 41 import org.tmatesoft.hg.internal.FilterDataAccess;
42 import org.tmatesoft.hg.internal.Internals; 42 import org.tmatesoft.hg.internal.Internals;
43 import org.tmatesoft.hg.internal.Metadata; 43 import org.tmatesoft.hg.internal.Metadata;
44 import org.tmatesoft.hg.internal.RevlogStream; 44 import org.tmatesoft.hg.internal.RevlogStream;
45 import org.tmatesoft.hg.repo.HgBlameInspector;
46 import org.tmatesoft.hg.util.ByteChannel; 45 import org.tmatesoft.hg.util.ByteChannel;
47 import org.tmatesoft.hg.util.CancelSupport; 46 import org.tmatesoft.hg.util.CancelSupport;
48 import org.tmatesoft.hg.util.CancelledException; 47 import org.tmatesoft.hg.util.CancelledException;
49 import org.tmatesoft.hg.util.LogFacility; 48 import org.tmatesoft.hg.util.LogFacility;
50 import org.tmatesoft.hg.util.Pair; 49 import org.tmatesoft.hg.util.Pair;
166 final ProgressSupport progress = ProgressSupport.Factory.get(sink); 165 final ProgressSupport progress = ProgressSupport.Factory.get(sink);
167 final long flength = f.length(); 166 final long flength = f.length();
168 final int bsize = (int) Math.min(flength, 32*1024); 167 final int bsize = (int) Math.min(flength, 32*1024);
169 progress.start((int) (flength > Integer.MAX_VALUE ? flength >>> 15 /*32 kb buf size*/ : flength)); 168 progress.start((int) (flength > Integer.MAX_VALUE ? flength >>> 15 /*32 kb buf size*/ : flength));
170 ByteBuffer buf = ByteBuffer.allocate(bsize); 169 ByteBuffer buf = ByteBuffer.allocate(bsize);
171 FileChannel fc = null; 170 FileInputStream fis = null;
172 try { 171 try {
173 fc = new FileInputStream(f).getChannel(); 172 fis = new FileInputStream(f);
173 FileChannel fc = fis.getChannel();
174 while (fc.read(buf) != -1) { 174 while (fc.read(buf) != -1) {
175 cs.checkCancelled(); 175 cs.checkCancelled();
176 buf.flip(); 176 buf.flip();
177 int consumed = sink.write(buf); 177 int consumed = sink.write(buf);
178 progress.worked(flength > Integer.MAX_VALUE ? 1 : consumed); 178 progress.worked(flength > Integer.MAX_VALUE ? 1 : consumed);
180 } 180 }
181 } catch (IOException ex) { 181 } catch (IOException ex) {
182 throw new HgInvalidFileException("Working copy read failed", ex, f); 182 throw new HgInvalidFileException("Working copy read failed", ex, f);
183 } finally { 183 } finally {
184 progress.done(); 184 progress.done();
185 if (fc != null) { 185 if (fis != null) {
186 try { 186 new FileUtils(getRepo().getSessionContext().getLog()).closeQuietly(fis);
187 fc.close();
188 } catch (IOException ex) {
189 getRepo().getSessionContext().getLog().dump(getClass(), Warn, ex, null);
190 }
191 } 187 }
192 } 188 }
193 } else { 189 } else {
194 Nodeid fileRev = getWorkingCopyRevision(); 190 Nodeid fileRev = getWorkingCopyRevision();
195 if (fileRev == null) { 191 if (fileRev == null) {