source: git/Singular/mmpage.c @ da408f

fieker-DuValspielwiese
Last change on this file since da408f was ce9c2d, checked in by Hans Schönemann <hannes@…>, 25 years ago
*hannes: aligne structures git-svn-id: file:///usr/local/Singular/svn/trunk@2874 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.2 1999-02-26 15:32:06 Singular 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#include "mmprivate.h"
16#ifdef HAVE_MALLOC_H
17#include "malloc.h"
18#endif
19
20#include "mmpage.h"
21#include "tok.h" /* needed only for m2_end */
22
23static void* mm_FreePages = NULL;
24static int mm_NumberOfFreePages = 0;
25int mm_bytesValloc = 0;
26
27void* mmGetPage()
28{
29  void* page;
30
31#ifndef PAGE_DEBUG
32  if (mm_FreePages != NULL)
33  {
34    page = mm_FreePages;
35    mm_FreePages = *((void**)mm_FreePages);
36    mm_NumberOfFreePages--;
37  }
38  else
39#endif
40  {
41    page = PALLOC(SIZE_OF_PAGE);
42    if (page == NULL)
43    {
44      (void)fprintf( stderr, "\nerror: no more memory\n" );
45      m2_end(14);
46    }
47     
48#ifdef HAVE_PAGE_ALIGNMENT
49    assume(mmIsAddrPageAligned(page));
50#endif   
51    mm_bytesValloc += SIZE_OF_PAGE;
52  }
53 
54  if (BVERBOSE(V_SHOW_MEM)) mmCheckPrint();
55  return (void*) page;
56}
57
58void mmFreePage(void* page)
59{
60  assume(page != NULL);
61  *((void**)page) = mm_FreePages;
62  mm_FreePages = page;
63  mm_NumberOfFreePages++;
64}
65
66void mmReleaseFreePages()
67{
68#ifndef PAGE_DEBUG
69  void** next;
70 
71  while (mm_FreePages != NULL)
72  {
73    next = *((void**)mm_FreePages);
74    PFREE(mm_FreePages);
75    mm_FreePages = next;
76    mm_bytesValloc -= SIZE_OF_PAGE;
77  }
78  mm_NumberOfFreePages = 0;
79#endif
80}
81
82#ifdef HAVE_PAGE_ALIGNMENT
83int mmIsAddrOnFreePage(void* addr)
84{
85  void* page = mm_FreePages;
86  while (page != NULL)
87  {
88    if (mmIsAddrOnPage(addr, page)) return 1;
89    page = *((void**) page);
90  }
91  return 0;
92}
93#endif
94
95int mmGetNumberOfFreePages()
96{
97  return mm_NumberOfFreePages;
98}
99
100int mmGetNumberOfAllocatedPages()
101{
102  return mm_bytesValloc / SIZE_OF_PAGE;
103}
104
105int mmGetNumberOfUsedPages()
106{
107  return mmGetNumberOfAllocatedPages() - mm_NumberOfFreePages;
108}
109
110   
Note: See TracBrowser for help on using the repository browser.