mem/q_malloc.h
6fa79282
 /* $Id$
  *
  * simple & fast malloc library
7dd0b342
  *
  * Copyright (C) 2001-2003 Fhg Fokus
  *
  * This file is part of ser, a free SIP server.
  *
  * ser is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version
  *
  * For a license to use the ser software under conditions
  * other than those described here, or to purchase support for this
  * software, please contact iptel.org by e-mail at the following addresses:
  *    info@iptel.org
  *
  * ser is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License 
  * along with this program; if not, write to the Free Software 
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
6fa79282
  */
f72c2aae
 /*
  * History:
  * --------
  *  2003-05-21  on sparc64 roundto 8 even in debugging mode (so malloc'ed
  *               long longs will be 64 bit aligned) (andrei)
  */
6fa79282
 
7dd0b342
 
b2dec9c6
 #if !defined(q_malloc_h) && !defined(VQ_MALLOC) && !defined(F_MALLOC)
6fa79282
 #define q_malloc_h
 
 
eca7f442
 
 /* defs*/
09b2f164
 #ifdef DBG_QM_MALLOC
f72c2aae
 #ifdef __CPU_sparc64
 /* tricky, on sun in 32 bits mode long long must be 64 bits aligned
  * but long can be 32 bits aligned => malloc should return long long
  * aligned memory */
 	#define ROUNDTO		sizeof(long long)
 #else
09d47401
 	#define ROUNDTO		sizeof(void*) /* minimum possible ROUNDTO ->heavy 
 										 debugging*/
f72c2aae
 #endif 
 #else /* DBG_QM_MALLOC */
09b2f164
 	#define ROUNDTO		16 /* size we round to, must be = 2^n  and also
 							 sizeof(qm_frag)+sizeof(qm_frag_end)
 							 must be mutliple of ROUNDTO!
 						   */
 #endif
eca7f442
 #define MIN_FRAG_SIZE	ROUNDTO
 
 
 
0eb1315e
 #define QM_MALLOC_OPTIMIZE_FACTOR 11 /*used below */
9a694681
 #define QM_MALLOC_OPTIMIZE  ((unsigned long)(1<<QM_MALLOC_OPTIMIZE_FACTOR))
eca7f442
 								/* size to optimize for,
 									(most allocs < this size),
 									must be 2^k */
 
9a694681
 #define QM_HASH_SIZE ((unsigned long)(QM_MALLOC_OPTIMIZE/ROUNDTO + \
 		(32-QM_MALLOC_OPTIMIZE_FACTOR)+1))
eca7f442
 
 /* hash structure:
  * 0 .... QM_MALLOC_OPTIMIE/ROUNDTO  - small buckets, size increases with
  *                            ROUNDTO from bucket to bucket
  * +1 .... end -  size = 2^k, big buckets */
 
6fa79282
 struct qm_frag{
85f1f3ee
 	unsigned long size;
6fa79282
 	union{
 		struct qm_frag* nxt_free;
85f1f3ee
 		long is_free;
6fa79282
 	}u;
b4d048d4
 #ifdef DBG_QM_MALLOC
 	char* file;
 	char* func;
85f1f3ee
 	unsigned long line;
 	unsigned long check;
b4d048d4
 #endif
6fa79282
 };
 
 struct qm_frag_end{
2c65bd8b
 #ifdef DBG_QM_MALLOC
85f1f3ee
 	unsigned long check1;
 	unsigned long check2;
 	unsigned long reserved1;
 	unsigned long reserved2;
2c65bd8b
 #endif
85f1f3ee
 	unsigned long size;
6fa79282
 	struct qm_frag* prev_free;
 };
 
 
eca7f442
 
 struct qm_frag_full{
 	struct qm_frag head;
 	struct qm_frag_end tail;
 };
 
 
6fa79282
 struct qm_block{
85f1f3ee
 	unsigned long size; /* total size */
 	unsigned long used; /* alloc'ed size*/
 	unsigned long real_used; /* used+malloc overhead*/
 	unsigned long max_real_used;
6fa79282
 	
 	struct qm_frag* first_frag;
 	struct qm_frag_end* last_frag_end;
 	
eca7f442
 	struct qm_frag_full free_hash[QM_HASH_SIZE];
 	/*struct qm_frag_end free_lst_end;*/
6fa79282
 };
 
 
 
 struct qm_block* qm_malloc_init(char* address, unsigned int size);
b4d048d4
 
 #ifdef DBG_QM_MALLOC
 void* qm_malloc(struct qm_block*, unsigned int size, char* file, char* func, 
 					unsigned int line);
 #else
6fa79282
 void* qm_malloc(struct qm_block*, unsigned int size);
b4d048d4
 #endif
 
 #ifdef DBG_QM_MALLOC
 void  qm_free(struct qm_block*, void* p, char* file, char* func, 
 				unsigned int line);
 #else
6fa79282
 void  qm_free(struct qm_block*, void* p);
b4d048d4
 #endif
 
6fa79282
 void  qm_status(struct qm_block*);
 
 
 #endif