Enlightenment CVS committal Author : raster Project : e17 Module : libs/eet
Dir : e17/libs/eet/src/lib Modified Files: Eet_private.h eet_data.c eet_image.c eet_lib.c Log Message: reduce some allocs =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/eet/src/lib/Eet_private.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- Eet_private.h 26 May 2005 03:57:57 -0000 1.7 +++ Eet_private.h 4 Nov 2005 03:22:22 -0000 1.8 @@ -1,9 +1,7 @@ #ifndef _EET_PRIVATE_H #define _EET_PRIVATE_H -#ifdef HAVE_CONFIG_H #include "config.h" -#endif #include <stdio.h> #include <unistd.h> @@ -13,6 +11,9 @@ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> +#if HAVE_ALLOCA_H +#include <alloca.h> +#endif #ifdef HAVE_NETINET_IN_H #include <netinet/in.h> =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/eet/src/lib/eet_data.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -3 -r1.25 -r1.26 --- eet_data.c 4 Oct 2005 11:31:44 -0000 1.25 +++ eet_data.c 4 Nov 2005 03:22:22 -0000 1.26 @@ -505,10 +505,11 @@ Eet_Data_Chunk *chnk; if (!name) return NULL; - chnk = calloc(1, sizeof(Eet_Data_Chunk)); + chnk = malloc(sizeof(Eet_Data_Chunk) + strlen(name) + 1); if (!chnk) return NULL; - chnk->name = strdup(name); + chnk->name = ((char *)chnk) + sizeof(Eet_Data_Chunk); + strcpy(chnk->name, name); chnk->size = size; chnk->data = data; @@ -518,7 +519,6 @@ static void eet_data_chunk_free(Eet_Data_Chunk *chnk) { - if (chnk->name) free(chnk->name); free(chnk); } @@ -700,8 +700,9 @@ Eet_Data_Descriptor *edd; if (!name) return NULL; - edd = calloc(1, sizeof(Eet_Data_Descriptor)); - edd->name = strdup(name); + edd = calloc(1, sizeof(Eet_Data_Descriptor) + strlen(name) + 1); + edd->name = ((char *)edd) + sizeof(Eet_Data_Descriptor); + strcpy(edd->name, name); edd->size = size; edd->func.list_next = func_list_next; edd->func.list_append = func_list_append; @@ -719,7 +720,6 @@ int i; _eet_descriptor_hash_free(edd); - if (edd->name) free(edd->name); for (i = 0; i < edd->elements.num; i++) { if (edd->elements.set[i].name) free(edd->elements.set[i].name); @@ -792,7 +792,7 @@ freelist_num++; if (freelist_num > freelist_len) { - freelist_len += 16; + freelist_len += 64; freelist = realloc(freelist, freelist_len * sizeof(void *)); } freelist[freelist_num - 1] = data; =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/eet/src/lib/eet_image.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- eet_image.c 23 May 2005 04:32:03 -0000 1.3 +++ eet_image.c 4 Nov 2005 03:22:22 -0000 1.4 @@ -171,17 +171,10 @@ _eet_memfile_read_close(f); return NULL; } - tdata = malloc((*w) * 16 * 3); - if (!tdata) - { - jpeg_destroy_decompress(&cinfo); - _eet_memfile_read_close(f); - return NULL; - } + tdata = alloca((*w) * 16 * 3); d = malloc((*w) * (*h) * 4); if (!d) { - free(tdata); jpeg_destroy_decompress(&cinfo); _eet_memfile_read_close(f); return NULL; @@ -233,7 +226,6 @@ } } } - free(tdata); /* end data decoding */ jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); @@ -305,40 +297,11 @@ _eet_memfile_read_close(f); return NULL; } - tdata = malloc((*w) * 16 * 3); - if (!tdata) - { - jpeg_destroy_decompress(&cinfo); - _eet_memfile_read_close(f); - return NULL; - } + tdata = alloca((*w) * 16 * 3); ptr2 = d; count = 0; prevy = 0; - if (cinfo.output_components == 3) - { - for (i = 0; i < cinfo.rec_outbuf_height; i++) - line[i] = tdata + (i * (*w) * 3); - for (l = 0; l < (*h); l += cinfo.rec_outbuf_height) - { - jpeg_read_scanlines(&cinfo, line, cinfo.rec_outbuf_height); - scans = cinfo.rec_outbuf_height; - if (((*h) - l) < scans) scans = (*h) - l; - ptr = tdata; - for (y = 0; y < scans; y++) - { - for (x = 0; x < (*w); x++) - { - *ptr2 = - ((*ptr2) & 0x00ffffff) | - (((ptr[0] + ptr[1] + ptr[2]) / 3) << 24); - ptr += 3; - ptr2++; - } - } - } - } - else if (cinfo.output_components == 1) + if (cinfo.output_components == 1) { for (i = 0; i < cinfo.rec_outbuf_height; i++) line[i] = tdata + (i * (*w)); @@ -361,7 +324,6 @@ } } } - free(tdata); /* end data decoding */ jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); @@ -486,13 +448,7 @@ f =_eet_memfile_write_open(&d, &sz); if (!f) return NULL; - buf = malloc(3 * w); - if (!buf) - { - _eet_memfile_write_close(f); - if (d) free(d); - return NULL; - } + buf = alloca(3 * w); cinfo.err = jpeg_std_error(&(jerr.pub)); jerr.pub.error_exit = _JPEGFatalErrorHandler; @@ -501,7 +457,6 @@ if (setjmp(jerr.setjmp_buffer)) { jpeg_destroy_compress(&cinfo); - if (buf) free(buf); _eet_memfile_write_close(f); if (d) free(d); return NULL; @@ -547,7 +502,6 @@ _eet_memfile_write_close(f); *size = sz; - if (buf) free(buf); return d; } @@ -583,13 +537,7 @@ f = _eet_memfile_write_open(&d, &sz); if (!f) return NULL; - buf = malloc(3 * w); - if (!buf) - { - _eet_memfile_write_close(f); - if (d) free(d); - return NULL; - } + buf = alloca(3 * w); cinfo.err = jpeg_std_error(&(jerr.pub)); jerr.pub.error_exit = _JPEGFatalErrorHandler; @@ -598,7 +546,6 @@ if (setjmp(jerr.setjmp_buffer)) { jpeg_destroy_compress(&cinfo); - if (buf) free(buf); _eet_memfile_write_close(f); if (d) free(d); return NULL; @@ -642,7 +589,6 @@ jpeg_finish_compress(&cinfo); jpeg_destroy_compress(&cinfo); - if (buf) free(buf); _eet_memfile_write_close(f); d1 = d; sz1 = sz; @@ -664,14 +610,7 @@ return NULL; } - buf = malloc(3 * w); - if (!buf) - { - _eet_memfile_write_close(f); - if (d) free(d); - free(d1); - return NULL; - } + buf = alloca(3 * w); cinfo.err = jpeg_std_error(&(jerr.pub)); jerr.pub.error_exit = _JPEGFatalErrorHandler; @@ -680,7 +619,6 @@ if (setjmp(jerr.setjmp_buffer)) { jpeg_destroy_compress(&cinfo); - if (buf) free(buf); _eet_memfile_write_close(f); if (d) free(d); free(d1); @@ -723,7 +661,6 @@ jpeg_finish_compress(&cinfo); jpeg_destroy_compress(&cinfo); - if (buf) free(buf); _eet_memfile_write_close(f); d2 = d; sz2 = sz; =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/eet/src/lib/eet_lib.c,v retrieving revision 1.49 retrieving revision 1.50 diff -u -3 -r1.49 -r1.50 --- eet_lib.c 3 Nov 2005 15:05:21 -0000 1.49 +++ eet_lib.c 4 Nov 2005 03:22:22 -0000 1.50 @@ -22,7 +22,6 @@ int references; char *path; - char *real_path; FILE *fp; Eet_File_Mode mode; @@ -75,7 +74,7 @@ #endif /* prototypes of internal calls */ -static Eet_File *eet_cache_find(char *real_path, Eet_File **cache, int cache_num); +static Eet_File *eet_cache_find(char *path, Eet_File **cache, int cache_num); static void eet_cache_add(Eet_File *ef, Eet_File ***cache, int *cache_num, int *cache_alloc); static void eet_cache_del(Eet_File *ef, Eet_File ***cache, int *cache_num, int *cache_alloc); static int eet_string_match(char *s1, char *s2); @@ -94,7 +93,7 @@ /* find an eet file in the currently in use cache */ static Eet_File * -eet_cache_find(char *real_path, Eet_File **cache, int cache_num) +eet_cache_find(char *path, Eet_File **cache, int cache_num) { int i; @@ -102,7 +101,7 @@ for (i = 0; i < cache_num; i++) { /* if matches real path - return it */ - if (eet_string_match(cache[i]->real_path, real_path)) + if (eet_string_match(cache[i]->path, path)) { if (!cache[i]->delete_me_now) return cache[i]; } @@ -299,7 +298,7 @@ name_size = strlen(efn->name); buf_size = 20 + name_size; - buf = malloc(buf_size); + buf = alloca(buf_size); if (!buf) return; i1 = (unsigned long int)efn->offset; i2 = htonl(i1); @@ -317,13 +316,8 @@ i2 = htonl(i1); *((int *)(buf + 16)) = (int)i2; memcpy(buf + 20, efn->name, name_size); - if (fwrite(buf, buf_size, 1, ef->fp) != 1) - { - free(buf); - return; - } + if (fwrite(buf, buf_size, 1, ef->fp) != 1) return; offset += buf_size; - free(buf); } } } @@ -384,12 +378,7 @@ { Eet_File **closelist = NULL; - closelist = malloc(num * sizeof(Eet_File *)); - if (!closelist) - { - fprintf(stderr, "BAD ERROR! Eet malloc of closelist. Abort\n"); - abort(); - } + closelist = alloca(num * sizeof(Eet_File *)); num = 0; for (i = 0; i < eet_writers_num; i++) { @@ -408,7 +397,6 @@ } } for (i = 0; i < num; i++) eet_close(closelist[i]); - free(closelist); } } } @@ -417,39 +405,25 @@ eet_open(const char *file, Eet_File_Mode mode) { Eet_File *ef; - char buf[PATH_MAX]; if (!file) return NULL; - -// printf("open %s\n", file); -#ifdef HAVE_REALPATH - /* in case this is a symlink... find out where it REALLY points */ - if (!realpath(file, buf)) - { - if (mode == EET_FILE_MODE_READ) return NULL; - } -#else - strncpy(buf, file, sizeof(buf)); - buf[sizeof(buf) - 1] = 0; -#endif - /* find the current file handle in cache*/ ef = NULL; if (mode == EET_FILE_MODE_READ) { - ef = eet_cache_find(buf, eet_writers, eet_writers_num); + ef = eet_cache_find((char *)file, eet_writers, eet_writers_num); if (ef) { eet_flush(ef); ef->delete_me_now = 1; } - ef = eet_cache_find(buf, eet_readers, eet_readers_num); + ef = eet_cache_find((char *)file, eet_readers, eet_readers_num); } else if ((mode == EET_FILE_MODE_WRITE) || (mode == EET_FILE_MODE_READ_WRITE)) { - ef = eet_cache_find(buf, eet_readers, eet_readers_num); + ef = eet_cache_find((char *)file, eet_readers, eet_readers_num); if (ef) ef->delete_me_now = 1; - ef = eet_cache_find(buf, eet_writers, eet_writers_num); + ef = eet_cache_find((char *)file, eet_writers, eet_writers_num); } /* we found one */ if (ef) @@ -460,12 +434,12 @@ } /* allocate struct for eet file and have it zero'd out */ - ef = calloc(1, sizeof(Eet_File)); + ef = calloc(1, sizeof(Eet_File) + strlen(file) + 1); if (!ef) return NULL; /* fill some of the members */ - ef->path = strdup(file); - ef->real_path = strdup(buf); + ef->path = ((char *)ef) + sizeof(Eet_File); + strcpy(ef->path, file); ef->magic = EET_MAGIC_FILE; ef->references = 1; ef->mode = mode; @@ -476,7 +450,7 @@ else if (ef->mode == EET_FILE_MODE_WRITE) { /* opening for write - delete old copy of file right away */ - unlink(ef->real_path); + unlink(ef->path); ef->fp = fopen(ef->path, "wb"); } else @@ -542,7 +516,7 @@ return NULL; } /* allocate dynamic buffer for entire directory block */ - dyn_buf = malloc(byte_entries); + dyn_buf = alloca(byte_entries); if (!dyn_buf) { ef->delete_me_now = 1; @@ -554,7 +528,6 @@ if (!ef->header) { ef->delete_me_now = 1; - free(dyn_buf); eet_close(ef); return NULL; } @@ -564,7 +537,6 @@ if (!ef->header->directory) { ef->delete_me_now = 1; - free(dyn_buf); eet_close(ef); return NULL; } @@ -575,7 +547,6 @@ if (!ef->header->directory->nodes) { ef->delete_me_now = 1; - free(dyn_buf); eet_close(ef); return NULL; } @@ -584,7 +555,6 @@ if (count != 1) { ef->delete_me_now = 1; - free(dyn_buf); eet_close(ef); return NULL; } @@ -598,7 +568,6 @@ int size; int data_size; int name_size; - char *name; int hash; Eet_File_Node *efn; void *data = NULL; @@ -608,7 +577,6 @@ if (p >= (dyn_buf + byte_entries)) { ef->delete_me_now = 1; - free(dyn_buf); eet_close(ef); return NULL; } @@ -631,7 +599,6 @@ /* invalid size */ if (size <= 0) { - free(dyn_buf); eet_close(ef); return NULL; } @@ -639,7 +606,6 @@ if (name_size <= 0) { ef->delete_me_now = 1; - free(dyn_buf); eet_close(ef); return NULL; } @@ -647,35 +613,25 @@ if ((p + 16 + name_size) > (dyn_buf + byte_entries)) { ef->delete_me_now = 1; - free(dyn_buf); eet_close(ef); return NULL; } - /* allocate name string */ - name = malloc(name_size + 1); - if (!name) + /* allocate all the ram needed for this stored node accounting */ + efn = malloc(sizeof(Eet_File_Node) + name_size + 1); + if (!efn) { ef->delete_me_now = 1; - free(dyn_buf); eet_close(ef); return NULL; } + efn->name = ((char *)efn) + sizeof(Eet_File_Node); /* copy name in and terminate it */ - strncpy(name, (char *)p + 20, name_size); - name[name_size] = 0; + strncpy(efn->name, (char *)p + 20, name_size); + efn->name[name_size] = 0; /* get hask bucket it should go in */ - hash = eet_hash_gen(name, ef->header->directory->size); - efn = calloc(1, sizeof(Eet_File_Node)); - if (!efn) - { - ef->delete_me_now = 1; - free(dyn_buf); - eet_close(ef); - return NULL; - } + hash = eet_hash_gen(efn->name, ef->header->directory->size); efn->next = ef->header->directory->nodes[hash]; ef->header->directory->nodes[hash] = efn; - efn->name = name; efn->offset = offset; efn->compression = flags; efn->size = size; @@ -707,19 +663,16 @@ } efn->data = data; } - /* advance */ p += 20 + name_size; } - /* done - free dynamic buffer */ - free(dyn_buf); } /* we need to delete the original file in read-write mode and re-open for writing */ if (ef->mode == EET_FILE_MODE_READ_WRITE) { fclose(ef->fp); - unlink(ef->real_path); + unlink(ef->path); ef->fp = fopen(ef->path, "wb"); } @@ -769,8 +722,6 @@ /* free up members */ if (ef->fp) fclose(ef->fp); - if (ef->path) free(ef->path); - if (ef->real_path) free(ef->real_path); /* free up data */ if (ef->header) @@ -788,7 +739,6 @@ while ((efn = ef->header->directory->nodes[i])) { - if (efn->name) free(efn->name); if (efn->data) free(efn->data); ef->header->directory->nodes[i] = efn->next; free(efn); @@ -872,11 +822,16 @@ else { void *tmp_data; + int free_tmp = 0; /* get size of data in file */ tmp_size = efn->size; - tmp_data = malloc(tmp_size); - if (!tmp_data) break; + if (!efn->data) + { + tmp_data = malloc(tmp_size); + if (!tmp_data) break; + free_tmp = 1; + } /* get size uncompressed */ size = efn->data_size; /* allocate data */ @@ -887,7 +842,7 @@ /* if we already have the data in ram... copy that */ if (efn->data) - memcpy(tmp_data, efn->data, tmp_size); + tmp_data = efn->data; /* or get data from disk */ else { @@ -913,13 +868,13 @@ if (uncompress((Bytef *)data, &dlen, tmp_data, (uLongf)tmp_size)) { - free(tmp_data); + if (free_tmp) free(tmp_data); free(data); data = NULL; break; } } - free(tmp_data); + if (free_tmp) free(tmp_data); break; } } @@ -1066,8 +1021,8 @@ if ((!ef) || (ef->magic != EET_MAGIC_FILE) || (!name)) return 0; - /* deleting keys is only possible in RW mode */ - if (ef->mode != EET_FILE_MODE_READ_WRITE) return 0; + /* deleting keys is only possible in RW or WRITE mode */ + if (ef->mode == EET_FILE_MODE_READ) return 0; if (!ef->header) return 0; @@ -1080,7 +1035,6 @@ /* if it matches */ if (eet_string_match(efn->name, name)) { - if (efn->name) free(efn->name); if (efn->data) free(efn->data); if (efn == ef->header->directory->nodes[hash]) ef->header->directory->nodes[hash] = efn->next; @@ -1134,7 +1088,7 @@ /* only realloc in 32 entry chunks */ if (list_count > list_count_alloc) { - list_count_alloc += 32; + list_count_alloc += 64; new_list = realloc(list_ret, list_count_alloc * (sizeof(char *))); if (!new_list) { ------------------------------------------------------- SF.Net email is sponsored by: Tame your development challenges with Apache's Geronimo App Server. Download it for free - -and be entered to win a 42" plasma tv or your very own Sony(tm)PSP. Click here to play: http://sourceforge.net/geronimo.php _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs