[sgen] Extract entry stream code into new file
[mono.git] / tools / sgen / sgen-entry-stream.c
1 /*
2  * sgen-entry-stream.c: EntryStream implementation
3  *
4  * Copyright (C) 2016 Xamarin Inc
5  *
6  * Licensed under the MIT license. See LICENSE file in the project root for full license information.
7  */
8
9 #include <stdlib.h>
10 #include <unistd.h>
11 #include <glib.h>
12 #include "sgen-entry-stream.h"
13
14 #define BUFFER_SIZE (1 << 20)
15
16 void
17 init_stream (EntryStream *stream, int file)
18 {
19         stream->file = file;
20         stream->buffer = g_malloc0 (BUFFER_SIZE);
21         stream->end = stream->buffer + BUFFER_SIZE;
22         stream->pos = stream->end;
23 }
24
25 void
26 close_stream (EntryStream *stream)
27 {
28         g_free (stream->buffer);
29 }
30
31 gboolean
32 refill_stream (EntryStream *in, size_t size)
33 {
34         size_t remainder = in->end - in->pos;
35         ssize_t refilled;
36         g_assert (size > 0);
37         g_assert (in->pos >= in->buffer);
38         if (in->pos + size <= in->end)
39                 return TRUE;
40         memmove (in->buffer, in->pos, remainder);
41         in->pos = in->buffer;
42         refilled = read (in->file, in->buffer + remainder, BUFFER_SIZE - remainder);
43         if (refilled < 0)
44                 return FALSE;
45         g_assert (refilled + remainder <= BUFFER_SIZE);
46         in->end = in->buffer + refilled + remainder;
47         return in->end - in->buffer >= size;
48 }
49
50 ssize_t
51 read_stream (EntryStream *stream, void *out, size_t size)
52 {
53         if (refill_stream (stream, size)) {
54                 memcpy (out, stream->pos, size);
55                 stream->pos += size;
56                 return size;
57         }
58         return 0;
59 }