shithub: choc

Download patch

ref: 3f54daeaa3acf590569cb397eee24731f7de6c17
parent: 6b1ac97d99599ed5e8d8557313237f3ebb102ead
author: Simon Howard <[email protected]>
date: Fri May 2 14:48:43 EDT 2008

Add W_CacheLumpNum,Name API to WAD code for releasing a lump back to
cache when it is no longer needed. Switch existing code to use the new
API instead of Z_ChangeTag.

Subversion-branch: /trunk/chocolate-doom
Subversion-revision: 1134

--- a/src/am_map.c
+++ b/src/am_map.c
@@ -525,10 +525,13 @@
 void AM_unloadPics(void)
 {
     int i;
+    char namebuf[9];
   
     for (i=0;i<10;i++)
-	Z_ChangeTag(marknums[i], PU_CACHE);
-
+    {
+	sprintf(namebuf, DEH_String("AMMNUM%d"), i);
+	W_ReleaseLumpName(namebuf);
+    }
 }
 
 void AM_clearMarks(void)
--- a/src/d_main.c
+++ b/src/d_main.c
@@ -583,7 +583,7 @@
 
 static boolean D_AddFile(char *filename)
 {
-    FILE *handle;
+    wad_file_t *handle;
 
     printf(" adding %s\n", filename);
     handle = W_AddFile(filename);
--- a/src/g_game.c
+++ b/src/g_game.c
@@ -2046,7 +2046,7 @@
 	 
     if (demoplayback) 
     { 
-	Z_ChangeTag (demobuffer, PU_CACHE); 
+        W_ReleaseLumpName(defdemoname);
 	demoplayback = false; 
 	netdemo = false;
 	netgame = false;
--- a/src/i_pcsound.c
+++ b/src/i_pcsound.c
@@ -45,6 +45,7 @@
 static uint8_t *current_sound_pos = NULL;
 static unsigned int current_sound_remaining = 0;
 static int current_sound_handle = 0;
+static int current_sound_lump_num = -1;
 
 static const float frequencies[] = {
     0.0f, 175.00f, 180.02f, 185.01f, 190.02f, 196.02f, 202.02f, 208.01f, 214.02f, 220.02f,
@@ -111,7 +112,7 @@
  
     if (current_sound_lump != NULL)
     {
-        Z_ChangeTag(current_sound_lump, PU_CACHE);
+        W_ReleaseLumpNum(current_sound_lump_num);
         current_sound_lump = NULL;
     }
 
@@ -138,6 +139,7 @@
 
     current_sound_remaining = headerlen;
     current_sound_pos = current_sound_lump + 4;
+    current_sound_lump_num = S_sfx[sound_id].lumpnum;
 
     return true;
 }
--- a/src/i_sdlsound.c
+++ b/src/i_sdlsound.c
@@ -410,7 +410,7 @@
 
     // don't need the original lump any more
   
-    Z_ChangeTag(data, PU_CACHE);
+    W_ReleaseLumpNum(lumpnum);
 
     return true;
 }
--- a/src/r_plane.c
+++ b/src/r_plane.c
@@ -372,6 +372,7 @@
     int			x;
     int			stop;
     int			angle;
+    int                 lumpnum;
 				
 #ifdef RANGECHECK
     if (ds_p - drawsegs > MAXDRAWSEGS)
@@ -421,9 +422,8 @@
 	}
 	
 	// regular flat
-	ds_source = W_CacheLumpNum(firstflat +
-				   flattranslation[pl->picnum],
-				   PU_STATIC);
+        lumpnum = firstflat + flattranslation[pl->picnum];
+	ds_source = W_CacheLumpNum(lumpnum, PU_STATIC);
 	
 	planeheight = abs(pl->height-viewz);
 	light = (pl->lightlevel >> LIGHTSEGSHIFT)+extralight;
@@ -449,6 +449,6 @@
 			pl->bottom[x]);
 	}
 	
-	Z_ChangeTag (ds_source, PU_CACHE);
+        W_ReleaseLumpNum(lumpnum);
     }
 }
