Browse Source

Improved relocation reading code for the !incore strategy.

ceriel 38 years ago
parent
commit
fabb83eddc
1 changed files with 17 additions and 4 deletions
  1. 17 4
      util/led/scan.c

+ 17 - 4
util/led/scan.c

@@ -494,9 +494,11 @@ modulsize(head)
  */
 
 static struct outrelo	*walkrelo;
+static unsigned short cnt_relos;
+static unsigned short index;
 
 startrelo(head)
-	struct outhead	*head;
+	register struct outhead	*head;
 {
 	ind_t		reloindex;
 
@@ -504,18 +506,29 @@ startrelo(head)
 		reloindex = *(ind_t *)(modulbase + IND_RELO(*head));
 		walkrelo = (struct outrelo *)address(ALLORELO, reloindex);
 	}
+	else {
+		index = 20;
+		rd_rew_relos(head);
+		cnt_relos = head->oh_nrelos;
+	}
 }
 
 struct outrelo *
 nextrelo()
 {
-	static struct outrelo	relobuf;
+	static struct outrelo	relobuf[20];
 
 	if (incore)
 		return walkrelo++;
 
-	rd_relo(&relobuf, 1);
-	return &relobuf;
+	if (index == 20) {
+		int i = cnt_relos >= 20 ? 20 : cnt_relos;
+
+		cnt_relos -= i;
+		rd_relo(relobuf, i);
+		index = 0;
+	}
+	return &relobuf[index++];
 }
 
 /* ------------------------------------------------------------------------- */