rem: struct qm_frag_end *end;
context: void qm_free(struct qm_block* qm, void* p)#endif{	struct qm_frag* f;	struct qm_frag* prev;	struct qm_frag* next;	struct qm_frag_end *end;	unsigned int size;#ifdef DBG_QM_MALLOC	DBG("qm_free(%x, %x), called from %s: %s(%d)\n", qm, p, file, func, line);	if (p>(void*)qm->last_frag_end || p<(void*)qm->first_frag){		LOG(L_CRIT, "BUG: qm_free: bad pointer %x (out of memory block!) - "				"aborting\n", p);		abort();	}#endif	if (p==0) {		LOG(L_WARN, "WARNING:qm_free: free(0) called\n");		return;	}	prev=next=0;	f=(struct qm_frag*) ((char*)p-sizeof(struct qm_frag));#ifdef DBG_QM_MALLOC	qm_debug_frag(qm, f);	if (f->u.is_free){		LOG(L_CRIT, "BUG: qm_free: freeing already freed pointer,"				" first free: %s: %s(%d) - aborting\n",				f->file, f->func, f->line);		abort();	}	DBG("qm_free: freeing block alloc'ed from %s: %s(%d)\n", f->file, f->func,			f->line);#endif	size=f->size;	qm->used-=size;	qm->real_used-=size;#ifdef DBG_QM_MALLOC	qm_debug_frag(qm, f);#endif#ifdef QM_JOIN_FREE	/* join packets if possible*/	next=FRAG_NEXT(f);	if (((char*)next < (char*)qm->last_frag_end) &&( next->u.is_free)){		/* join */		qm_detach_free(qm, next);		size+=next->size+FRAG_OVERHEAD;		qm->real_used-=FRAG_OVERHEAD;	}		if (f > qm->first_frag){		prev=FRAG_PREV(f);		/*	(struct qm_frag*)((char*)f - (struct qm_frag_end*)((char*)f-								sizeof(struct qm_frag_end))->size);*/#ifdef DBG_QM_MALLOC		qm_debug_frag(qm, f);#endif		if (prev->u.is_free){			/*join*/			qm_detach_free(qm, prev);			size+=prev->size+FRAG_OVERHEAD;			qm->real_used-=FRAG_OVERHEAD;			f=prev;		}	}	f->size=size;	FRAG_END(f)->size=f->size;#endif /* QM_JOIN_FREE*/#ifdef DBG_QM_MALLOC	f->file=file;	f->func=func;	f->line=line;#endif	qm_insert_free(qm, f);}