1
1
using System ;
2
2
using System . IO ;
3
+ using LibGit2Sharp . Core . Handles ;
3
4
4
5
namespace LibGit2Sharp . Core
5
6
{
@@ -10,6 +11,9 @@ internal class GitBufWriteStream : Stream
10
11
internal GitBufWriteStream ( IntPtr gitBufPointer )
11
12
{
12
13
this . gitBufPointer = gitBufPointer ;
14
+
15
+ //Preallocate the buffer
16
+ Proxy . git_buf_grow ( gitBufPointer , 1024 ) ;
13
17
}
14
18
15
19
public override void Flush ( )
@@ -33,9 +37,31 @@ public override int Read(byte[] buffer, int offset, int count)
33
37
34
38
public override void Write ( byte [ ] buffer , int offset , int count )
35
39
{
40
+ AutoGrowBuffer ( count ) ;
41
+
36
42
Proxy . git_buf_put ( gitBufPointer , buffer , offset , count ) ;
37
43
}
38
44
45
+ private void AutoGrowBuffer ( int count )
46
+ {
47
+ var gitBuf = gitBufPointer . MarshalAs < GitBuf > ( ) ;
48
+
49
+ var asize = ( uint ) gitBuf . asize ;
50
+ var size = ( uint ) gitBuf . size ;
51
+
52
+ var isBufferLargeEnoughToHoldTheNewData = ( asize - size ) > count ;
53
+ var filledBufferPercentage = ( 100.0 * size / asize ) ;
54
+
55
+ if ( isBufferLargeEnoughToHoldTheNewData && filledBufferPercentage < 90 )
56
+ {
57
+ return ;
58
+ }
59
+
60
+ var targetSize = ( uint ) ( 1.5 * ( asize + count ) ) ;
61
+
62
+ Proxy . git_buf_grow ( gitBufPointer , targetSize ) ;
63
+ }
64
+
39
65
public override bool CanRead
40
66
{
41
67
get { return false ; }
0 commit comments