Initial revision
This commit is contained in:
parent
8addf6e9a5
commit
26326c178e
39
modules/src/Action
Normal file
39
modules/src/Action
Normal file
|
@ -0,0 +1,39 @@
|
|||
name "system-call interface module"
|
||||
dir system
|
||||
end
|
||||
name "string routines module"
|
||||
dir string
|
||||
end
|
||||
name "formatted print module"
|
||||
dir print
|
||||
end
|
||||
name "assertion module"
|
||||
dir assert
|
||||
end
|
||||
name "memory allocation module"
|
||||
dir alloc
|
||||
end
|
||||
name "fast, wasting malloc"
|
||||
dir Xmalloc
|
||||
end
|
||||
name "fast, memory efficient malloc"
|
||||
dir malloc
|
||||
end
|
||||
name "EM messages generation module"
|
||||
dir em_mes
|
||||
end
|
||||
name "identifier table module"
|
||||
dir idf
|
||||
end
|
||||
name "input module"
|
||||
dir input
|
||||
end
|
||||
name "ACK-object reading and writing module"
|
||||
dir object
|
||||
end
|
||||
name "EM-code reading module"
|
||||
dir read_em
|
||||
end
|
||||
name "EM code generation module"
|
||||
dir em_code
|
||||
end
|
21
modules/src/Xmalloc/Makefile
Normal file
21
modules/src/Xmalloc/Makefile
Normal file
|
@ -0,0 +1,21 @@
|
|||
EMHOME=../../..
|
||||
HDIR = $(EMHOME)/modules/h
|
||||
INSTALL=$(EMHOME)/modules/install
|
||||
COMPARE=$(EMHOME)/modules/compare
|
||||
|
||||
CFLAGS = -O -I$(HDIR)
|
||||
|
||||
SOURCES = Xmalloc.c
|
||||
|
||||
OBJECTS = Xmalloc.o
|
||||
|
||||
all: $(OBJECTS)
|
||||
|
||||
install: all
|
||||
$(INSTALL) lib/Xmalloc.o
|
||||
|
||||
compare: all
|
||||
$(COMPARE) lib/Xmalloc.o
|
||||
|
||||
clean:
|
||||
rm -f *.[oa]
|
142
modules/src/Xmalloc/Xmalloc.c
Normal file
142
modules/src/Xmalloc/Xmalloc.c
Normal file
|
@ -0,0 +1,142 @@
|
|||
/* M E M O R Y A L L O C A T I O N R O U T I N E S */
|
||||
|
||||
/* The reason for having own memory allocation routines (malloc(),
|
||||
realloc() and free()) is plain: the garbage collection performed by
|
||||
the library functions malloc(), realloc() and free() costs a lot of
|
||||
time, while in most cases (on a VAX) the freeing and reallocation of
|
||||
memory is not necessary.
|
||||
The (basic) memory allocating routines offered by this memory
|
||||
handling package are:
|
||||
|
||||
char *malloc(n) : allocate n bytes
|
||||
char *realloc(ptr, n) : reallocate buffer to n bytes
|
||||
(works only if ptr was last allocated)
|
||||
free(ptr) : if ptr points to last allocated
|
||||
memory, this memory is re-allocatable
|
||||
|
||||
This module imports routines from "system", an assertion macro,
|
||||
and the compile-time
|
||||
constants ALIGNBITS, ALLOCSIZ, DEBUG.
|
||||
ALIGNBITS is an integer constant defining suitable alignment,
|
||||
ALLOCSIZ is the size of the chunks of memory asked from the system,
|
||||
DEBUG enables the assertions.
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <system.h>
|
||||
|
||||
#ifndef ALIGNBITS
|
||||
#define ALIGNBITS 07
|
||||
#endif
|
||||
|
||||
#ifndef ALLOCSIZ
|
||||
#define ALLOCSIZ 4096
|
||||
#endif
|
||||
|
||||
/* the following variables are used for book-keeping */
|
||||
static int nfreebytes = 0; /* # free bytes in sys_break-ed space */
|
||||
static char *freeb = 0; /* pointer to first free byte */
|
||||
static char *lastalloc; /* pointer to last malloced sp */
|
||||
static int lastnbytes; /* nr of bytes in last allocated space */
|
||||
static char *firstfreeb; /* pointer to first ever free byte */
|
||||
|
||||
#define ALIGN(m) (((m)&ALIGNBITS)? (m)+((1+ALIGNBITS)-((m)&ALIGNBITS)):(m))
|
||||
|
||||
char *sys_break();
|
||||
|
||||
char *
|
||||
malloc(n)
|
||||
unsigned int n;
|
||||
{
|
||||
/* malloc() is a very simple malloc().
|
||||
*/
|
||||
|
||||
n = ALIGN(n);
|
||||
if (nfreebytes < n) {
|
||||
register int nbts = (n <= ALLOCSIZ) ? ALLOCSIZ : n;
|
||||
|
||||
if (!nfreebytes) {
|
||||
if (!firstfreeb) {
|
||||
/* We arrive here the first time malloc is
|
||||
called
|
||||
*/
|
||||
int diff;
|
||||
|
||||
if (!(freeb = sys_break(0))) return 0;
|
||||
if ((diff = (int)((long)freeb&ALIGNBITS))!=0) {
|
||||
/* align memory to ALIGNBITS ... */
|
||||
diff = (1 + ALIGNBITS) - diff;
|
||||
if (!(freeb = sys_break(diff))) {
|
||||
return 0;
|
||||
}
|
||||
freeb += diff;
|
||||
assert(((long)freeb & ALIGNBITS) == 0);
|
||||
}
|
||||
firstfreeb = freeb;
|
||||
}
|
||||
if (!(freeb = sys_break(nbts))) return 0;
|
||||
}
|
||||
else {
|
||||
if (!sys_break(nbts)) return 0;
|
||||
}
|
||||
nfreebytes += nbts;
|
||||
}
|
||||
lastalloc = freeb;
|
||||
freeb = lastalloc + n;
|
||||
lastnbytes = n;
|
||||
nfreebytes -= n;
|
||||
return lastalloc;
|
||||
}
|
||||
|
||||
char *
|
||||
realloc(ptr, n)
|
||||
char *ptr;
|
||||
unsigned int n;
|
||||
{
|
||||
/* realloc() is designed to append more bytes to the latest
|
||||
allocated piece of memory.
|
||||
*/
|
||||
register int nbytes = n;
|
||||
|
||||
if (!ptr || ptr != lastalloc) { /* security */
|
||||
return 0;
|
||||
}
|
||||
nbytes -= lastnbytes; /* # bytes required */
|
||||
if (nbytes == 0) { /* no extra bytes */
|
||||
return lastalloc;
|
||||
}
|
||||
|
||||
/* if nbytes < 0: free last allocated bytes;
|
||||
if nbytes > 0: allocate more bytes
|
||||
*/
|
||||
if (nbytes > 0) nbytes = ALIGN(nbytes);
|
||||
if (nfreebytes < nbytes) {
|
||||
register int nbts = (nbytes < ALLOCSIZ) ? ALLOCSIZ : nbytes;
|
||||
if (!sys_break(nbts)) return 0;
|
||||
nfreebytes += nbts;
|
||||
}
|
||||
freeb += nbytes; /* less bytes */
|
||||
lastnbytes += nbytes; /* change nr of last all. bytes */
|
||||
nfreebytes -= nbytes; /* less or more free bytes */
|
||||
return lastalloc;
|
||||
}
|
||||
|
||||
free(p)
|
||||
char *p;
|
||||
{
|
||||
if (lastalloc && lastalloc == p) {
|
||||
nfreebytes += lastnbytes;
|
||||
freeb = lastalloc;
|
||||
lastnbytes = 0;
|
||||
lastalloc = 0;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
mem_stat()
|
||||
{
|
||||
|
||||
printf("Total nr of bytes allocated: %d\n",
|
||||
sys_break(0) - firstfreeb);
|
||||
}
|
||||
#endif DEBUG
|
Loading…
Reference in a new issue