source: branches/profile/ISLAND_HOPPING/mem.cxx

Last change on this file was 8748, checked in by westram, 7 years ago
  • use simpler way to declare attributed static/inline functions
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 2.4 KB
Line 
1// =============================================================
2/*                                                               */
3//   File      : mem.c
4//   Purpose   :
5/*                                                               */
6//   Institute of Microbiology (Technical University Munich)
7//   http://www.arb-home.de/
8/*                                                               */
9// =============================================================
10
11#include "mem.h"
12#include <stdio.h>
13#include <attributes.h>
14
15#define MINSIZE 72 // >= sizeof(Node)
16
17static void *M=NULL,*D=NULL;
18static size_t A=0;
19
20// ==========================================================================
21
22static void clearUp(void) { void *v;
23    while(D) {v=D; D=((void **)v)[0]; free(v);}
24    while(M) {v=M; M=((void **)v)[0]; free(v);}
25}
26
27// ==========================================================================
28
29__ATTR__NORETURN static void outOfMemory(void) {
30    fprintf(stdout,"\n!!! Out of Memory\n");
31    clearUp();
32    exit(EXIT_FAILURE);
33}
34
35// ==========================================================================
36
37
38void *newBlock(size_t s) {
39    void *v; size_t S;
40
41    if(D&&s<=MINSIZE) {
42        v=D; D=((void **)v)[0];
43    }
44    else {
45        S=((s<=MINSIZE)?MINSIZE:s)+3*sizeof(void *);
46        v=malloc(S);
47        if(v==NULL) outOfMemory();
48        A+=S;
49    }
50
51    if(M) ((void **)M)[1]=v;
52    ((void **)v)[0]=M; M=v;
53    ((void **)v)[1]=NULL;
54    ((void **)v)[2]=(void *)s;
55
56
57    return(((void **)v)+3);
58}
59
60//........
61
62void freeBlock_(void **vv) {
63    void *v; size_t s;
64
65    v=(void *)(((void **)(*vv))-3);
66
67    if(((void **)v)[0]) ((void ***)v)[0][1]=((void **)v)[1];
68    if(((void **)v)[1]) ((void ***)v)[1][0]=((void **)v)[0];
69    else                M=((void **)v)[0];
70
71    s=(size_t)(((void **)v)[2]);
72
73    if(s<=MINSIZE) {
74        ((void **)v)[0]=D; D=v;
75    }
76    else {
77        A-=s+3*sizeof(void *);
78        free(v);
79    }
80
81    *vv=NULL;
82}
83
84// ==========================================================================
85
86void **newMatrix(size_t nrow,size_t ncol,size_t s) {
87    size_t i,p;
88    void **m;
89
90    m=(void **)newBlock(nrow*sizeof(void *));
91
92    p=ncol*s; for(i=0;i<nrow;i++) m[i]=newBlock(p);
93
94    return(m);
95}
96
97//........
98
99void freeMatrix_(void ***mm) {
100    void **m; size_t i,rows;
101
102    m=*mm;
103    rows=((size_t)m[-1])/sizeof(void *);
104    for(i=0;i<rows;i++) freeBlock(m+i);
105    freeBlock((void **)mm);
106
107}
Note: See TracBrowser for help on using the repository browser.