source: git/factory/mmblock.c @ c74d6a

spielwiese
Last change on this file since c74d6a was 81104e, checked in by Hans Schoenemann <hannes@…>, 14 years ago
wstein: sage ticket 5313: error -> Singular error git-svn-id: file:///usr/local/Singular/svn/trunk@13007 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 1.6 KB
Line 
1/* emacs edit mode for this file is -*- C -*- */
2/* $Id$ */
3
4#define _POSIX_SOURCE 1
5
6#include <config.h>
7
8#include <stdio.h>
9#include <stdlib.h>
10
11#include "memman.h"
12#include "mmprivate.h"
13
14typedef struct memBlock
15{
16    struct memBlock *next;
17    char data[MAXDATA];
18} memBlock;
19
20
21static memBlock * mm_theBlocks = NULL;
22static memBlock * mm_tmpBlocks = NULL;
23static memBlock * mm_normBlocks = NULL;
24
25static status_t mm_blockStatus = MM_NORMAL;
26
27void
28mmInitBlocks( void )
29{
30    mm_theBlocks = mm_tmpBlocks = mm_normBlocks = NULL;
31    mm_blockStatus = MM_NORMAL;
32}
33
34void
35mmMarkBlocks( void )
36{
37    mm_blockStatus = MM_TMP;
38    mm_normBlocks = mm_theBlocks;
39    mm_theBlocks = NULL;
40}
41
42void
43mmSweepBlocks( void )
44{
45    memBlock * dummy;
46
47    while ( mm_tmpBlocks != NULL ) {
48        dummy = mm_tmpBlocks;
49        mm_tmpBlocks = mm_tmpBlocks->next;
50        free( dummy );
51        mm_bytesReal -= sizeof( memBlock );
52    }
53    mmNewPrintMark();
54    mm_tmpBlocks = NULL;
55    mm_theBlocks = mm_normBlocks;
56    mm_blockStatus = MM_NORMAL;
57}
58
59void
60mmSwitchBlocks( void )
61{
62    if ( mm_blockStatus == MM_TMP ) {
63        mm_blockStatus = MM_SWITCHED;
64        mm_tmpBlocks = mm_theBlocks;
65        mm_theBlocks = mm_normBlocks;
66    }
67    else {
68        mm_blockStatus = MM_TMP;
69        mm_normBlocks = mm_theBlocks;
70        mm_theBlocks = mm_tmpBlocks;
71    }
72}
73
74void *
75mmGetBlock( void )
76{
77    memBlock * dummy = (memBlock*)malloc( sizeof( memBlock ) );
78
79    if ( dummy == NULL ) {
80        (void)fprintf( stderr, "\nSingular-Factory error: no more memory\n" );
81        exit(14);
82    }
83    dummy->next = mm_theBlocks;
84    mm_theBlocks = dummy;
85    mm_bytesReal += sizeof( memBlock );
86    return &dummy->data[0];
87}
Note: See TracBrowser for help on using the repository browser.