From ed2e0e57be785854547117b52a5d2e62839ec149 Mon Sep 17 00:00:00 2001 From: TuDatTr Date: Thu, 14 Jan 2021 15:30:36 +0100 Subject: [PATCH] =?UTF-8?q?Added=20code=20from=20textbook=20(Pearson=20R.?= =?UTF-8?q?=20Bryant=20=E2=80=93=20D.=20O=E2=80=99Hallaron.=20Computer=20S?= =?UTF-8?q?ystems:=20A=20Programmer=E2=80=99s=20Perspective.3rd=20Edition,?= =?UTF-8?q?=20Pearson,=202003.)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 2 +- TAGS | 274 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ mdriver | Bin 0 -> 143740 bytes mm.c | 163 +++++++++++++++++++++++++++++++-- 4 files changed, 431 insertions(+), 8 deletions(-) create mode 100644 TAGS create mode 100755 mdriver diff --git a/Makefile b/Makefile index 26dda13..ce27fd2 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ # Students' Makefile for the Malloc Lab # CC = gcc -CFLAGS = -Wall -O2 -m32 +CFLAGS = -Wall -O2 -m32 -g03 OBJS = mdriver.o mm.o memlib.o fsecs.o fcyc.o clock.o ftimer.o diff --git a/TAGS b/TAGS new file mode 100644 index 0000000..59a5da8 --- /dev/null +++ b/TAGS @@ -0,0 +1,274 @@ +!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/ +!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ +!_TAG_OUTPUT_FILESEP slash /slash or backslash/ +!_TAG_OUTPUT_MODE u-ctags /u-ctags or e-ctags/ +!_TAG_PROGRAM_AUTHOR Universal Ctags Team // +!_TAG_PROGRAM_NAME Universal Ctags /Derived from Exuberant Ctags/ +!_TAG_PROGRAM_URL https://ctags.io/ /official site/ +!_TAG_PROGRAM_VERSION 0.0.0 /a3c87ab5/ +ALIGN mm.c /^#define ALIGN(/;" d file: signature:(size) +ALIGNMENT config.h /^#define ALIGNMENT /;" d +ALIGNMENT mm.c /^#define ALIGNMENT /;" d file: +ALLOC mdriver.c /^ enum {ALLOC, FREE, REALLOC} type; \/* type of request *\/$/;" e enum:__anon19bd20ef0108::__anon19bd20ef0203 file: access:public +AVG_LIBC_THRUPUT config.h /^#define AVG_LIBC_THRUPUT /;" d +CACHE_BLOCK fcyc.c /^#define CACHE_BLOCK /;" d file: +CACHE_BYTES fcyc.c /^#define CACHE_BYTES /;" d file: +CC Makefile /^CC = gcc$/;" m +CFLAGS Makefile /^CFLAGS = -Wall -O2 -m32 -g03$/;" m +CHUNKSIZE mm.c /^#define CHUNKSIZE /;" d file: +CLEAR_CACHE fcyc.c /^#define CLEAR_CACHE /;" d file: +COMPENSATE fcyc.c /^#define COMPENSATE /;" d file: +DEFAULT_TRACEFILES config.h /^#define DEFAULT_TRACEFILES /;" d +DSIZE mm.c /^#define DSIZE /;" d file: +EPSILON fcyc.c /^#define EPSILON /;" d file: +FREE mdriver.c /^ enum {ALLOC, FREE, REALLOC} type; \/* type of request *\/$/;" e enum:__anon19bd20ef0108::__anon19bd20ef0203 file: access:public +FTRP mm.c /^#define FTRP(/;" d file: signature:(bp) +GET mm.c /^#define GET(/;" d file: signature:(p) +GET_ALLOC mm.c /^#define GET_ALLOC(/;" d file: signature:(p) +GET_SIZE mm.c /^#define GET_SIZE(/;" d file: signature:(p) +HDRLINES mdriver.c /^#define HDRLINES /;" d file: +HDRP mm.c /^#define HDRP(/;" d file: signature:(bp) +IS_ALIGNED mdriver.c /^#define IS_ALIGNED(/;" d file: signature:(p) +K fcyc.c /^#define K /;" d file: +KEEP_SAMPLES fcyc.c /^#define KEEP_SAMPLES /;" d file: +KEEP_VALS fcyc.c /^#define KEEP_VALS /;" d file: +LINENUM mdriver.c /^#define LINENUM(/;" d file: signature:(i) +MAX mm.c /^#define MAX(/;" d file: signature:(x,y) +MAXLINE mdriver.c /^#define MAXLINE /;" d file: +MAXSAMPLES fcyc.c /^#define MAXSAMPLES /;" d file: +MAX_ETIME ftimer.c /^#define MAX_ETIME /;" d file: +MAX_HEAP config.h /^#define MAX_HEAP /;" d +Mhz fsecs.c /^static double Mhz; \/* estimated CPU clock frequency *\/$/;" v typeref:typename:double file: +NEVENT clock.c /^#define NEVENT /;" d file: +NEXT_BLKP mm.c /^#define NEXT_BLKP(/;" d file: signature:(bp) +OBJS Makefile /^OBJS = mdriver.o mm.o memlib.o fsecs.o fcyc.o clock.o ftimer.o$/;" m +PACK mm.c /^#define PACK(/;" d file: signature:(size,alloc) +PREV_BLKP mm.c /^#define PREV_BLKP(/;" d file: signature:(bp) +PUT mm.c /^#define PUT(/;" d file: signature:(p,val) +REALLOC mdriver.c /^ enum {ALLOC, FREE, REALLOC} type; \/* type of request *\/$/;" e enum:__anon19bd20ef0108::__anon19bd20ef0203 file: access:public +RECORDTHRESH clock.c /^#define RECORDTHRESH /;" d file: +SIZE_T_SIZE mm.c /^#define SIZE_T_SIZE /;" d file: +THRESHOLD clock.c /^#define THRESHOLD /;" d file: +TRACEDIR config.h /^#define TRACEDIR /;" d +USE_FCYC config.h /^#define USE_FCYC /;" d +USE_GETTOD config.h /^#define USE_GETTOD /;" d +USE_ITIMER config.h /^#define USE_ITIMER /;" d +UTIL_WEIGHT config.h /^#define UTIL_WEIGHT /;" d +WSIZE mm.c /^#define WSIZE /;" d file: +__CONFIG_H_ config.h /^#define __CONFIG_H_$/;" d +__anon19bd20ef0108 mdriver.c /^typedef struct {$/;" s file: +__anon19bd20ef0108::ALLOC mdriver.c /^ enum {ALLOC, FREE, REALLOC} type; \/* type of request *\/$/;" e enum:__anon19bd20ef0108::__anon19bd20ef0203 file: access:public +__anon19bd20ef0108::FREE mdriver.c /^ enum {ALLOC, FREE, REALLOC} type; \/* type of request *\/$/;" e enum:__anon19bd20ef0108::__anon19bd20ef0203 file: access:public +__anon19bd20ef0108::REALLOC mdriver.c /^ enum {ALLOC, FREE, REALLOC} type; \/* type of request *\/$/;" e enum:__anon19bd20ef0108::__anon19bd20ef0203 file: access:public +__anon19bd20ef0108::__anon19bd20ef0203 mdriver.c /^ enum {ALLOC, FREE, REALLOC} type; \/* type of request *\/$/;" g struct:__anon19bd20ef0108 file: access:public +__anon19bd20ef0108::index mdriver.c /^ int index; \/* index for free() to use later *\/$/;" m struct:__anon19bd20ef0108 typeref:typename:int file: access:public +__anon19bd20ef0108::size mdriver.c /^ int size; \/* byte size of alloc\/realloc request *\/$/;" m struct:__anon19bd20ef0108 typeref:typename:int file: access:public +__anon19bd20ef0108::type mdriver.c /^ enum {ALLOC, FREE, REALLOC} type; \/* type of request *\/$/;" m struct:__anon19bd20ef0108 typeref:enum:__anon19bd20ef0108::__anon19bd20ef0203 file: access:public +__anon19bd20ef0203 mdriver.c /^ enum {ALLOC, FREE, REALLOC} type; \/* type of request *\/$/;" g struct:__anon19bd20ef0108 file: access:public +__anon19bd20ef0308 mdriver.c /^typedef struct {$/;" s file: +__anon19bd20ef0308::block_sizes mdriver.c /^ size_t *block_sizes; \/* ... and a corresponding array of payload sizes *\/$/;" m struct:__anon19bd20ef0308 typeref:typename:size_t * file: access:public +__anon19bd20ef0308::blocks mdriver.c /^ char **blocks; \/* array of ptrs returned by malloc\/realloc... *\/$/;" m struct:__anon19bd20ef0308 typeref:typename:char ** file: access:public +__anon19bd20ef0308::num_ids mdriver.c /^ int num_ids; \/* number of alloc\/realloc ids *\/$/;" m struct:__anon19bd20ef0308 typeref:typename:int file: access:public +__anon19bd20ef0308::num_ops mdriver.c /^ int num_ops; \/* number of distinct requests *\/$/;" m struct:__anon19bd20ef0308 typeref:typename:int file: access:public +__anon19bd20ef0308::ops mdriver.c /^ traceop_t *ops; \/* array of requests *\/$/;" m struct:__anon19bd20ef0308 typeref:typename:traceop_t * file: access:public +__anon19bd20ef0308::sugg_heapsize mdriver.c /^ int sugg_heapsize; \/* suggested heap size (unused) *\/$/;" m struct:__anon19bd20ef0308 typeref:typename:int file: access:public +__anon19bd20ef0308::weight mdriver.c /^ int weight; \/* weight for this trace (unused) *\/$/;" m struct:__anon19bd20ef0308 typeref:typename:int file: access:public +__anon19bd20ef0408 mdriver.c /^typedef struct {$/;" s file: +__anon19bd20ef0408::ranges mdriver.c /^ range_t *ranges;$/;" m struct:__anon19bd20ef0408 typeref:typename:range_t * file: access:public +__anon19bd20ef0408::trace mdriver.c /^ trace_t *trace; $/;" m struct:__anon19bd20ef0408 typeref:typename:trace_t * file: access:public +__anon19bd20ef0508 mdriver.c /^typedef struct {$/;" s file: +__anon19bd20ef0508::ops mdriver.c /^ double ops; \/* number of ops (malloc\/free\/realloc) in the trace *\/$/;" m struct:__anon19bd20ef0508 typeref:typename:double file: access:public +__anon19bd20ef0508::secs mdriver.c /^ double secs; \/* number of secs needed to run the trace *\/$/;" m struct:__anon19bd20ef0508 typeref:typename:double file: access:public +__anon19bd20ef0508::util mdriver.c /^ double util; \/* space utilization for this trace (always 0 for libc) *\/$/;" m struct:__anon19bd20ef0508 typeref:typename:double file: access:public +__anon19bd20ef0508::valid mdriver.c /^ int valid; \/* was the trace processed correctly by the allocator? *\/$/;" m struct:__anon19bd20ef0508 typeref:typename:int file: access:public +__anon7c9aaad50108 mm.h /^typedef struct {$/;" s +__anon7c9aaad50108::id1 mm.h /^ char *id1; \/* login ID of first member *\/$/;" m struct:__anon7c9aaad50108 typeref:typename:char * access:public +__anon7c9aaad50108::id2 mm.h /^ char *id2; \/* login ID of second member *\/$/;" m struct:__anon7c9aaad50108 typeref:typename:char * access:public +__anon7c9aaad50108::name1 mm.h /^ char *name1; \/* full name of first member *\/$/;" m struct:__anon7c9aaad50108 typeref:typename:char * access:public +__anon7c9aaad50108::name2 mm.h /^ char *name2; \/* full name of second member (if any) *\/$/;" m struct:__anon7c9aaad50108 typeref:typename:char * access:public +__anon7c9aaad50108::teamname mm.h /^ char *teamname; \/* ID1+ID2 or ID1 *\/$/;" m struct:__anon7c9aaad50108 typeref:typename:char * access:public +access_counter clock.c /^void access_counter(unsigned *hi, unsigned *lo)$/;" f typeref:typename:void signature:(unsigned * hi,unsigned * lo) +add_range mdriver.c /^static int add_range(range_t **ranges, char *lo, int size, $/;" f typeref:typename:int file: signature:(range_t ** ranges,char * lo,int size,int tracenum,int opnum) +add_range mdriver.c /^static int add_range(range_t **ranges, char *lo, int size, $/;" p typeref:typename:int file: signature:(range_t ** ranges,char * lo,int size,int tracenum,int opnum) +add_sample fcyc.c /^static void add_sample(double val)$/;" f typeref:typename:void file: signature:(double val) +app_error mdriver.c /^static void app_error(char *msg);$/;" p typeref:typename:void file: signature:(char * msg) +app_error mdriver.c /^void app_error(char *msg) $/;" f typeref:typename:void signature:(char * msg) +block_sizes mdriver.c /^ size_t *block_sizes; \/* ... and a corresponding array of payload sizes *\/$/;" m struct:__anon19bd20ef0308 typeref:typename:size_t * file: access:public +blocks mdriver.c /^ char **blocks; \/* array of ptrs returned by malloc\/realloc... *\/$/;" m struct:__anon19bd20ef0308 typeref:typename:char ** file: access:public +cache_block fcyc.c /^static int cache_block = CACHE_BLOCK;$/;" v typeref:typename:int file: +cache_buf fcyc.c /^static int *cache_buf = NULL;$/;" v typeref:typename:int * file: +cache_bytes fcyc.c /^static int cache_bytes = CACHE_BYTES;$/;" v typeref:typename:int file: +callibrate clock.c /^static void callibrate(int verbose)$/;" f typeref:typename:void file: signature:(int verbose) +clean Makefile /^clean:$/;" t +clear fcyc.c /^static void clear()$/;" f typeref:typename:void file: signature:() +clear_cache fcyc.c /^static int clear_cache = CLEAR_CACHE;$/;" v typeref:typename:int file: +clear_ranges mdriver.c /^static void clear_ranges(range_t **ranges)$/;" f typeref:typename:void file: signature:(range_t ** ranges) +clear_ranges mdriver.c /^static void clear_ranges(range_t **ranges);$/;" p typeref:typename:void file: signature:(range_t ** ranges) +clock.o Makefile /^clock.o: clock.c clock.h$/;" t +coalesce mm.c /^static void *coalesce(void *bp) {$/;" f typeref:typename:void * file: signature:(void * bp) +compensate fcyc.c /^static int compensate = COMPENSATE;$/;" v typeref:typename:int file: +counter clock.c /^static unsigned int (*counter)(void)= (void *)counterRoutine;$/;" v typeref:typename:unsigned int (*)(void) file: +counterRoutine clock.c /^static unsigned int counterRoutine[] =$/;" v typeref:typename:unsigned int[] file: +cyc_hi clock.c /^static unsigned cyc_hi = 0;$/;" v typeref:typename:unsigned file: +cyc_lo clock.c /^static unsigned cyc_lo = 0;$/;" v typeref:typename:unsigned file: +cyc_per_tick clock.c /^static double cyc_per_tick = 0.0;$/;" v typeref:typename:double file: +default_tracefiles mdriver.c /^static char *default_tracefiles[] = { $/;" v typeref:typename:char * [] file: +epsilon fcyc.c /^static double epsilon = EPSILON;$/;" v typeref:typename:double file: +errors mdriver.c /^static int errors = 0; \/* number of errs found when running student malloc *\/$/;" v typeref:typename:int file: +eval_libc_speed mdriver.c /^static void eval_libc_speed(void *ptr)$/;" f typeref:typename:void file: signature:(void * ptr) +eval_libc_speed mdriver.c /^static void eval_libc_speed(void *ptr);$/;" p typeref:typename:void file: signature:(void * ptr) +eval_libc_valid mdriver.c /^static int eval_libc_valid(trace_t *trace, int tracenum)$/;" f typeref:typename:int file: signature:(trace_t * trace,int tracenum) +eval_libc_valid mdriver.c /^static int eval_libc_valid(trace_t *trace, int tracenum);$/;" p typeref:typename:int file: signature:(trace_t * trace,int tracenum) +eval_mm_speed mdriver.c /^static void eval_mm_speed(void *ptr)$/;" f typeref:typename:void file: signature:(void * ptr) +eval_mm_speed mdriver.c /^static void eval_mm_speed(void *ptr);$/;" p typeref:typename:void file: signature:(void * ptr) +eval_mm_util mdriver.c /^static double eval_mm_util(trace_t *trace, int tracenum, range_t **ranges)$/;" f typeref:typename:double file: signature:(trace_t * trace,int tracenum,range_t ** ranges) +eval_mm_util mdriver.c /^static double eval_mm_util(trace_t *trace, int tracenum, range_t **ranges);$/;" p typeref:typename:double file: signature:(trace_t * trace,int tracenum,range_t ** ranges) +eval_mm_valid mdriver.c /^static int eval_mm_valid(trace_t *trace, int tracenum, range_t **ranges) $/;" f typeref:typename:int file: signature:(trace_t * trace,int tracenum,range_t ** ranges) +eval_mm_valid mdriver.c /^static int eval_mm_valid(trace_t *trace, int tracenum, range_t **ranges);$/;" p typeref:typename:int file: signature:(trace_t * trace,int tracenum,range_t ** ranges) +extend_heap mm.c /^static void *extend_heap(size_t words)$/;" f typeref:typename:void * file: signature:(size_t words) +fcyc fcyc.c /^double fcyc(test_funct f, void *argp)$/;" f typeref:typename:double signature:(test_funct f,void * argp) +fcyc fcyc.h /^double fcyc(test_funct f, void* argp);$/;" p typeref:typename:double signature:(test_funct f,void * argp) +fcyc.o Makefile /^fcyc.o: fcyc.c fcyc.h$/;" t +find_fit mm.c /^static void *find_fit(size_t asize)$/;" f typeref:typename:void * file: signature:(size_t asize) +first_p ftimer.c /^static struct itimerval first_p; \/* prof time*\/$/;" v typeref:struct:itimerval file: +first_r ftimer.c /^static struct itimerval first_r; \/* real time *\/$/;" v typeref:struct:itimerval file: +first_u ftimer.c /^static struct itimerval first_u; \/* user time *\/$/;" v typeref:struct:itimerval file: +free_trace mdriver.c /^static void free_trace(trace_t *trace);$/;" p typeref:typename:void file: signature:(trace_t * trace) +free_trace mdriver.c /^void free_trace(trace_t *trace)$/;" f typeref:typename:void signature:(trace_t * trace) +fsecs fsecs.c /^double fsecs(fsecs_test_funct f, void *argp) $/;" f typeref:typename:double signature:(fsecs_test_funct f,void * argp) +fsecs fsecs.h /^double fsecs(fsecs_test_funct f, void *argp);$/;" p typeref:typename:double signature:(fsecs_test_funct f,void * argp) +fsecs.o Makefile /^fsecs.o: fsecs.c fsecs.h config.h$/;" t +fsecs_test_funct fsecs.h /^typedef void (*fsecs_test_funct)(void *);$/;" t typeref:typename:void (*)(void *) +ftimer.o Makefile /^ftimer.o: ftimer.c ftimer.h config.h$/;" t +ftimer_gettod ftimer.c /^double ftimer_gettod(ftimer_test_funct f, void *argp, int n)$/;" f typeref:typename:double signature:(ftimer_test_funct f,void * argp,int n) +ftimer_gettod ftimer.h /^double ftimer_gettod(ftimer_test_funct f, void *argp, int n);$/;" p typeref:typename:double signature:(ftimer_test_funct f,void * argp,int n) +ftimer_itimer ftimer.c /^double ftimer_itimer(ftimer_test_funct f, void *argp, int n)$/;" f typeref:typename:double signature:(ftimer_test_funct f,void * argp,int n) +ftimer_itimer ftimer.h /^double ftimer_itimer(ftimer_test_funct f, void *argp, int n);$/;" p typeref:typename:double signature:(ftimer_test_funct f,void * argp,int n) +ftimer_test_funct ftimer.h /^typedef void (*ftimer_test_funct)(void *); $/;" t typeref:typename:void (*)(void *) +get_comp_counter clock.c /^double get_comp_counter() $/;" f typeref:typename:double signature:() +get_comp_counter clock.h /^double get_comp_counter();$/;" p typeref:typename:double signature:() +get_counter clock.c /^double get_counter() $/;" f typeref:typename:double signature:() +get_counter clock.c /^double get_counter()$/;" f typeref:typename:double signature:() +get_counter clock.h /^double get_counter();$/;" p typeref:typename:double signature:() +get_etime ftimer.c /^static double get_etime(void) {$/;" f typeref:typename:double file: signature:(void) +get_etime ftimer.c /^static double get_etime(void);$/;" p typeref:typename:double file: signature:(void) +has_converged fcyc.c /^static int has_converged()$/;" f typeref:typename:int file: signature:() +heap_listp mm.c /^static char *heap_listp;$/;" v typeref:typename:char * file: +hi mdriver.c /^ char *hi; \/* high payload address *\/$/;" m struct:range_t typeref:typename:char * file: access:public +id1 mm.h /^ char *id1; \/* login ID of first member *\/$/;" m struct:__anon7c9aaad50108 typeref:typename:char * access:public +id2 mm.h /^ char *id2; \/* login ID of second member *\/$/;" m struct:__anon7c9aaad50108 typeref:typename:char * access:public +index mdriver.c /^ int index; \/* index for free() to use later *\/$/;" m struct:__anon19bd20ef0108 typeref:typename:int file: access:public +init_etime ftimer.c /^static void init_etime(void)$/;" f typeref:typename:void file: signature:(void) +init_etime ftimer.c /^static void init_etime(void);$/;" p typeref:typename:void file: signature:(void) +init_fsecs fsecs.c /^void init_fsecs(void)$/;" f typeref:typename:void signature:(void) +init_fsecs fsecs.h /^void init_fsecs(void);$/;" p typeref:typename:void signature:(void) +init_sampler fcyc.c /^static void init_sampler()$/;" f typeref:typename:void file: signature:() +kbest fcyc.c /^static int kbest = K;$/;" v typeref:typename:int file: +lo mdriver.c /^ char *lo; \/* low payload address *\/$/;" m struct:range_t typeref:typename:char * file: access:public +main mdriver.c /^int main(int argc, char **argv)$/;" f typeref:typename:int signature:(int argc,char ** argv) +malloc_error mdriver.c /^static void malloc_error(int tracenum, int opnum, char *msg);$/;" p typeref:typename:void file: signature:(int tracenum,int opnum,char * msg) +malloc_error mdriver.c /^void malloc_error(int tracenum, int opnum, char *msg)$/;" f typeref:typename:void signature:(int tracenum,int opnum,char * msg) +maxsamples fcyc.c /^static int maxsamples = MAXSAMPLES;$/;" v typeref:typename:int file: +mdriver Makefile /^mdriver: $(OBJS)$/;" t +mdriver.o Makefile /^mdriver.o: mdriver.c fsecs.h fcyc.h clock.h memlib.h config.h mm.h$/;" t +mem_brk memlib.c /^static char *mem_brk; \/* points to last byte of heap *\/$/;" v typeref:typename:char * file: +mem_deinit memlib.c /^void mem_deinit(void)$/;" f typeref:typename:void signature:(void) +mem_deinit memlib.h /^void mem_deinit(void);$/;" p typeref:typename:void signature:(void) +mem_heap_hi memlib.c /^void *mem_heap_hi()$/;" f typeref:typename:void * signature:() +mem_heap_hi memlib.h /^void *mem_heap_hi(void);$/;" p typeref:typename:void * signature:(void) +mem_heap_lo memlib.c /^void *mem_heap_lo()$/;" f typeref:typename:void * signature:() +mem_heap_lo memlib.h /^void *mem_heap_lo(void);$/;" p typeref:typename:void * signature:(void) +mem_heapsize memlib.c /^size_t mem_heapsize() $/;" f typeref:typename:size_t signature:() +mem_heapsize memlib.h /^size_t mem_heapsize(void);$/;" p typeref:typename:size_t signature:(void) +mem_init memlib.c /^void mem_init(void)$/;" f typeref:typename:void signature:(void) +mem_init memlib.h /^void mem_init(void); $/;" p typeref:typename:void signature:(void) +mem_max_addr memlib.c /^static char *mem_max_addr; \/* largest legal heap address *\/ $/;" v typeref:typename:char * file: +mem_pagesize memlib.c /^size_t mem_pagesize()$/;" f typeref:typename:size_t signature:() +mem_pagesize memlib.h /^size_t mem_pagesize(void);$/;" p typeref:typename:size_t signature:(void) +mem_reset_brk memlib.c /^void mem_reset_brk()$/;" f typeref:typename:void signature:() +mem_reset_brk memlib.h /^void mem_reset_brk(void); $/;" p typeref:typename:void signature:(void) +mem_sbrk memlib.c /^void *mem_sbrk(int incr) $/;" f typeref:typename:void * signature:(int incr) +mem_sbrk memlib.h /^void *mem_sbrk(int incr);$/;" p typeref:typename:void * signature:(int incr) +mem_start_brk memlib.c /^static char *mem_start_brk; \/* points to first byte of heap *\/$/;" v typeref:typename:char * file: +memlib.o Makefile /^memlib.o: memlib.c memlib.h$/;" t +mhz clock.c /^double mhz(int verbose)$/;" f typeref:typename:double signature:(int verbose) +mhz clock.h /^double mhz(int verbose);$/;" p typeref:typename:double signature:(int verbose) +mhz_full clock.c /^double mhz_full(int verbose, int sleeptime)$/;" f typeref:typename:double signature:(int verbose,int sleeptime) +mhz_full clock.h /^double mhz_full(int verbose, int sleeptime);$/;" p typeref:typename:double signature:(int verbose,int sleeptime) +mm.o Makefile /^mm.o: mm.c mm.h memlib.h$/;" t +mm_free mm.c /^void mm_free(void *ptr)$/;" f typeref:typename:void signature:(void * ptr) +mm_free mm.h /^extern void mm_free (void *ptr);$/;" p typeref:typename:void signature:(void * ptr) +mm_init mm.c /^int mm_init(void)$/;" f typeref:typename:int signature:(void) +mm_init mm.h /^extern int mm_init (void);$/;" p typeref:typename:int signature:(void) +mm_malloc mm.c /^void *mm_malloc(size_t size)$/;" f typeref:typename:void * signature:(size_t size) +mm_malloc mm.h /^extern void *mm_malloc (size_t size);$/;" p typeref:typename:void * signature:(size_t size) +mm_realloc mm.c /^void *mm_realloc(void *ptr, size_t size)$/;" f typeref:typename:void * signature:(void * ptr,size_t size) +mm_realloc mm.h /^extern void *mm_realloc(void *ptr, size_t size);$/;" p typeref:typename:void * signature:(void * ptr,size_t size) +msg mdriver.c /^char msg[MAXLINE]; \/* for whenever we need to compose an error message *\/$/;" v typeref:typename:char[] +name1 mm.h /^ char *name1; \/* full name of first member *\/$/;" m struct:__anon7c9aaad50108 typeref:typename:char * access:public +name2 mm.h /^ char *name2; \/* full name of second member (if any) *\/$/;" m struct:__anon7c9aaad50108 typeref:typename:char * access:public +next mdriver.c /^ struct range_t *next; \/* next list element *\/$/;" m struct:range_t typeref:struct:range_t * file: access:public +num_ids mdriver.c /^ int num_ids; \/* number of alloc\/realloc ids *\/$/;" m struct:__anon19bd20ef0308 typeref:typename:int file: access:public +num_ops mdriver.c /^ int num_ops; \/* number of distinct requests *\/$/;" m struct:__anon19bd20ef0308 typeref:typename:int file: access:public +ops mdriver.c /^ double ops; \/* number of ops (malloc\/free\/realloc) in the trace *\/$/;" m struct:__anon19bd20ef0508 typeref:typename:double file: access:public +ops mdriver.c /^ traceop_t *ops; \/* array of requests *\/$/;" m struct:__anon19bd20ef0308 typeref:typename:traceop_t * file: access:public +ovhd clock.c /^double ovhd()$/;" f typeref:typename:double signature:() +ovhd clock.h /^double ovhd();$/;" p typeref:typename:double signature:() +place mm.c /^static void place(void *bp, size_t asize)$/;" f typeref:typename:void file: signature:(void * bp,size_t asize) +printresults mdriver.c /^static void printresults(int n, stats_t *stats) $/;" f typeref:typename:void file: signature:(int n,stats_t * stats) +printresults mdriver.c /^static void printresults(int n, stats_t *stats);$/;" p typeref:typename:void file: signature:(int n,stats_t * stats) +range_t mdriver.c /^typedef struct range_t {$/;" s file: +range_t mdriver.c /^} range_t;$/;" t typeref:struct:range_t file: +range_t::hi mdriver.c /^ char *hi; \/* high payload address *\/$/;" m struct:range_t typeref:typename:char * file: access:public +range_t::lo mdriver.c /^ char *lo; \/* low payload address *\/$/;" m struct:range_t typeref:typename:char * file: access:public +range_t::next mdriver.c /^ struct range_t *next; \/* next list element *\/$/;" m struct:range_t typeref:struct:range_t * file: access:public +ranges mdriver.c /^ range_t *ranges;$/;" m struct:__anon19bd20ef0408 typeref:typename:range_t * file: access:public +read_trace mdriver.c /^static trace_t *read_trace(char *tracedir, char *filename)$/;" f typeref:typename:trace_t * file: signature:(char * tracedir,char * filename) +read_trace mdriver.c /^static trace_t *read_trace(char *tracedir, char *filename);$/;" p typeref:typename:trace_t * file: signature:(char * tracedir,char * filename) +remove_range mdriver.c /^static void remove_range(range_t **ranges, char *lo)$/;" f typeref:typename:void file: signature:(range_t ** ranges,char * lo) +remove_range mdriver.c /^static void remove_range(range_t **ranges, char *lo);$/;" p typeref:typename:void file: signature:(range_t ** ranges,char * lo) +samplecount fcyc.c /^static int samplecount = 0;$/;" v typeref:typename:int file: +samples fcyc.c /^static double *samples = NULL;$/;" v typeref:typename:double * file: +secs mdriver.c /^ double secs; \/* number of secs needed to run the trace *\/$/;" m struct:__anon19bd20ef0508 typeref:typename:double file: access:public +set_fcyc_cache_block fcyc.c /^void set_fcyc_cache_block(int bytes) {$/;" f typeref:typename:void signature:(int bytes) +set_fcyc_cache_block fcyc.h /^void set_fcyc_cache_block(int bytes);$/;" p typeref:typename:void signature:(int bytes) +set_fcyc_cache_size fcyc.c /^void set_fcyc_cache_size(int bytes)$/;" f typeref:typename:void signature:(int bytes) +set_fcyc_cache_size fcyc.h /^void set_fcyc_cache_size(int bytes);$/;" p typeref:typename:void signature:(int bytes) +set_fcyc_clear_cache fcyc.c /^void set_fcyc_clear_cache(int clear)$/;" f typeref:typename:void signature:(int clear) +set_fcyc_clear_cache fcyc.h /^void set_fcyc_clear_cache(int clear);$/;" p typeref:typename:void signature:(int clear) +set_fcyc_compensate fcyc.c /^void set_fcyc_compensate(int compensate_arg)$/;" f typeref:typename:void signature:(int compensate_arg) +set_fcyc_compensate fcyc.h /^void set_fcyc_compensate(int compensate_arg);$/;" p typeref:typename:void signature:(int compensate_arg) +set_fcyc_epsilon fcyc.c /^void set_fcyc_epsilon(double epsilon_arg)$/;" f typeref:typename:void signature:(double epsilon_arg) +set_fcyc_epsilon fcyc.h /^void set_fcyc_epsilon(double epsilon_arg);$/;" p typeref:typename:void signature:(double epsilon_arg) +set_fcyc_k fcyc.c /^void set_fcyc_k(int k)$/;" f typeref:typename:void signature:(int k) +set_fcyc_k fcyc.h /^void set_fcyc_k(int k);$/;" p typeref:typename:void signature:(int k) +set_fcyc_maxsamples fcyc.c /^void set_fcyc_maxsamples(int maxsamples_arg)$/;" f typeref:typename:void signature:(int maxsamples_arg) +set_fcyc_maxsamples fcyc.h /^void set_fcyc_maxsamples(int maxsamples_arg);$/;" p typeref:typename:void signature:(int maxsamples_arg) +sink fcyc.c /^static volatile int sink = 0;$/;" v typeref:typename:volatile int file: +size mdriver.c /^ int size; \/* byte size of alloc\/realloc request *\/$/;" m struct:__anon19bd20ef0108 typeref:typename:int file: access:public +speed_t mdriver.c /^} speed_t;$/;" t typeref:struct:__anon19bd20ef0408 file: +start_comp_counter clock.c /^void start_comp_counter() $/;" f typeref:typename:void signature:() +start_comp_counter clock.h /^void start_comp_counter();$/;" p typeref:typename:void signature:() +start_counter clock.c /^void start_counter()$/;" f typeref:typename:void signature:() +start_counter clock.h /^void start_counter();$/;" p typeref:typename:void signature:() +start_tick clock.c /^static clock_t start_tick = 0;$/;" v typeref:typename:clock_t file: +stats_t mdriver.c /^} stats_t; $/;" t typeref:struct:__anon19bd20ef0508 file: +sugg_heapsize mdriver.c /^ int sugg_heapsize; \/* suggested heap size (unused) *\/$/;" m struct:__anon19bd20ef0308 typeref:typename:int file: access:public +team mm.c /^team_t team = {$/;" v typeref:typename:team_t +team_t mm.h /^} team_t;$/;" t typeref:struct:__anon7c9aaad50108 +teamname mm.h /^ char *teamname; \/* ID1+ID2 or ID1 *\/$/;" m struct:__anon7c9aaad50108 typeref:typename:char * access:public +test_funct fcyc.h /^typedef void (*test_funct)(void *);$/;" t typeref:typename:void (*)(void *) +trace mdriver.c /^ trace_t *trace; $/;" m struct:__anon19bd20ef0408 typeref:typename:trace_t * file: access:public +trace_t mdriver.c /^} trace_t;$/;" t typeref:struct:__anon19bd20ef0308 file: +tracedir mdriver.c /^static char tracedir[MAXLINE] = TRACEDIR;$/;" v typeref:typename:char[] file: +traceop_t mdriver.c /^} traceop_t;$/;" t typeref:struct:__anon19bd20ef0108 file: +type mdriver.c /^ enum {ALLOC, FREE, REALLOC} type; \/* type of request *\/$/;" m struct:__anon19bd20ef0108 typeref:enum:__anon19bd20ef0108::__anon19bd20ef0203 file: access:public +unix_error mdriver.c /^static void unix_error(char *msg);$/;" p typeref:typename:void file: signature:(char * msg) +unix_error mdriver.c /^void unix_error(char *msg) $/;" f typeref:typename:void signature:(char * msg) +usage mdriver.c /^static void usage(void) $/;" f typeref:typename:void file: signature:(void) +usage mdriver.c /^static void usage(void);$/;" p typeref:typename:void file: signature:(void) +util mdriver.c /^ double util; \/* space utilization for this trace (always 0 for libc) *\/$/;" m struct:__anon19bd20ef0508 typeref:typename:double file: access:public +valid mdriver.c /^ int valid; \/* was the trace processed correctly by the allocator? *\/$/;" m struct:__anon19bd20ef0508 typeref:typename:int file: access:public +values fcyc.c /^static double *values = NULL;$/;" v typeref:typename:double * file: +verbose mdriver.c /^int verbose = 0; \/* global flag for verbose output *\/$/;" v typeref:typename:int +weight mdriver.c /^ int weight; \/* weight for this trace (unused) *\/$/;" m struct:__anon19bd20ef0308 typeref:typename:int file: access:public diff --git a/mdriver b/mdriver new file mode 100755 index 0000000000000000000000000000000000000000..a1d43d7352e553685a65f1d75e58a82e89e13c6f GIT binary patch literal 143740 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 ~{t~)aW=LSZ{ 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 (y)? (x) : (y)) + +/* Pack a size and allocated bit into a word */ +#define PACK(size, alloc) ((size) | (alloc)) + +/* Read and write a word at address p */ +#define GET(p) (*(unsigned int *)(p)) +#define PUT(p, val) (*(unsigned int *)(p) = (val)) + +/* Read the size and allocated fields from address p */ +#define GET_SIZE(p) (GET(p) & ~0x7) +#define GET_ALLOC(p) (GET(p) & 0x1) + +/* Given block ptr bp, compute address of its header and footer */ +#define HDRP(bp) ((char *)(bp) - WSIZE) +#define FTRP(bp) ((char *)(bp) + GET_SIZE(HDRP(bp)) - DSIZE) + +/* Given block ptr bp, compute address of next and previous blocks */ +#define NEXT_BLKP(bp) ((char *)(bp) + GET_SIZE(((char *)(bp) - WSIZE))) +#define PREV_BLKP(bp) ((char *)(bp) - GET_SIZE(((char *)(bp) - DSIZE))) + +static char *heap_listp; + +/* Page 856-858, Pearson R. Bryant – D. O’Hallaron. Computer Systems: A Programmer’s Perspective.3rd Edition, Pearson, 2003. */ +static void place(void *bp, size_t asize) +{ + size_t csize = GET_SIZE(HDRP(bp)); + if ((csize - asize) >= (2*DSIZE)) { + PUT(HDRP(bp), PACK(asize, 1)); + PUT(FTRP(bp), PACK(asize, 1)); + bp = NEXT_BLKP(bp); + PUT(HDRP(bp), PACK(csize-asize, 0)); + PUT(FTRP(bp), PACK(csize-asize, 0)); + } + else { + PUT(HDRP(bp), PACK(csize, 1)); + PUT(FTRP(bp), PACK(csize, 1)); + } +} + +/* Page 856, Pearson R. Bryant – D. O’Hallaron. Computer Systems: A Programmer’s Perspective.3rd Edition, Pearson, 2003. */ +static void *find_fit(size_t asize) +{ + /* First fit search */ + void *bp; + + for (bp = heap_listp; GET_SIZE(HDRP(bp)) > 0; bp = NEXT_BLKP(bp)) { + if (!GET_ALLOC(HDRP(bp)) && (asize <= GET_SIZE(HDRP(bp)))) { + return bp; + } + } + return NULL; /* No fit */ +} + +/* Page 833, Pearson R. Bryant – D. O’Hallaron. Computer Systems: A Programmer’s Perspective.3rd Edition, Pearson, 2003. */ +static void *coalesce(void *bp) { + size_t prev_alloc = GET_ALLOC(FTRP(PREV_BLKP(bp))); + size_t next_alloc = GET_ALLOC(HDRP(NEXT_BLKP(bp))); + size_t size = GET_SIZE(HDRP(bp)); + + if (prev_alloc && next_alloc) { /* Case 1 */ + return bp; + } else if (prev_alloc && !next_alloc) { /* Case 2 */ + size += GET_SIZE(HDRP(NEXT_BLKP(bp))); + PUT(HDRP(bp),PACK(size,0)); + PUT(FTRP(bp),PACK(size,0)); + } else if (!prev_alloc && next_alloc) { /* Case 3 */ + size += GET_SIZE(HDRP(PREV_BLKP(bp))); + PUT(FTRP(bp), PACK(size, 0)); + PUT(HDRP(PREV_BLKP(bp)), PACK(size, 0)); + bp = PREV_BLKP(bp); + } else { /* Case 4 */ + size += GET_SIZE(HDRP(PREV_BLKP(bp))) + + GET_SIZE(FTRP(NEXT_BLKP(bp))); + PUT(HDRP(PREV_BLKP(bp)), PACK(size, 0)); + PUT(FTRP(NEXT_BLKP(bp)), PACK(size, 0)); + bp = PREV_BLKP(bp); + } + return bp; +} + +/* Page 831, Pearson R. Bryant – D. O’Hallaron. Computer Systems: A Programmer’s Perspective.3rd Edition, Pearson, 2003. */ +static void *extend_heap(size_t words) +{ + char *bp; + size_t size; + + /* Allocate an even number of words to maintain alignment */ + size = (words % 2) ? (words+1) * WSIZE : words * WSIZE; + if ((long)(bp = mem_sbrk(size)) == -1) + return NULL; + + /* Initialize free block header/footer and the epilogue header */ + PUT(HDRP(bp), PACK(size,0)); /* Free block header */ + PUT(FTRP(bp), PACK(size,0)); /* Free block footer */ + PUT(HDRP(NEXT_BLKP(bp)), PACK(0, 1)); /* New epilogue header */ + + /* Coalesce if the previous block was free */ + return coalesce(bp); +} + + +/* Page 831, Pearson R. Bryant – D. O’Hallaron. Computer Systems: A Programmer’s Perspective.3rd Edition, Pearson, 2003. */ /* * mm_init - initialize the malloc package. */ int mm_init(void) { + /* Create the initial empty heap */ + if ((heap_listp = mem_sbrk(4*WSIZE)) == (void *)-1) + return -1; + PUT(heap_listp, 0); /* Alignment padding */ + PUT(heap_listp + (1*WSIZE), PACK(DSIZE, 1)); /* Prologue header */ + PUT(heap_listp + (2*WSIZE), PACK(DSIZE, 1)); /* Prologue footer */ + PUT(heap_listp + (3*WSIZE), PACK(0, 1)); /* Epilogue header */ + heap_listp += (2*WSIZE); + + /* Extend the empty heap with a free block of CHUNKSIZE bytes */ + if (extend_heap(CHUNKSIZE/WSIZE) == NULL) + return -1; return 0; } +/* Page 834, Pearson R. Bryant – D. O’Hallaron. Computer Systems: A Programmer’s Perspective.3rd Edition, Pearson, 2003. */ /* * mm_malloc - Allocate a block by incrementing the brk pointer. * Always allocate a block whose size is a multiple of the alignment. */ void *mm_malloc(size_t size) { - int newsize = ALIGN(size + SIZE_T_SIZE); - void *p = mem_sbrk(newsize); - if (p == (void *)-1) + size_t asize; + /* Adjusted block size */ + size_t extendsize; /* Amount to extend heap if no fit */ + char *bp; + + /* Ignore spurious requests */ + if (size == 0) return NULL; - else { - *(size_t *)p = size; - return (void *)((char *)p + SIZE_T_SIZE); + + /* Adjust block size to include overhead and alignment reqs. */ + if (size <= DSIZE) + asize = 2*DSIZE; + else + asize = DSIZE * ((size + (DSIZE) + (DSIZE-1)) / DSIZE); + /* Search the free list for a fit */ + if ((bp = find_fit(asize)) != NULL) { + place(bp, asize); + return bp; } + + /* No fit found. Get more memory and place the block */ + extendsize = MAX(asize,CHUNKSIZE); + if ((bp = extend_heap(extendsize/WSIZE)) == NULL) + return NULL; + place(bp, asize); + return bp; } +/* Page 833, Pearson R. Bryant – D. O’Hallaron. Computer Systems: A Programmer’s Perspective.3rd Edition, Pearson, 2003. */ /* * mm_free - Freeing a block does nothing. */ void mm_free(void *ptr) { + size_t size= GET_SIZE(HDRP(ptr)); + PUT(HDRP(ptr), PACK(size, 0)); + PUT(FTRP(ptr), PACK(size, 0)); + coalesce(ptr); } /* @@ -97,3 +241,8 @@ void *mm_realloc(void *ptr, size_t size) mm_free(oldptr); return newptr; } + +//////////////////////////////////////////////////////////////// +/// Helper Functions +//////////////////////////////////////////////////////////////// +