--- a/src/s_sound.c
+++ b/src/s_sound.c
@@ -830,7 +830,7 @@
     {
         // Load & register it
 
-        music->data = W_CacheLumpNum(music->lumpnum, PU_MUSIC);
+        music->data = W_CacheLumpNum(music->lumpnum, PU_STATIC);
         handle = music_module->RegisterSong(music->data, 
                                             W_LumpLength(music->lumpnum));
         music->handle = handle;
@@ -868,7 +868,7 @@
 
             music_module->StopSong();
             music_module->UnRegisterSong(mus_playing->handle);
-            Z_ChangeTag(mus_playing->data, PU_CACHE);
+            W_ReleaseLumpNum(mus_playing->lumpnum);
             
             mus_playing->data = NULL;
         }
--- a/src/st_stuff.c
+++ b/src/st_stuff.c
@@ -1053,7 +1053,12 @@
 
 }
 
-void ST_loadGraphics(void)
+typedef void (*load_callback_t)(char *lumpname, patch_t **variable); 
+
+// Iterates through all graphics to be loaded or unloaded, along with
+// the variable they use, invoking the specified callback function.
+
+static void ST_loadUnloadGraphics(load_callback_t callback)
 {
 
     int		i;
@@ -1066,33 +1071,34 @@
     for (i=0;i<10;i++)
     {
 	sprintf(namebuf, DEH_String("STTNUM%d"), i);
-	tallnum[i] = (patch_t *) W_CacheLumpName(namebuf, PU_STATIC);
+        callback(namebuf, &tallnum[i]);
 
 	sprintf(namebuf, DEH_String("STYSNUM%d"), i);
-	shortnum[i] = (patch_t *) W_CacheLumpName(namebuf, PU_STATIC);
+        callback(namebuf, &shortnum[i]);
     }
 
     // Load percent key.
     //Note: why not load STMINUS here, too?
-    tallpercent = (patch_t *) W_CacheLumpName(DEH_String("STTPRCNT"), PU_STATIC);
 
+    callback(DEH_String("STTPRCNT"), &tallpercent);
+
     // key cards
     for (i=0;i<NUMCARDS;i++)
     {
 	sprintf(namebuf, DEH_String("STKEYS%d"), i);
-	keys[i] = (patch_t *) W_CacheLumpName(namebuf, PU_STATIC);
+        callback(namebuf, &keys[i]);
     }
 
     // arms background
-    armsbg = (patch_t *) W_CacheLumpName(DEH_String("STARMS"), PU_STATIC);
+    callback(DEH_String("STARMS"), &armsbg);
 
     // arms ownership widgets
-    for (i=0;i<6;i++)
+    for (i=0; i<6; i++)
     {
 	sprintf(namebuf, DEH_String("STGNUM%d"), i+2);
 
 	// gray #
-	arms[i][0] = (patch_t *) W_CacheLumpName(namebuf, PU_STATIC);
+        callback(namebuf, &arms[i][0]);
 
 	// yellow #
 	arms[i][1] = shortnum[i+2]; 
@@ -1100,36 +1106,54 @@
 
     // face backgrounds for different color players
     sprintf(namebuf, DEH_String("STFB%d"), consoleplayer);
-    faceback = (patch_t *) W_CacheLumpName(namebuf, PU_STATIC);
+    callback(namebuf, &faceback);
 
     // status bar background bits
-    sbar = (patch_t *) W_CacheLumpName(DEH_String("STBAR"), PU_STATIC);
+    callback(DEH_String("STBAR"), &sbar);
 
     // face states
     facenum = 0;
-    for (i=0;i<ST_NUMPAINFACES;i++)
+    for (i=0; i<ST_NUMPAINFACES; i++)
     {
-	for (j=0;j<ST_NUMSTRAIGHTFACES;j++)
+	for (j=0; j<ST_NUMSTRAIGHTFACES; j++)
 	{
 	    sprintf(namebuf, DEH_String("STFST%d%d"), i, j);
-	    faces[facenum++] = W_CacheLumpName(namebuf, PU_STATIC);
+            callback(namebuf, &faces[facenum]);
+            ++facenum;
 	}
 	sprintf(namebuf, DEH_String("STFTR%d0"), i);	// turn right
-	faces[facenum++] = W_CacheLumpName(namebuf, PU_STATIC);
+        callback(namebuf, &faces[facenum]);
+        ++facenum;
 	sprintf(namebuf, DEH_String("STFTL%d0"), i);	// turn left
-	faces[facenum++] = W_CacheLumpName(namebuf, PU_STATIC);
+        callback(namebuf, &faces[facenum]);
+        ++facenum;
 	sprintf(namebuf, DEH_String("STFOUCH%d"), i);	// ouch!
-	faces[facenum++] = W_CacheLumpName(namebuf, PU_STATIC);
+        callback(namebuf, &faces[facenum]);
+        ++facenum;
 	sprintf(namebuf, DEH_String("STFEVL%d"), i);	// evil grin ;)
-	faces[facenum++] = W_CacheLumpName(namebuf, PU_STATIC);
+        callback(namebuf, &faces[facenum]);
+        ++facenum;
 	sprintf(namebuf, DEH_String("STFKILL%d"), i);	// pissed off
-	faces[facenum++] = W_CacheLumpName(namebuf, PU_STATIC);
+        callback(namebuf, &faces[facenum]);
+        ++facenum;
     }
-    faces[facenum++] = W_CacheLumpName(DEH_String("STFGOD0"), PU_STATIC);
-    faces[facenum++] = W_CacheLumpName(DEH_String("STFDEAD0"), PU_STATIC);
 
+    callback(DEH_String("STFGOD0"), &faces[facenum]);
+    ++facenum;
+    callback(DEH_String("STFDEAD0"), &faces[facenum]);
+    ++facenum;
 }
 
+static void ST_loadCallback(char *lumpname, patch_t **variable)
+{
+    *variable = W_CacheLumpName(lumpname, PU_STATIC);
+}
+
+void ST_loadGraphics(void)
+{
+    ST_loadUnloadGraphics(ST_loadCallback);
+}
+
 void ST_loadData(void)
 {
     lu_palette = W_GetNumForName (DEH_String("PLAYPAL"));
@@ -1136,41 +1160,15 @@
     ST_loadGraphics();
 }
 
-void ST_unloadGraphics(void)
+static void ST_unloadCallback(char *lumpname, patch_t **variable)
 {
+    W_ReleaseLumpName(lumpname);
+    *variable = NULL;
+}
 
-    int i;
-
-    // unload the numbers, tall and short
-    for (i=0;i<10;i++)
-    {
-	Z_ChangeTag(tallnum[i], PU_CACHE);
-	Z_ChangeTag(shortnum[i], PU_CACHE);
-    }
-    // unload tall percent
-    Z_ChangeTag(tallpercent, PU_CACHE); 
-
-    // unload arms background
-    Z_ChangeTag(armsbg, PU_CACHE); 
-
-    // unload gray #'s
-    for (i=0;i<6;i++)
-	Z_ChangeTag(arms[i][0], PU_CACHE);
-    
-    // unload the key cards
-    for (i=0;i<NUMCARDS;i++)
-	Z_ChangeTag(keys[i], PU_CACHE);
-
-    Z_ChangeTag(sbar, PU_CACHE);
-    Z_ChangeTag(faceback, PU_CACHE);
-
-    for (i=0;i<ST_NUMFACES;i++)
-	Z_ChangeTag(faces[i], PU_CACHE);
-
-    // Note: nobody ain't seen no unloading
-    //   of stminus yet. Dude.
-    
-
+void ST_unloadGraphics(void)
+{
+    ST_loadUnloadGraphics(ST_unloadCallback);
 }
 
 void ST_unloadData(void)
--- a/src/w_wad.c
+++ b/src/w_wad.c
@@ -457,6 +457,15 @@
 //
 // W_CacheLumpNum
 //
+// Load a lump into memory and return a pointer to a buffer containing
+// the lump data.
+//
+// 'tag' is the type of zone memory buffer to allocate for the lump
+// (usually PU_STATIC or PU_CACHE).  If the lump is loaded as 
+// PU_STATIC, it should be released back using W_ReleaseLumpNum
+// when no longer needed (do not use Z_ChangeTag).
+//
+
 void *W_CacheLumpNum(int lump, int tag)
 {
     byte*	ptr;
@@ -489,6 +498,31 @@
 void *W_CacheLumpName(char *name, int tag)
 {
     return W_CacheLumpNum(W_GetNumForName(name), tag);
+}
+
+// 
+// Release a lump back to the cache, so that it can be reused later 
+// without having to read from disk again, or alternatively, discarded
+// if we run out of memory.
+//
+// Back in Vanilla Doom, this was just done using Z_ChangeTag 
+// directly, but now that we have WAD mmap, things are a bit more
+// complicated ...
+//
+
+void W_ReleaseLumpNum(int lump)
+{
+    if ((unsigned)lump >= numlumps)
+    {
+	I_Error ("W_ReleaseLumpNum: %i >= numlumps", lump);
+    }
+		
+    Z_ChangeTag(lumpinfo[lump].cache, PU_CACHE);
+}
+
+void W_ReleaseLumpName(char *name)
+{
+    W_ReleaseLumpNum(W_GetNumForName(name));
 }
 
 #if 0
--- a/src/w_wad.h
+++ b/src/w_wad.h
@@ -79,5 +79,8 @@
 
 extern unsigned int W_LumpNameHash(const char *s);
 
+void    W_ReleaseLumpNum(int lump);
+void    W_ReleaseLumpName(char *name);
+
 
 #endif
--- a/src/wi_stuff.c
+++ b/src/wi_stuff.c
@@ -346,9 +346,6 @@
 //	GRAPHICS
 //
 
-// background (map of levels).
-static patch_t*		bg;
-
 // You Are Here graphic
 static patch_t*		yah[2]; 
 
@@ -1547,7 +1544,12 @@
 
 }
 
-void WI_loadData(void)
+typedef void (*load_callback_t)(char *lumpname, patch_t **variable);
+
+// Common load/unload function.  Iterates over all the graphics
+// lumps to be loaded/unloaded into memory.
+
+static void WI_loadUnloadData(load_callback_t callback)
 {
     int		i;
     int		j;
@@ -1554,22 +1556,6 @@
     char	name[9];
     anim_t*	a;
 
-    if (gamemode == commercial)
-	strcpy(name, DEH_String("INTERPIC"));
-    else 
-	sprintf(name, DEH_String("WIMAP%d"), wbs->epsd);
-    
-    if ( gamemode == retail )
-    {
-      if (wbs->epsd == 3)
-	strcpy(name, DEH_String("INTERPIC"));
-    }
-
-    // background
-    bg = W_CacheLumpName(name, PU_CACHE);    
-    V_DrawPatch(0, 0, 1, bg);
-
-
     // UNUSED unsigned char *pic = screens[1];
     // if (gamemode == commercial)
     // {
@@ -1583,33 +1569,28 @@
 
     if (gamemode == commercial)
     {
-	NUMCMAPS = 32;								
-	lnames = (patch_t **) Z_Malloc(sizeof(patch_t*) * NUMCMAPS,
-				       PU_STATIC, 0);
 	for (i=0 ; i<NUMCMAPS ; i++)
 	{								
 	    sprintf(name, DEH_String("CWILV%2.2d"), i);
-	    lnames[i] = W_CacheLumpName(name, PU_STATIC);
+            callback(name, &lnames[i]);
 	}					
     }
     else
     {
-	lnames = (patch_t **) Z_Malloc(sizeof(patch_t*) * NUMMAPS,
-				       PU_STATIC, 0);
 	for (i=0 ; i<NUMMAPS ; i++)
 	{
 	    sprintf(name, DEH_String("WILV%d%d"), wbs->epsd, i);
-	    lnames[i] = W_CacheLumpName(name, PU_STATIC);
+            callback(name, &lnames[i]);
 	}
 
 	// you are here
-	yah[0] = W_CacheLumpName(DEH_String("WIURH0"), PU_STATIC);
+        callback(DEH_String("WIURH0"), &yah[0]);
 
 	// you are here (alt.)
-	yah[1] = W_CacheLumpName(DEH_String("WIURH1"), PU_STATIC);
+        callback(DEH_String("WIURH1"), &yah[1]);
 
 	// splat
-	splat = W_CacheLumpName(DEH_String("WISPLAT"), PU_STATIC); 
+        callback(DEH_String("WISPLAT"), &splat);
 	
 	if (wbs->epsd < 3)
 	{
@@ -1624,7 +1605,7 @@
 			// animations
 			sprintf(name, DEH_String("WIA%d%.2d%.2d"), 
 				      wbs->epsd, j, i);  
-			a->p[i] = W_CacheLumpName(name, PU_STATIC);
+                        callback(name, &a->p[i]);
 		    }
 		    else
 		    {
@@ -1637,32 +1618,32 @@
     }
 
     // More hacks on minus sign.
-    wiminus = W_CacheLumpName(DEH_String("WIMINUS"), PU_STATIC); 
+    callback(DEH_String("WIMINUS"), &wiminus);
 
     for (i=0;i<10;i++)
     {
 	 // numbers 0-9
 	sprintf(name, DEH_String("WINUM%d"), i);     
-	num[i] = W_CacheLumpName(name, PU_STATIC);
+        callback(name, &num[i]);
     }
 
     // percent sign
-    percent = W_CacheLumpName(DEH_String("WIPCNT"), PU_STATIC);
+    callback(DEH_String("WIPCNT"), &percent);
 
     // "finished"
-    finished = W_CacheLumpName(DEH_String("WIF"), PU_STATIC);
+    callback(DEH_String("WIF"), &finished);
 
     // "entering"
-    entering = W_CacheLumpName(DEH_String("WIENTER"), PU_STATIC);
+    callback(DEH_String("WIENTER"), &entering);
 
     // "kills"
-    kills = W_CacheLumpName(DEH_String("WIOSTK"), PU_STATIC);   
+    callback(DEH_String("WIOSTK"), &kills);
 
     // "scrt"
-    secret = W_CacheLumpName(DEH_String("WIOSTS"), PU_STATIC);
+    callback(DEH_String("WIOSTS"), &secret);
 
      // "secret"
-    sp_secret = W_CacheLumpName(DEH_String("WISCRT2"), PU_STATIC);
+    callback(DEH_String("WISCRT2"), &sp_secret);
 
     // french wad uses WIOBJ (?)
     if (W_CheckNumForName(DEH_String("WIOBJ")) >= 0)
@@ -1669,118 +1650,117 @@
     {
     	// "items"
     	if (netgame && !deathmatch)
-            items = W_CacheLumpName(DEH_String("WIOBJ"), PU_STATIC);    
+            callback(DEH_String("WIOBJ"), &items);
     	else
-            items = W_CacheLumpName(DEH_String("WIOSTI"), PU_STATIC);
+            callback(DEH_String("WIOSTI"), &items);
     } else {
-	items = W_CacheLumpName(DEH_String("WIOSTI"), PU_STATIC);
+        callback(DEH_String("WIOSTI"), &items);
     }
 
     // "frgs"
-    frags = W_CacheLumpName(DEH_String("WIFRGS"), PU_STATIC);    
+    callback(DEH_String("WIFRGS"), &frags);
 
     // ":"
-    colon = W_CacheLumpName(DEH_String("WICOLON"), PU_STATIC); 
+    callback(DEH_String("WICOLON"), &colon);
 
     // "time"
-    timepatch = W_CacheLumpName(DEH_String("WITIME"), PU_STATIC);   
+    callback(DEH_String("WITIME"), &timepatch);   
 
     // "sucks"
-    sucks = W_CacheLumpName(DEH_String("WISUCKS"), PU_STATIC);  
+    callback(DEH_String("WISUCKS"), &sucks);  
 
     // "par"
-    par = W_CacheLumpName(DEH_String("WIPAR"), PU_STATIC);   
+    callback(DEH_String("WIPAR"), &par);   
 
     // "killers" (vertical)
-    killers = W_CacheLumpName(DEH_String("WIKILRS"), PU_STATIC);
+    callback(DEH_String("WIKILRS"), &killers);
 
     // "victims" (horiz)
-    victims = W_CacheLumpName(DEH_String("WIVCTMS"), PU_STATIC);
+    callback(DEH_String("WIVCTMS"), &victims);
 
     // "total"
-    total = W_CacheLumpName(DEH_String("WIMSTT"), PU_STATIC);   
+    callback(DEH_String("WIMSTT"), &total);   
 
-    // your face
-    star = W_CacheLumpName(DEH_String("STFST01"), PU_STATIC);
-
-    // dead face
-    bstar = W_CacheLumpName(DEH_String("STFDEAD0"), PU_STATIC);    
-
     for (i=0 ; i<MAXPLAYERS ; i++)
     {
 	// "1,2,3,4"
 	sprintf(name, DEH_String("STPB%d"), i);      
-	p[i] = W_CacheLumpName(name, PU_STATIC);
+        callback(name, &p[i]);
 
 	// "1,2,3,4"
 	sprintf(name, DEH_String("WIBP%d"), i+1);     
-	bp[i] = W_CacheLumpName(name, PU_STATIC);
+        callback(name, &bp[i]);
     }
 
 }
 
-void WI_unloadData(void)
+static void WI_loadCallback(char *name, patch_t **variable)
 {
-    int		i;
-    int		j;
+    *variable = W_CacheLumpName(name, PU_STATIC);
+}
 
-    Z_ChangeTag(wiminus, PU_CACHE);
+void WI_loadData(void)
+{
+    char bg_lumpname[9];
+    patch_t *bg;
 
-    for (i=0 ; i<10 ; i++)
-	Z_ChangeTag(num[i], PU_CACHE);
-    
     if (gamemode == commercial)
     {
-  	for (i=0 ; i<NUMCMAPS ; i++)
-	    Z_ChangeTag(lnames[i], PU_CACHE);
+	NUMCMAPS = 32;								
+	lnames = (patch_t **) Z_Malloc(sizeof(patch_t*) * NUMCMAPS,
+				       PU_STATIC, NULL);
     }
     else
     {
-	Z_ChangeTag(yah[0], PU_CACHE);
-	Z_ChangeTag(yah[1], PU_CACHE);
+	lnames = (patch_t **) Z_Malloc(sizeof(patch_t*) * NUMMAPS,
+				       PU_STATIC, NULL);
+    }
 
-	Z_ChangeTag(splat, PU_CACHE);
+    WI_loadUnloadData(WI_loadCallback);
 
-	for (i=0 ; i<NUMMAPS ; i++)
-	    Z_ChangeTag(lnames[i], PU_CACHE);
-	
-	if (wbs->epsd < 3)
-	{
-	    for (j=0;j<NUMANIMS[wbs->epsd];j++)
-	    {
-		if (wbs->epsd != 1 || j != 8)
-		    for (i=0;i<anims[wbs->epsd][j].nanims;i++)
-			Z_ChangeTag(anims[wbs->epsd][j].p[i], PU_CACHE);
-	    }
-	}
+    // These two graphics are special cased because we're sharing
+    // them with the status bar code
+
+    // your face
+    star = W_CacheLumpName(DEH_String("STFST01"), PU_STATIC);
+
+    // dead face
+    bstar = W_CacheLumpName(DEH_String("STFDEAD0"), PU_STATIC);
+
+    // Background image
+
+    if (gamemode == commercial)
+    {
+	strcpy(bg_lumpname, DEH_String("INTERPIC"));
     }
+    else if (gamemode == retail && wbs->epsd == 3)
+    {
+	strcpy(bg_lumpname, DEH_String("INTERPIC"));
+    }
+    else 
+    {
+	sprintf(bg_lumpname, DEH_String("WIMAP%d"), wbs->epsd);
+    }
     
-    Z_Free(lnames);
+    bg = W_CacheLumpName(bg_lumpname, PU_CACHE);
+    V_DrawPatch(0, 0, 1, bg);
+}
 
-    Z_ChangeTag(percent, PU_CACHE);
-    Z_ChangeTag(colon, PU_CACHE);
-    Z_ChangeTag(finished, PU_CACHE);
-    Z_ChangeTag(entering, PU_CACHE);
-    Z_ChangeTag(kills, PU_CACHE);
-    Z_ChangeTag(secret, PU_CACHE);
-    Z_ChangeTag(sp_secret, PU_CACHE);
-    Z_ChangeTag(items, PU_CACHE);
-    Z_ChangeTag(frags, PU_CACHE);
-    Z_ChangeTag(timepatch, PU_CACHE);
-    Z_ChangeTag(sucks, PU_CACHE);
-    Z_ChangeTag(par, PU_CACHE);
+static void WI_unloadCallback(char *name, patch_t **variable)
+{
+    W_ReleaseLumpName(name);
+    *variable = NULL;
+}
 
-    Z_ChangeTag(victims, PU_CACHE);
-    Z_ChangeTag(killers, PU_CACHE);
-    Z_ChangeTag(total, PU_CACHE);
-    //  Z_ChangeTag(star, PU_CACHE);
-    //  Z_ChangeTag(bstar, PU_CACHE);
-    
-    for (i=0 ; i<MAXPLAYERS ; i++)
-	Z_ChangeTag(p[i], PU_CACHE);
+void WI_unloadData(void)
+{
+    WI_loadUnloadData(WI_unloadCallback);
 
-    for (i=0 ; i<MAXPLAYERS ; i++)
-	Z_ChangeTag(bp[i], PU_CACHE);
+    // We do not free these lumps as they are shared with the status
+    // bar code.
+   
+    // W_ReleaseLumpName("STFST01");
+    // W_ReleaseLumpName("STFDEAD0");
 }
 
 void WI_Drawer (void)