/[cmucl]/src/lisp/sunos-os.c
ViewVC logotype

Diff of /src/lisp/sunos-os.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.1 by wlott, Tue Sep 8 20:32:23 1992 UTC revision 1.2 by ram, Mon Oct 24 19:17:10 1994 UTC
# Line 32  Line 32 
32  #define EMPTYFILE "/tmp/empty"  #define EMPTYFILE "/tmp/empty"
33  #define ZEROFILE "/dev/zero"  #define ZEROFILE "/dev/zero"
34    
35  #define MAX_SEGS 64  #define INITIAL_MAX_SEGS 32
36    #define GROW_MAX_SEGS 16
37    
38  extern char *getenv();  extern char *getenv();
39    
# Line 48  static struct segment { Line 49  static struct segment {
49      long file_offset;      long file_offset;
50      short mapped_fd;      short mapped_fd;
51      short protection;      short protection;
52  } addr_map[MAX_SEGS];  } *segments;
53    
54  static int n_segments=0;  static int n_segments=0, max_segments=0;
55    
56  static int zero_fd=(-1), empty_fd=(-1);  static int zero_fd=(-1), empty_fd=(-1);
57    
58  static os_vm_address_t last_fault=0;  static os_vm_address_t last_fault=0;
59  static os_vm_size_t real_page_size_difference=0;  static os_vm_size_t real_page_size_difference=0;
60    
61    static void os_init_bailout(arg)
62    char *arg;
63    {
64        char buf[500];
65        sprintf(buf,"os_init: %s",arg);
66        perror(buf);
67        exit(1);
68    }
69    
70  void os_init()  void os_init()
71  {  {
72      char *empty_file=getenv("CMUCL_EMPTYFILE");      char *empty_file=getenv("CMUCL_EMPTYFILE");
# Line 65  void os_init() Line 75  void os_init()
75          empty_file=EMPTYFILE;          empty_file=EMPTYFILE;
76    
77      empty_fd=open(empty_file,O_RDONLY|O_CREAT);      empty_fd=open(empty_file,O_RDONLY|O_CREAT);
78        if(empty_fd<0)
79            os_init_bailout(empty_file);
80      unlink(empty_file);      unlink(empty_file);
81    
82      zero_fd=open(ZEROFILE,O_RDONLY);      zero_fd=open(ZEROFILE,O_RDONLY);
83        if(zero_fd<0)
84            os_init_bailout(ZEROFILE);
85    
86      os_vm_page_size=getpagesize();      os_vm_page_size=getpagesize();
87    
88        max_segments=INITIAL_MAX_SEGS;
89        segments=(struct segment *)malloc(sizeof(struct segment)*max_segments);
90        if(segments==NULL){
91            fprintf(stderr,"os_init: Couldn't allocate %d segment descriptors\n",
92                    max_segments);
93            exit(1);
94        }
95    
96      if(os_vm_page_size>OS_VM_DEFAULT_PAGESIZE){      if(os_vm_page_size>OS_VM_DEFAULT_PAGESIZE){
97          fprintf(stderr,"os_init: Pagesize too large (%d > %d)\n",          fprintf(stderr,"os_init: Pagesize too large (%d > %d)\n",
98                  os_vm_page_size,OS_VM_DEFAULT_PAGESIZE);                  os_vm_page_size,OS_VM_DEFAULT_PAGESIZE);
# Line 120  int mapped_fd; Line 142  int mapped_fd;
142      if(len==0)      if(len==0)
143          return NULL;          return NULL;
144    
145      if(n_segments==MAX_SEGS){      if(n_segments==max_segments){
146          fprintf(stderr,"seg_create_nomerge: Out of segments\n");          struct segment *new_segs;
147          return NULL;  
148            max_segments+=GROW_MAX_SEGS;
149    
150            new_segs=(struct segment *)
151                realloc(segments,max_segments*sizeof(struct segment));
152    
153            if(new_segs==NULL){
154                fprintf(stderr,
155                        "seg_create_nomerge: Couldn't grow segment descriptor table to %s segments\n",
156                        max_segments);
157                max_segments-=GROW_MAX_SEGS;
158                return NULL;
159            }
160    
161            segments=new_segs;
162      }      }
163    
164      for(n=n_segments, seg=addr_map; n>0; n--, seg++)      for(n=n_segments, seg=segments; n>0; n--, seg++)
165          if(addr<seg->start){          if(addr<seg->start){
166              seg=(&addr_map[n_segments]);              seg=(&segments[n_segments]);
167              while(n-->0){              while(n-->0){
168                  seg[0]=seg[-1];                  seg[0]=seg[-1];
169                  seg--;                  seg--;
# Line 146  int mapped_fd; Line 182  int mapped_fd;
182      return seg;      return seg;
183  }  }
184    
185    #if 1
186  /* returns the first segment containing addr */  /* returns the first segment containing addr */
187  static struct segment *seg_find(addr)  static struct segment *seg_find(addr)
188  os_vm_address_t addr;  os_vm_address_t addr;
# Line 153  os_vm_address_t addr; Line 190  os_vm_address_t addr;
190      int n;      int n;
191      struct segment *seg;      struct segment *seg;
192    
193      for(n=n_segments, seg=addr_map; n>0; n--, seg++)      for(n=n_segments, seg=segments; n>0; n--, seg++)
194          if(seg->start<=addr && seg->start+seg->length>addr)          if(seg->start<=addr && seg->start+seg->length>addr)
195              return seg;              return seg;
196    
197      return NULL;      return NULL;
198  }  }
199    #else
200    /* returns the first segment containing addr */
201    static struct segment *seg_find(addr)
202    os_vm_address_t addr;
203    {
204        /* does a binary search */
205        struct segment *lo=segments, *hi=segments+n_segments;
206    
207        while(hi>lo){
208            struct segment *mid=lo+((hi-lo)>>1);
209            os_vm_address_t start=mid->start;
210    
211            if(addr>=start && addr<start+mid->length)
212                return mid;
213            else if(addr<start)
214                hi=mid;
215            else
216                lo=mid+1;
217        }
218    
219        return NULL;
220    }
221    #endif
222    
223  /* returns TRUE if the range from addr to addr+len intersects with any segment */  /* returns TRUE if the range from addr to addr+len intersects with any segment */
224  static boolean collides_with_seg_p(addr,len)  static boolean collides_with_seg_p(addr,len)
# Line 169  os_vm_size_t len; Line 229  os_vm_size_t len;
229      struct segment *seg;      struct segment *seg;
230      os_vm_address_t end=addr+len;      os_vm_address_t end=addr+len;
231    
232      for(n=n_segments, seg=addr_map; n>0; n--, seg++)      for(n=n_segments, seg=segments; n>0; n--, seg++)
233          if(seg->start>=end)          if(seg->start>=end)
234              return FALSE;              return FALSE;
235          else if(seg->start+seg->length>addr)          else if(seg->start+seg->length>addr)
# Line 178  os_vm_size_t len; Line 238  os_vm_size_t len;
238      return FALSE;      return FALSE;
239  }  }
240    
241  #define seg_last_p(seg) (((seg)-addr_map)>=n_segments-1)  #define seg_last_p(seg) (((seg)-segments)>=n_segments-1)
242    
243  static void seg_destroy(seg)  static void seg_destroy(seg)
244  struct segment *seg;  struct segment *seg;
# Line 186  struct segment *seg; Line 246  struct segment *seg;
246      if(seg!=NULL){      if(seg!=NULL){
247          int n;          int n;
248    
249          for(n=seg-addr_map+1; n<n_segments; n++){          for(n=seg-segments+1; n<n_segments; n++){
250              seg[0]=seg[1];              seg[0]=seg[1];
251              seg++;              seg++;
252          }          }
# Line 236  struct segment *seg; Line 296  struct segment *seg;
296  {  {
297      if(!seg_last_p(seg))      if(!seg_last_p(seg))
298          seg_try_merge_next(seg);          seg_try_merge_next(seg);
299      if(seg>addr_map)      if(seg>segments)
300          seg_try_merge_next(seg-1);          seg_try_merge_next(seg-1);
301  }  }
302    

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.2

  ViewVC Help
Powered by ViewVC 1.1.5