Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/trunk/src/runtime/gc/heap-in-util.c
ViewVC logotype

Annotation of /sml/trunk/src/runtime/gc/heap-in-util.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 651 - (view) (download) (as text)

1 : monnier 249 /* heap-in-util.c
2 :     *
3 :     * COPYRIGHT (c) 1993 by AT&T Bell Laboratories.
4 :     *
5 :     * Utility routines to import an ML heap image.
6 :     */
7 :    
8 :     #include "ml-base.h"
9 :     #include "heap.h"
10 :     #include "ml-values.h"
11 :     #include "ml-heap-image.h"
12 :     #include "c-globals-tbl.h"
13 :     #include "heap-input.h"
14 :    
15 :     /* local routines */
16 :     PVT status_t ReadBlock (FILE *file, void *blk, long len);
17 :    
18 :    
19 :     /* HeapIO_ReadExterns:
20 :     */
21 :     ml_val_t *HeapIO_ReadExterns (inbuf_t *bp)
22 :     {
23 :     extern_tbl_hdr_t hdr;
24 :     ml_val_t *externs;
25 :     Byte_t *buf, *cp;
26 :     int i;
27 :    
28 :     /* Read the header */
29 :     HeapIO_ReadBlock(bp, &(hdr), sizeof(hdr));
30 :    
31 :     externs = NEW_VEC(ml_val_t, hdr.numExterns);
32 :    
33 :     /* Read in the names of the exported symbols */
34 :     buf = NEW_VEC(Byte_t, hdr.externSzB);
35 :     HeapIO_ReadBlock (bp, buf, hdr.externSzB);
36 :    
37 :     /* map the names of the external symbols to addresses in the run-time system */
38 :     for (cp = buf, i = 0; i < hdr.numExterns; i++) {
39 :     if ((externs[i] = ImportCSymbol ((char *)cp)) == ML_unit)
40 :     Die ("Run-time system does not provide \"%s\"", cp);
41 :     cp += (strlen(cp) + 1);
42 :     }
43 :     FREE (buf);
44 :    
45 :     return externs;
46 :    
47 :     } /* end of HeapIO_ReadExterns */
48 :    
49 :    
50 :     /* HeapIO_Seek:
51 :     *
52 :     * Adjust the next character position to the given position in the
53 :     * input stream.
54 :     */
55 :     status_t HeapIO_Seek (inbuf_t *bp, long offset)
56 :     {
57 :     if (bp->file == NULL) {
58 :     /* the stream is in-memory */
59 :     Byte_t *newPos = bp->base + offset;
60 :     if (bp->buf + bp->nbytes <= newPos)
61 :     return FAILURE;
62 :     else {
63 :     bp->nbytes -= (newPos - bp->buf);
64 :     bp->buf = newPos;
65 :     return SUCCESS;
66 :     }
67 :     }
68 :     else {
69 :     Die ("HeapIO_Seek");
70 :     }
71 :    
72 :     } /* end of HeapIO_Seek */
73 :    
74 :    
75 :     /* HeapIO_ReadBlock:
76 :     */
77 :     status_t HeapIO_ReadBlock (inbuf_t *bp, void *blk, long len)
78 :     {
79 :     status_t sts = SUCCESS;
80 :    
81 :     if (bp->nbytes == 0) {
82 :     if (bp->file != NULL)
83 :     sts = ReadBlock (bp->file, blk, len);
84 :     else {
85 :     Error ("missing data in memory blast object");
86 :     return FAILURE;
87 :     }
88 :     }
89 :     else if (bp->nbytes >= len) {
90 :     memcpy (blk, bp->buf, len);
91 :     bp->nbytes -= len;
92 :     bp->buf += len;
93 :     }
94 :     else {
95 :     memcpy (blk, bp->buf, bp->nbytes);
96 :     sts = ReadBlock (bp->file, ((Byte_t *)blk) + bp->nbytes, len - bp->nbytes);
97 :     bp->nbytes = 0;
98 :     }
99 :    
100 :     if (bp->needsSwap) {
101 :     Die ("byte-swapping not implemented yet");
102 :     }
103 :    
104 :     return sts;
105 :    
106 :     } /* end of HeapIO_ReadBlock */
107 :    
108 :     /* ReadBlock:
109 :     */
110 :     PVT status_t ReadBlock (FILE *file, void *blk, long len)
111 :     {
112 :     int sts;
113 :     Byte_t *bp = (Byte_t *)blk;
114 :    
115 :     while (len > 0) {
116 :     sts = fread (bp, 1, len, file);
117 :     len -= sts;
118 :     bp += sts;
119 :     if ((sts < len) && (ferror(file) || feof(file))) {
120 :     Error ("unable to read %d bytes from image\n", len);
121 :     return FAILURE;
122 :     }
123 :     }
124 :    
125 :     return SUCCESS;
126 :    
127 :     } /* end of ReadBlock. */

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0