2
0
Эх сурвалжийг харах

added function qm_check\(\) which checks integrity of pkg mem.
If you have a problem with memory you can include qm_check() into lovely places in your code and at these checkpoints
integrity pf pkg memory will be checked.

Libor Chocholaty 17 жил өмнө
parent
commit
e593195402
2 өөрчлөгдсөн 53 нэмэгдсэн , 0 устгасан
  1. 52 0
      mem/q_malloc.c
  2. 1 0
      mem/q_malloc.h

+ 52 - 0
mem/q_malloc.c

@@ -632,7 +632,59 @@ void* qm_realloc(struct qm_block* qm, void* p, unsigned long size)
 }
 }
 
 
 
 
+void qm_check(struct qm_block* qm)
+{
+	struct qm_frag* f;
+	long fcount = 0;
+	
+	LOG(memlog, "DEBUG: qm_check()\n");
+	f = qm->first_frag;
+	while ((char*)f < (char*)qm->last_frag_end) {
+		fcount++;
+		/* check struct qm_frag */
+#ifdef DBG_QM_MALLOC
+		if (f->check!=ST_CHECK_PATTERN){
+			LOG(L_CRIT, "BUG: qm_*: fragm. %p (address %p) "
+					"beginning overwritten(%lx)!\n",
+					f, (char*)f + sizeof(struct qm_frag),
+					f->check);
+			qm_status(qm);
+			abort();
+		};
+#endif
+		if (f + sizeof(struct qm_frag) + f->size + sizeof(struct qm_frag_end) > qm->first_frag + qm->size) {
+			LOG(L_CRIT, "BUG: qm_*: fragm. %p (address %p) "
+				"bad size: %lu (frag end: %p > end of block: %p)\n",
+				f, (char*)f + sizeof(struct qm_frag) + sizeof(struct qm_frag_end), f->size,
+				f + sizeof(struct qm_frag) + f->size, qm->first_frag + qm->size);
+			qm_status(qm);
+			abort();
+		}
+		/* check struct qm_frag_end */
+		if (FRAG_END(f)->size != f->size) {
+			LOG(L_CRIT, "BUG: qm_*: fragm. %p (address %p) "
+				"size in qm_frag and qm_frag_end does not match: frag->size=%lu, frag_end->size=%lu)\n",
+				f, (char*)f + sizeof(struct qm_frag),
+				f->size, FRAG_END(f)->size);
+			qm_status(qm);
+			abort();
+		}
+#ifdef DBG_QM_MALLOC
+		if ((FRAG_END(f)->check1 != END_CHECK_PATTERN1) ||
+			(FRAG_END(f)->check2 != END_CHECK_PATTERN2)) {
+			LOG(L_CRIT, "BUG: qm_*: fragm. %p (address %p)"
+						" end overwritten(%lx, %lx)!\n",
+					f, (char*)f + sizeof(struct qm_frag), 
+					FRAG_END(f)->check1, FRAG_END(f)->check2);
+			qm_status(qm);
+			abort();
+		}
+#endif
+		f = FRAG_NEXT(f);
+	}
 
 
+	LOG(memlog, "DEBUG: qm_check: %lu fragments OK\n", fcount);
+}
 
 
 void qm_status(struct qm_block* qm)
 void qm_status(struct qm_block* qm)
 {
 {

+ 1 - 0
mem/q_malloc.h

@@ -148,6 +148,7 @@ void* qm_realloc(struct qm_block*, void* p, unsigned long size);
 #endif
 #endif
 
 
 void  qm_status(struct qm_block*);
 void  qm_status(struct qm_block*);
+void  qm_check(struct qm_block*);
 void  qm_info(struct qm_block*, struct mem_info*);
 void  qm_info(struct qm_block*, struct mem_info*);
 
 
 unsigned long qm_available(struct qm_block* qm);
 unsigned long qm_available(struct qm_block* qm);