source: git/Singular/mmpage.c @ f5cda4

fieker-DuValspielwiese
Last change on this file since f5cda4 was 52a5e8, checked in by Olaf Bachmann <obachman@…>, 25 years ago
* new memory management scheme git-svn-id: file:///usr/local/Singular/svn/trunk@2703 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 1.9 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id: mmpage.c,v 1.1 1998-12-02 13:57:35 obachman Exp $ */
5
6/*
7* ABSTRACT:
8*/
9
10#define _POSIX_SOURCE 1
11
12#include <stdio.h>
13#include <stdlib.h>
14#include "mod2.h"
15#ifdef HAVE_MALLOC_H
16#include "malloc.h"
17#endif
18
19#include "mmpage.h"
20#include "tok.h" /* needed only for m2_end */
21
22static void* mm_FreePages = NULL;
23static int mm_NumberOfFreePages = 0;
24int mm_bytesValloc = 0;
25
26void* mmGetPage()
27{
28  void* page;
29
30#ifndef PAGE_DEBUG
31  if (mm_FreePages != NULL)
32  {
33    page = mm_FreePages;
34    mm_FreePages = *((void**)mm_FreePages);
35    mm_NumberOfFreePages--;
36  }
37  else
38#endif
39  {
40    page = PALLOC(SIZE_OF_PAGE);
41    if (page == NULL)
42    {
43      (void)fprintf( stderr, "\nerror: no more memory\n" );
44      m2_end(14);
45    }
46     
47#ifdef HAVE_PAGE_ALIGNMENT
48    assume(mmIsAddrPageAligned(page));
49#endif   
50    mm_bytesValloc += SIZE_OF_PAGE;
51  }
52 
53  if (BVERBOSE(V_SHOW_MEM)) mmCheckPrint();
54  return (void*) page;
55}
56
57void mmFreePage(void* page)
58{
59  assume(page != NULL);
60  *((void**)page) = mm_FreePages;
61  mm_FreePages = page;
62  mm_NumberOfFreePages++;
63}
64
65void mmReleaseFreePages()
66{
67#ifndef PAGE_DEBUG
68  void** next;
69 
70  while (mm_FreePages != NULL)
71  {
72    next = *((void**)mm_FreePages);
73    PFREE(mm_FreePages);
74    mm_FreePages = next;
75    mm_bytesValloc -= SIZE_OF_PAGE;
76  }
77  mm_NumberOfFreePages = 0;
78#endif
79}
80
81#ifdef HAVE_PAGE_ALIGNMENT
82int mmIsAddrOnFreePage(void* addr)
83{
84  void* page = mm_FreePages;
85  while (page != NULL)
86  {
87    if (mmIsAddrOnPage(addr, page)) return 1;
88    page = *((void**) page);
89  }
90  return 0;
91}
92#endif
93
94int mmGetNumberOfFreePages()
95{
96  return mm_NumberOfFreePages;
97}
98
99int mmGetNumberOfAllocatedPages()
100{
101  return mm_bytesValloc / SIZE_OF_PAGE;
102}
103
104int mmGetNumberOfUsedPages()
105{
106  return mmGetNumberOfAllocatedPages() - mm_NumberOfFreePages;
107}
108
109   
Note: See TracBrowser for help on using the repository browser.