[util] Make hunk (optionally) thread-safe

For now, the functions check for a null hunk pointer and use the global
hunk (initialized via Memory_Init) if necessary. However, Hunk_Init is
available (and used by Memory_Init) to create a hunk from any arbitrary
memory block. So long as that block is 64-byte aligned, allocations
within the hunk will remain 64-byte aligned.
This commit is contained in:
Bill Currie 2021-07-28 15:01:45 +09:00
parent 8fdd9c1f5a
commit 54604d9aa2
51 changed files with 375 additions and 295 deletions

View file

@ -106,13 +106,16 @@ void Z_SetError (memzone_t *zone, void (*err) (void *data, const char *msg),
void *data); void *data);
void Z_CheckPointer (const memzone_t *zone, const void *ptr, size_t size); void Z_CheckPointer (const memzone_t *zone, const void *ptr, size_t size);
void Hunk_Print (qboolean all); typedef struct memhunk_s memhunk_t;
void *Hunk_Alloc (size_t size); // returns 0 filled memory
void *Hunk_AllocName (size_t size, const char *name); memhunk_t *Hunk_Init (void *buf, size_t size);
size_t Hunk_LowMark (void) __attribute__((pure)); void Hunk_Print (memhunk_t *hunk, qboolean all);
void Hunk_FreeToLowMark (size_t mark); void Hunk_Check (memhunk_t *hunk);
void *Hunk_TempAlloc (size_t size); void *Hunk_Alloc (memhunk_t *hunk, size_t size); // returns 0 filled memory
void Hunk_Check (void); void *Hunk_AllocName (memhunk_t *hunk, size_t size, const char *name);
size_t Hunk_LowMark (memhunk_t *hunk) __attribute__((pure));
void Hunk_FreeToLowMark (memhunk_t *hunk, size_t mark);
void *Hunk_TempAlloc (memhunk_t *hunk, size_t size);

View file

@ -86,7 +86,7 @@ load_file (progs_t *pr, const char *path, off_t *size)
static void * static void *
allocate_progs_mem (progs_t *pr, int size) allocate_progs_mem (progs_t *pr, int size)
{ {
return Hunk_AllocName (size, pr->progs_name); return Hunk_AllocName (0, size, pr->progs_name);
} }
static void static void

View file

@ -69,7 +69,7 @@ GIB_Exec_Override_f (void)
return; return;
} }
mark = Hunk_LowMark (); mark = Hunk_LowMark (0);
f = (char *) QFS_LoadHunkFile (QFS_FOpenFile (Cmd_Argv (1))); f = (char *) QFS_LoadHunkFile (QFS_FOpenFile (Cmd_Argv (1)));
if (!f) { if (!f) {
Sys_Printf ("couldn't exec %s\n", Cmd_Argv (1)); Sys_Printf ("couldn't exec %s\n", Cmd_Argv (1));
@ -95,7 +95,7 @@ GIB_Exec_Override_f (void)
Cmd_Argv (0), Cmd_Argv (1)); Cmd_Argv (0), Cmd_Argv (1));
} else } else
Cbuf_InsertText (cbuf_active, f); Cbuf_InsertText (cbuf_active, f);
Hunk_FreeToLowMark (mark); Hunk_FreeToLowMark (0, mark);
} }
VISIBLE void VISIBLE void

View file

@ -64,8 +64,8 @@ LoadPCX (QFile *f, qboolean convert, const byte *pal, int load)
fsize = Qfilesize(f); fsize = Qfilesize(f);
} }
// parse the PCX file // parse the PCX file
pcx_mark = Hunk_LowMark (); pcx_mark = Hunk_LowMark (0);
pcx = Hunk_AllocName (fsize, "PCX"); pcx = Hunk_AllocName (0, fsize, "PCX");
Qread (f, pcx, fsize); Qread (f, pcx, fsize);
pcx->xmax = LittleShort (pcx->xmax); pcx->xmax = LittleShort (pcx->xmax);
@ -84,7 +84,7 @@ LoadPCX (QFile *f, qboolean convert, const byte *pal, int load)
Sys_Printf ("Bad pcx file: %x %d %d %d\n", Sys_Printf ("Bad pcx file: %x %d %d %d\n",
pcx->manufacturer, pcx->version, pcx->encoding, pcx->manufacturer, pcx->version, pcx->encoding,
pcx->bits_per_pixel); pcx->bits_per_pixel);
Hunk_FreeToLowMark (pcx_mark); Hunk_FreeToLowMark (0, pcx_mark);
return 0; return 0;
} }
@ -93,12 +93,12 @@ LoadPCX (QFile *f, qboolean convert, const byte *pal, int load)
count = load ? (pcx->xmax + 1) * (pcx->ymax + 1) : 0; count = load ? (pcx->xmax + 1) * (pcx->ymax + 1) : 0;
if (convert) { if (convert) {
tex = Hunk_TempAlloc (sizeof (tex_t) + count * 3); tex = Hunk_TempAlloc (0, sizeof (tex_t) + count * 3);
tex->data = (byte *) (tex + 1); tex->data = (byte *) (tex + 1);
tex->format = tex_rgb; tex->format = tex_rgb;
tex->palette = 0; tex->palette = 0;
} else { } else {
tex = Hunk_TempAlloc (sizeof (tex_t) + count); tex = Hunk_TempAlloc (0, sizeof (tex_t) + count);
tex->data = (byte *) (tex + 1); tex->data = (byte *) (tex + 1);
tex->format = tex_palette; tex->format = tex_palette;
if (pal) if (pal)
@ -110,7 +110,7 @@ LoadPCX (QFile *f, qboolean convert, const byte *pal, int load)
tex->height = pcx->ymax + 1; tex->height = pcx->ymax + 1;
tex->loaded = load; tex->loaded = load;
if (!load) { if (!load) {
Hunk_FreeToLowMark (pcx_mark); Hunk_FreeToLowMark (0, pcx_mark);
return tex; return tex;
} }
pix = tex->data; pix = tex->data;
@ -144,7 +144,7 @@ LoadPCX (QFile *f, qboolean convert, const byte *pal, int load)
} }
dataByte++; dataByte++;
} }
Hunk_FreeToLowMark (pcx_mark); Hunk_FreeToLowMark (0, pcx_mark);
if (count || runLength) { if (count || runLength) {
Sys_Printf ("PCX was malformed. You should delete it.\n"); Sys_Printf ("PCX was malformed. You should delete it.\n");
return 0; return 0;
@ -162,7 +162,7 @@ EncodePCX (const byte *data, int width, int height,
const byte *dataend; const byte *dataend;
size = width * height * 2 + 1000; size = width * height * 2 + 1000;
if (!(pcx = Hunk_TempAlloc (size))) { if (!(pcx = Hunk_TempAlloc (0, size))) {
Sys_Printf ("EncodePCX: not enough memory\n"); Sys_Printf ("EncodePCX: not enough memory\n");
return 0; return 0;
} }

View file

@ -162,10 +162,10 @@ LoadPNG (QFile *infile, int load)
/* Allocate tex_t structure */ /* Allocate tex_t structure */
rowbytes = png_get_rowbytes(png_ptr, info_ptr); rowbytes = png_get_rowbytes(png_ptr, info_ptr);
tex = Hunk_TempAlloc (sizeof (tex_t) + height * rowbytes); tex = Hunk_TempAlloc (0, sizeof (tex_t) + height * rowbytes);
tex->data = (byte *) (tex + 1); tex->data = (byte *) (tex + 1);
} else { } else {
tex = Hunk_TempAlloc (sizeof (tex_t)); tex = Hunk_TempAlloc (0, sizeof (tex_t));
tex->data = 0; tex->data = 0;
} }

View file

@ -264,7 +264,7 @@ parse_colormap (TargaHeader *targa, byte **dataByte)
case 24: case 24:
case 16: case 16:
case 15: case 15:
cmap = Hunk_AllocName (256 * sizeof (cmap_t), "TGA cmap"); cmap = Hunk_AllocName (0, 256 * sizeof (cmap_t), "TGA cmap");
break; break;
default: default:
Sys_Error ("LoadTGA: unsupported color map size"); Sys_Error ("LoadTGA: unsupported color map size");
@ -632,8 +632,8 @@ LoadTGA (QFile *fin, int load)
if (load) { if (load) {
fsize = Qfilesize (fin); fsize = Qfilesize (fin);
} }
targa_mark = Hunk_LowMark (); targa_mark = Hunk_LowMark (0);
targa = Hunk_AllocName (fsize, "TGA"); targa = Hunk_AllocName (0, fsize, "TGA");
Qread (fin, targa, fsize); Qread (fin, targa, fsize);
targa->colormap_index = LittleShort (targa->colormap_index); targa->colormap_index = LittleShort (targa->colormap_index);
@ -646,7 +646,7 @@ LoadTGA (QFile *fin, int load)
if (targa->image_type >= NUM_DECODERS if (targa->image_type >= NUM_DECODERS
|| !(decode = decoder_functions[targa->image_type])) { || !(decode = decoder_functions[targa->image_type])) {
Sys_Printf ("LoadTGA: Unsupported targa type"); Sys_Printf ("LoadTGA: Unsupported targa type");
Hunk_FreeToLowMark (targa_mark); Hunk_FreeToLowMark (0, targa_mark);
return 0; return 0;
} }
@ -655,7 +655,7 @@ LoadTGA (QFile *fin, int load)
} else { } else {
numPixels = 0; numPixels = 0;
} }
tex = Hunk_TempAlloc (sizeof (tex_t) + numPixels * 4); tex = Hunk_TempAlloc (0, sizeof (tex_t) + numPixels * 4);
tex->data = (byte *) (tex + 1); tex->data = (byte *) (tex + 1);
tex->width = targa->width; tex->width = targa->width;
tex->height = targa->height; tex->height = targa->height;
@ -670,7 +670,7 @@ LoadTGA (QFile *fin, int load)
decode (targa, tex, dataByte); decode (targa, tex, dataByte);
} }
Hunk_FreeToLowMark (targa_mark); Hunk_FreeToLowMark (0, targa_mark);
return tex; return tex;
} }

View file

@ -475,7 +475,7 @@ gl_Mod_MakeAliasModelDisplayLists (mod_alias_ctx_t *alias_ctx, void *_m,
// save the data out // save the data out
header->poseverts = numorder; header->poseverts = numorder;
cmds = Hunk_Alloc (numcommands * sizeof (int)); cmds = Hunk_Alloc (0, numcommands * sizeof (int));
header->commands = (byte *) cmds - (byte *) header; header->commands = (byte *) cmds - (byte *) header;
memcpy (cmds, commands, numcommands * sizeof (int)); memcpy (cmds, commands, numcommands * sizeof (int));
@ -490,7 +490,7 @@ gl_Mod_MakeAliasModelDisplayLists (mod_alias_ctx_t *alias_ctx, void *_m,
} }
header->poseverts = numorder; header->poseverts = numorder;
tex_coord = Hunk_Alloc (numorder * sizeof(tex_coord_t)); tex_coord = Hunk_Alloc (0, numorder * sizeof(tex_coord_t));
header->tex_coord = (byte *) tex_coord - (byte *) header; header->tex_coord = (byte *) tex_coord - (byte *) header;
for (i=0; i < numorder; i++) { for (i=0; i < numorder; i++) {
float s, t; float s, t;
@ -510,7 +510,7 @@ gl_Mod_MakeAliasModelDisplayLists (mod_alias_ctx_t *alias_ctx, void *_m,
if (extra) { if (extra) {
trivertx16_t *verts; trivertx16_t *verts;
verts = Hunk_Alloc (header->numposes * header->poseverts verts = Hunk_Alloc (0, header->numposes * header->poseverts
* sizeof (trivertx16_t)); * sizeof (trivertx16_t));
header->posedata = (byte *) verts - (byte *) header; header->posedata = (byte *) verts - (byte *) header;
for (i = 0; i < header->numposes; i++) { for (i = 0; i < header->numposes; i++) {
@ -532,7 +532,7 @@ gl_Mod_MakeAliasModelDisplayLists (mod_alias_ctx_t *alias_ctx, void *_m,
} }
} else { } else {
trivertx_t *verts; trivertx_t *verts;
verts = Hunk_Alloc (header->numposes * header->poseverts verts = Hunk_Alloc (0, header->numposes * header->poseverts
* sizeof (trivertx_t)); * sizeof (trivertx_t));
header->posedata = (byte *) verts - (byte *) header; header->posedata = (byte *) verts - (byte *) header;
for (i = 0; i < header->numposes; i++) { for (i = 0; i < header->numposes; i++) {

View file

@ -63,7 +63,7 @@ gl_Mod_LoadSkin (mod_alias_ctx_t *alias_ctx, byte *skin, int skinsize,
int fb_texnum = 0, texnum = 0; int fb_texnum = 0, texnum = 0;
dstring_t *name = dstring_new (); dstring_t *name = dstring_new ();
pskin = Hunk_AllocName (skinsize, alias_ctx->mod->name); pskin = Hunk_AllocName (0, skinsize, alias_ctx->mod->name);
skindesc->skin = (byte *) pskin - (byte *) header; skindesc->skin = (byte *) pskin - (byte *) header;
memcpy (pskin, skin, skinsize); memcpy (pskin, skin, skinsize);

View file

@ -66,7 +66,7 @@ Mod_LoadAllSkins (mod_alias_ctx_t *alias_ctx, int numskins,
Sys_Error ("Mod_LoadAliasModel: Invalid # of skins: %d", numskins); Sys_Error ("Mod_LoadAliasModel: Invalid # of skins: %d", numskins);
skinsize = header->mdl.skinwidth * header->mdl.skinheight; skinsize = header->mdl.skinwidth * header->mdl.skinheight;
pskindesc = Hunk_AllocName (numskins * sizeof (maliasskindesc_t), pskindesc = Hunk_AllocName (0, numskins * sizeof (maliasskindesc_t),
alias_ctx->mod->name); alias_ctx->mod->name);
*pskinindex = (byte *) pskindesc - (byte *) header; *pskinindex = (byte *) pskindesc - (byte *) header;
@ -83,13 +83,13 @@ Mod_LoadAllSkins (mod_alias_ctx_t *alias_ctx, int numskins,
groupskins = LittleLong (pinskingroup->numskins); groupskins = LittleLong (pinskingroup->numskins);
t = field_offset (maliasskingroup_t, skindescs[groupskins]); t = field_offset (maliasskingroup_t, skindescs[groupskins]);
paliasskingroup = Hunk_AllocName (t, alias_ctx->mod->name); paliasskingroup = Hunk_AllocName (0, t, alias_ctx->mod->name);
paliasskingroup->numskins = groupskins; paliasskingroup->numskins = groupskins;
pskindesc[snum].skin = (byte *) paliasskingroup - (byte *) header; pskindesc[snum].skin = (byte *) paliasskingroup - (byte *) header;
pinskinintervals = (daliasskininterval_t *) (pinskingroup + 1); pinskinintervals = (daliasskininterval_t *) (pinskingroup + 1);
poutskinintervals = Hunk_AllocName (groupskins * sizeof (float), poutskinintervals = Hunk_AllocName (0, groupskins * sizeof (float),
alias_ctx->mod->name); alias_ctx->mod->name);
paliasskingroup->intervals = paliasskingroup->intervals =
(byte *) poutskinintervals - (byte *) header; (byte *) poutskinintervals - (byte *) header;
@ -173,8 +173,9 @@ Mod_LoadAliasGroup (mod_alias_ctx_t *alias_ctx, void *pin, int *posenum,
frame->firstpose = (*posenum); frame->firstpose = (*posenum);
frame->numposes = numframes; frame->numposes = numframes;
paliasgroup = Hunk_AllocName (field_offset (maliasgroup_t, paliasgroup = Hunk_AllocName (0, field_offset (maliasgroup_t,
frames[numframes]), mod->name); frames[numframes]),
mod->name);
paliasgroup->numframes = numframes; paliasgroup->numframes = numframes;
frame->frame = (byte *) paliasgroup - (byte *) header; frame->frame = (byte *) paliasgroup - (byte *) header;
@ -187,7 +188,7 @@ Mod_LoadAliasGroup (mod_alias_ctx_t *alias_ctx, void *pin, int *posenum,
alias_ctx->aliasbboxmaxs); alias_ctx->aliasbboxmaxs);
pin_intervals = (daliasinterval_t *) (pingroup + 1); pin_intervals = (daliasinterval_t *) (pingroup + 1);
poutintervals = Hunk_AllocName (numframes * sizeof (float), mod->name); poutintervals = Hunk_AllocName (0, numframes * sizeof (float), mod->name);
paliasgroup->intervals = (byte *) poutintervals - (byte *) header; paliasgroup->intervals = (byte *) poutintervals - (byte *) header;
frame->interval = LittleFloat (pin_intervals->interval); frame->interval = LittleFloat (pin_intervals->interval);
for (i = 0; i < numframes; i++) { for (i = 0; i < numframes; i++) {
@ -237,7 +238,7 @@ Mod_LoadAliasModel (model_t *mod, void *buffer, cache_allocator_t allocator)
CRC_Init (&crc); CRC_Init (&crc);
CRC_ProcessBlock (buffer, &crc, qfs_filesize); CRC_ProcessBlock (buffer, &crc, qfs_filesize);
start = Hunk_LowMark (); start = Hunk_LowMark (0);
pinmodel = (mdl_t *) buffer; pinmodel = (mdl_t *) buffer;
@ -249,7 +250,7 @@ Mod_LoadAliasModel (model_t *mod, void *buffer, cache_allocator_t allocator)
// allocate space for a working header, plus all the data except the // allocate space for a working header, plus all the data except the
// frames, skin and group info // frames, skin and group info
size = field_offset (aliashdr_t, frames[LittleLong (pinmodel->numframes)]); size = field_offset (aliashdr_t, frames[LittleLong (pinmodel->numframes)]);
header = Hunk_AllocName (size, mod->name); header = Hunk_AllocName (0, size, mod->name);
memset (header, 0, size); memset (header, 0, size);
alias_ctx.header = header; alias_ctx.header = header;
pmodel = &header->mdl; pmodel = &header->mdl;
@ -375,14 +376,14 @@ Mod_LoadAliasModel (model_t *mod, void *buffer, cache_allocator_t allocator)
// move the complete, relocatable alias model to the cache // move the complete, relocatable alias model to the cache
if (m_funcs->alias_cache) { if (m_funcs->alias_cache) {
end = Hunk_LowMark (); end = Hunk_LowMark (0);
total = end - start; total = end - start;
mem = allocator (&mod->cache, total, mod->name); mem = allocator (&mod->cache, total, mod->name);
if (mem) if (mem)
memcpy (mem, header, total); memcpy (mem, header, total);
Hunk_FreeToLowMark (start); Hunk_FreeToLowMark (0, start);
mod->aliashdr = 0; mod->aliashdr = 0;
} else { } else {
mod->aliashdr = header; mod->aliashdr = header;

View file

@ -56,7 +56,7 @@ sw_Mod_LoadSkin (mod_alias_ctx_t *alias_ctx, byte *skin,
{ {
byte *pskin; byte *pskin;
pskin = Hunk_AllocName (skinsize, alias_ctx->mod->name); pskin = Hunk_AllocName (0, skinsize, alias_ctx->mod->name);
skindesc->skin = (byte *) pskin - (byte *) alias_ctx->header; skindesc->skin = (byte *) pskin - (byte *) alias_ctx->header;
memcpy (pskin, skin, skinsize); memcpy (pskin, skin, skinsize);
@ -75,7 +75,7 @@ process_frame (mod_alias_ctx_t *alias_ctx, maliasframedesc_t *frame,
if (extra) if (extra)
size *= 2; size *= 2;
frame_verts = Hunk_AllocName (size, alias_ctx->mod->name); frame_verts = Hunk_AllocName (0, size, alias_ctx->mod->name);
frame->frame = (byte *) frame_verts - (byte *) header; frame->frame = (byte *) frame_verts - (byte *) header;
// The low-order 8 bits (actually, fractional) are completely separate // The low-order 8 bits (actually, fractional) are completely separate
@ -96,9 +96,9 @@ sw_Mod_MakeAliasModelDisplayLists (mod_alias_ctx_t *alias_ctx, void *_m,
stvert_t *stverts; stvert_t *stverts;
mtriangle_t *tris; mtriangle_t *tris;
stverts = (stvert_t *) Hunk_AllocName (numv * sizeof (stvert_t), stverts = (stvert_t *) Hunk_AllocName (0, numv * sizeof (stvert_t),
alias_ctx->mod->name); alias_ctx->mod->name);
tris = (mtriangle_t *) Hunk_AllocName (numt * sizeof (mtriangle_t), tris = (mtriangle_t *) Hunk_AllocName (0, numt * sizeof (mtriangle_t),
alias_ctx->mod->name); alias_ctx->mod->name);
header->stverts = (byte *) stverts - (byte *) header; header->stverts = (byte *) stverts - (byte *) header;

View file

@ -121,7 +121,7 @@ Vulkan_Mod_LoadSkin (mod_alias_ctx_t *alias_ctx, byte *skinpix, int skinsize,
byte *tskin; byte *tskin;
int w, h; int w, h;
skin = Hunk_Alloc (sizeof (qfv_alias_skin_t)); skin = Hunk_Alloc (0, sizeof (qfv_alias_skin_t));
QuatCopy (vid.palette32 + (TOP_RANGE + 15) * 4, skin->colora); QuatCopy (vid.palette32 + (TOP_RANGE + 15) * 4, skin->colora);
QuatCopy (vid.palette32 + (BOTTOM_RANGE + 15) * 4, skin->colorb); QuatCopy (vid.palette32 + (BOTTOM_RANGE + 15) * 4, skin->colorb);
skindesc->skin = (byte *) skin - (byte *) header; skindesc->skin = (byte *) skin - (byte *) header;
@ -449,7 +449,7 @@ Vulkan_Mod_MakeAliasModelDisplayLists (mod_alias_ctx_t *alias_ctx, void *_m,
QFV_PacketSubmit (packet); QFV_PacketSubmit (packet);
QFV_DestroyStagingBuffer (stage); QFV_DestroyStagingBuffer (stage);
qfv_alias_mesh_t *mesh = Hunk_Alloc (sizeof (qfv_alias_mesh_t)); qfv_alias_mesh_t *mesh = Hunk_Alloc (0, sizeof (qfv_alias_mesh_t));
mesh->vertex_buffer = vbuff; mesh->vertex_buffer = vbuff;
mesh->uv_buffer = uvbuff; mesh->uv_buffer = uvbuff;
mesh->index_buffer = ibuff; mesh->index_buffer = ibuff;

View file

@ -181,7 +181,8 @@ gl_Mod_LoadLighting (model_t *mod, bsp_t *bsp)
dstring_delete (litfilename); dstring_delete (litfilename);
return; return;
} }
brush->lightdata = Hunk_AllocName (bsp->lightdatasize * mod_lightmap_bytes, brush->lightdata = Hunk_AllocName (0,
bsp->lightdatasize * mod_lightmap_bytes,
litfilename->str); litfilename->str);
in = bsp->lightdata; in = bsp->lightdata;
out = brush->lightdata; out = brush->lightdata;
@ -283,7 +284,7 @@ SubdividePolygon (int numverts, float *verts)
return; return;
} }
poly = Hunk_Alloc (sizeof (glpoly_t) + (numverts - 4) * VERTEXSIZE * poly = Hunk_Alloc (0, sizeof (glpoly_t) + (numverts - 4) * VERTEXSIZE *
sizeof (float)); sizeof (float));
poly->next = warpface->polys; poly->next = warpface->polys;
warpface->polys = poly; warpface->polys = poly;

View file

@ -156,6 +156,6 @@ glsl_Mod_LoadLighting (model_t *mod, bsp_t *bsp)
mod->brush.lightdata = NULL; mod->brush.lightdata = NULL;
return; return;
} }
mod->brush.lightdata = Hunk_AllocName (bsp->lightdatasize, mod->name); mod->brush.lightdata = Hunk_AllocName (0, bsp->lightdatasize, mod->name);
memcpy (mod->brush.lightdata, bsp->lightdata, bsp->lightdatasize); memcpy (mod->brush.lightdata, bsp->lightdata, bsp->lightdatasize);
} }

View file

@ -260,7 +260,8 @@ Mod_LoadTextures (model_t *mod, bsp_t *bsp)
m = (dmiptexlump_t *) bsp->texdata; m = (dmiptexlump_t *) bsp->texdata;
brush->numtextures = m->nummiptex; brush->numtextures = m->nummiptex;
brush->textures = Hunk_AllocName (m->nummiptex * sizeof (*brush->textures), brush->textures = Hunk_AllocName (0,
m->nummiptex * sizeof (*brush->textures),
mod->name); mod->name);
for (i = 0; i < m->nummiptex; i++) { for (i = 0; i < m->nummiptex; i++) {
@ -275,7 +276,7 @@ Mod_LoadTextures (model_t *mod, bsp_t *bsp)
if ((mt->width & 15) || (mt->height & 15)) if ((mt->width & 15) || (mt->height & 15))
Sys_Error ("Texture %s is not 16 aligned", mt->name); Sys_Error ("Texture %s is not 16 aligned", mt->name);
pixels = mt->width * mt->height / 64 * 85; pixels = mt->width * mt->height / 64 * 85;
tx = Hunk_AllocName (sizeof (texture_t) + pixels, mod->name); tx = Hunk_AllocName (0, sizeof (texture_t) + pixels, mod->name);
brush->textures[i] = tx; brush->textures[i] = tx;
@ -296,7 +297,7 @@ Mod_LoadTextures (model_t *mod, bsp_t *bsp)
size_t render_size = mod_funcs->texture_render_size; size_t render_size = mod_funcs->texture_render_size;
byte *render_data = 0; byte *render_data = 0;
if (render_size) { if (render_size) {
render_data = Hunk_AllocName (m->nummiptex * render_size, render_data = Hunk_AllocName (0, m->nummiptex * render_size,
mod->name); mod->name);
} }
for (i = 0; i < m->nummiptex; i++) { for (i = 0; i < m->nummiptex; i++) {
@ -397,7 +398,7 @@ Mod_LoadVisibility (model_t *mod, bsp_t *bsp)
mod->brush.visdata = NULL; mod->brush.visdata = NULL;
return; return;
} }
mod->brush.visdata = Hunk_AllocName (bsp->visdatasize, mod->name); mod->brush.visdata = Hunk_AllocName (0, bsp->visdatasize, mod->name);
memcpy (mod->brush.visdata, bsp->visdata, bsp->visdatasize); memcpy (mod->brush.visdata, bsp->visdata, bsp->visdatasize);
} }
@ -408,7 +409,7 @@ Mod_LoadEntities (model_t *mod, bsp_t *bsp)
mod->brush.entities = NULL; mod->brush.entities = NULL;
return; return;
} }
mod->brush.entities = Hunk_AllocName (bsp->entdatasize, mod->name); mod->brush.entities = Hunk_AllocName (0, bsp->entdatasize, mod->name);
memcpy (mod->brush.entities, bsp->entdata, bsp->entdatasize); memcpy (mod->brush.entities, bsp->entdata, bsp->entdatasize);
} }
@ -421,7 +422,7 @@ Mod_LoadVertexes (model_t *mod, bsp_t *bsp)
in = bsp->vertexes; in = bsp->vertexes;
count = bsp->numvertexes; count = bsp->numvertexes;
out = Hunk_AllocName (count * sizeof (*out), mod->name); out = Hunk_AllocName (0, count * sizeof (*out), mod->name);
mod->brush.vertexes = out; mod->brush.vertexes = out;
mod->brush.numvertexes = count; mod->brush.numvertexes = count;
@ -439,7 +440,7 @@ Mod_LoadSubmodels (model_t *mod, bsp_t *bsp)
in = bsp->models; in = bsp->models;
count = bsp->nummodels; count = bsp->nummodels;
out = Hunk_AllocName (count * sizeof (*out), mod->name); out = Hunk_AllocName (0, count * sizeof (*out), mod->name);
brush->submodels = out; brush->submodels = out;
brush->numsubmodels = count; brush->numsubmodels = count;
@ -474,7 +475,7 @@ Mod_LoadEdges (model_t *mod, bsp_t *bsp)
in = bsp->edges; in = bsp->edges;
count = bsp->numedges; count = bsp->numedges;
out = Hunk_AllocName ((count + 1) * sizeof (*out), mod->name); out = Hunk_AllocName (0, (count + 1) * sizeof (*out), mod->name);
mod->brush.edges = out; mod->brush.edges = out;
mod->brush.numedges = count; mod->brush.numedges = count;
@ -495,7 +496,7 @@ Mod_LoadTexinfo (model_t *mod, bsp_t *bsp)
in = bsp->texinfo; in = bsp->texinfo;
count = bsp->numtexinfo; count = bsp->numtexinfo;
out = Hunk_AllocName (count * sizeof (*out), mod->name); out = Hunk_AllocName (0, count * sizeof (*out), mod->name);
mod->brush.texinfo = out; mod->brush.texinfo = out;
mod->brush.numtexinfo = count; mod->brush.numtexinfo = count;
@ -597,7 +598,7 @@ Mod_LoadFaces (model_t *mod, bsp_t *bsp)
in = bsp->faces; in = bsp->faces;
count = bsp->numfaces; count = bsp->numfaces;
out = Hunk_AllocName (count * sizeof (*out), mod->name); out = Hunk_AllocName (0, count * sizeof (*out), mod->name);
if (count > 32767) { if (count > 32767) {
Sys_MaskPrintf (SYS_warn, Sys_MaskPrintf (SYS_warn,
@ -698,7 +699,7 @@ Mod_LoadNodes (model_t *mod, bsp_t *bsp)
in = bsp->nodes; in = bsp->nodes;
count = bsp->numnodes; count = bsp->numnodes;
out = Hunk_AllocName (count * sizeof (*out), mod->name); out = Hunk_AllocName (0, count * sizeof (*out), mod->name);
if (count > 32767) { if (count > 32767) {
Sys_MaskPrintf (SYS_warn, Sys_MaskPrintf (SYS_warn,
@ -742,7 +743,7 @@ Mod_LoadNodes (model_t *mod, bsp_t *bsp)
size_t size = (brush->modleafs + brush->numnodes) * sizeof (mnode_t *); size_t size = (brush->modleafs + brush->numnodes) * sizeof (mnode_t *);
size += brush->modleafs * sizeof (int); size += brush->modleafs * sizeof (int);
brush->node_parents = Hunk_AllocName (size, mod->name); brush->node_parents = Hunk_AllocName (0, size, mod->name);
brush->leaf_parents = brush->node_parents + brush->numnodes; brush->leaf_parents = brush->node_parents + brush->numnodes;
brush->leaf_flags = (int *) (brush->leaf_parents + brush->modleafs); brush->leaf_flags = (int *) (brush->leaf_parents + brush->modleafs);
Mod_SetParent (brush, brush->nodes, NULL); // sets nodes and leafs Mod_SetParent (brush, brush->nodes, NULL); // sets nodes and leafs
@ -760,7 +761,7 @@ Mod_LoadLeafs (model_t *mod, bsp_t *bsp)
in = bsp->leafs; in = bsp->leafs;
count = bsp->numleafs; count = bsp->numleafs;
out = Hunk_AllocName (count * sizeof (*out), mod->name); out = Hunk_AllocName (0, count * sizeof (*out), mod->name);
brush->leafs = out; brush->leafs = out;
brush->modleafs = count; brush->modleafs = count;
@ -813,7 +814,7 @@ Mod_LoadClipnodes (model_t *mod, bsp_t *bsp)
in = bsp->clipnodes; in = bsp->clipnodes;
count = bsp->numclipnodes; count = bsp->numclipnodes;
out = Hunk_AllocName (count * sizeof (*out), mod->name); out = Hunk_AllocName (0, count * sizeof (*out), mod->name);
if (count > 32767) { if (count > 32767) {
Sys_MaskPrintf (SYS_warn, Sys_MaskPrintf (SYS_warn,
@ -890,7 +891,7 @@ Mod_MakeHull0 (model_t *mod)
in = brush->nodes; in = brush->nodes;
count = brush->numnodes; count = brush->numnodes;
out = Hunk_AllocName (count * sizeof (*out), mod->name); out = Hunk_AllocName (0, count * sizeof (*out), mod->name);
hull->clipnodes = out; hull->clipnodes = out;
hull->firstclipnode = 0; hull->firstclipnode = 0;
@ -919,7 +920,7 @@ Mod_LoadMarksurfaces (model_t *mod, bsp_t *bsp)
in = bsp->marksurfaces; in = bsp->marksurfaces;
count = bsp->nummarksurfaces; count = bsp->nummarksurfaces;
out = Hunk_AllocName (count * sizeof (*out), mod->name); out = Hunk_AllocName (0, count * sizeof (*out), mod->name);
if (count > 32767) { if (count > 32767) {
Sys_MaskPrintf (SYS_warn, Sys_MaskPrintf (SYS_warn,
@ -948,7 +949,7 @@ Mod_LoadSurfedges (model_t *mod, bsp_t *bsp)
in = bsp->surfedges; in = bsp->surfedges;
count = bsp->numsurfedges; count = bsp->numsurfedges;
out = Hunk_AllocName (count * sizeof (*out), mod->name); out = Hunk_AllocName (0, count * sizeof (*out), mod->name);
brush->surfedges = out; brush->surfedges = out;
brush->numsurfedges = count; brush->numsurfedges = count;
@ -967,7 +968,7 @@ Mod_LoadPlanes (model_t *mod, bsp_t *bsp)
in = bsp->planes; in = bsp->planes;
count = bsp->numplanes; count = bsp->numplanes;
out = Hunk_AllocName (count * 2 * sizeof (*out), mod->name); out = Hunk_AllocName (0, count * 2 * sizeof (*out), mod->name);
brush->planes = out; brush->planes = out;
brush->numplanes = count; brush->numplanes = count;

View file

@ -48,6 +48,6 @@ sw_Mod_LoadLighting (model_t *mod, bsp_t *bsp)
mod->brush.lightdata = NULL; mod->brush.lightdata = NULL;
return; return;
} }
mod->brush.lightdata = Hunk_AllocName (bsp->lightdatasize, mod->name); mod->brush.lightdata = Hunk_AllocName (0, bsp->lightdatasize, mod->name);
memcpy (mod->brush.lightdata, bsp->lightdata, bsp->lightdatasize); memcpy (mod->brush.lightdata, bsp->lightdata, bsp->lightdatasize);
} }

View file

@ -318,7 +318,7 @@ Vulkan_Mod_ProcessTexture (model_t *mod, texture_t *tx, vulkan_ctx_t *ctx)
qfv_device_t *device = ctx->device; qfv_device_t *device = ctx->device;
if (!tx) { if (!tx) {
modelctx_t *mctx = Hunk_AllocName (sizeof (modelctx_t), mod->name); modelctx_t *mctx = Hunk_AllocName (0, sizeof (modelctx_t), mod->name);
mctx->ctx = ctx; mctx->ctx = ctx;
mod->clear = vulkan_brush_clear; mod->clear = vulkan_brush_clear;
mod->data = mctx; mod->data = mctx;
@ -360,11 +360,11 @@ Vulkan_Mod_ProcessTexture (model_t *mod, texture_t *tx, vulkan_ctx_t *ctx)
const char *name = va (ctx->va_ctx, "fb_%s", tx->name); const char *name = va (ctx->va_ctx, "fb_%s", tx->name);
int size = (tx->width * tx->height * 85) / 64; int size = (tx->width * tx->height * 85) / 64;
int fullbright_mark = Hunk_LowMark (); int fullbright_mark = Hunk_LowMark (0);
byte *pixels = Hunk_AllocName (size, name); byte *pixels = Hunk_AllocName (0, size, name);
if (!Mod_CalcFullbright ((byte *) (tx + 1), pixels, size)) { if (!Mod_CalcFullbright ((byte *) (tx + 1), pixels, size)) {
Hunk_FreeToLowMark (fullbright_mark); Hunk_FreeToLowMark (0, fullbright_mark);
return; return;
} }
tex->glow = tex->tex + 1; tex->glow = tex->tex + 1;
@ -428,7 +428,7 @@ Vulkan_Mod_LoadLighting (model_t *mod, bsp_t *bsp, vulkan_ctx_t *ctx)
return; return;
} }
// LordHavoc: oh well, expand the white lighting data // LordHavoc: oh well, expand the white lighting data
brush->lightdata = Hunk_AllocName (bsp->lightdatasize * 3, mod->name); brush->lightdata = Hunk_AllocName (0, bsp->lightdatasize * 3, mod->name);
in = bsp->lightdata; in = bsp->lightdata;
out = brush->lightdata; out = brush->lightdata;

View file

@ -73,7 +73,8 @@ Mod_Init (void)
int m, x, y; int m, x, y;
int mip0size = 16*16, mip1size = 8*8, mip2size = 4*4, mip3size = 2*2; int mip0size = 16*16, mip1size = 8*8, mip2size = 4*4, mip3size = 2*2;
r_notexture_mip = Hunk_AllocName (sizeof (texture_t) + mip0size + mip1size r_notexture_mip = Hunk_AllocName (0,
sizeof (texture_t) + mip0size + mip1size
+ mip2size + mip3size, "notexture"); + mip2size + mip3size, "notexture");
r_notexture_mip->width = r_notexture_mip->height = 16; r_notexture_mip->width = r_notexture_mip->height = 16;

View file

@ -55,7 +55,8 @@ Mod_LoadSpriteFrame (model_t *mod, void *pin, mspriteframe_t **ppframe,
height = LittleLong (pinframe->height); height = LittleLong (pinframe->height);
size = width * height; size = width * height;
pspriteframe = Hunk_AllocName (sizeof (mspriteframe_t) + size, mod->name); pspriteframe = Hunk_AllocName (0, sizeof (mspriteframe_t) + size,
mod->name);
memset (pspriteframe, 0, sizeof (mspriteframe_t) + size); memset (pspriteframe, 0, sizeof (mspriteframe_t) + size);
@ -93,7 +94,7 @@ Mod_LoadSpriteGroup (model_t *mod, void *pin, mspriteframe_t **ppframe,
numframes = LittleLong (pingroup->numframes); numframes = LittleLong (pingroup->numframes);
pspritegroup = Hunk_AllocName (field_offset (mspritegroup_t, pspritegroup = Hunk_AllocName (0, field_offset (mspritegroup_t,
frames[numframes]), frames[numframes]),
mod->name); mod->name);
@ -103,7 +104,7 @@ Mod_LoadSpriteGroup (model_t *mod, void *pin, mspriteframe_t **ppframe,
pin_intervals = (dspriteinterval_t *) (pingroup + 1); pin_intervals = (dspriteinterval_t *) (pingroup + 1);
poutintervals = Hunk_AllocName (numframes * sizeof (float), mod->name); poutintervals = Hunk_AllocName (0, numframes * sizeof (float), mod->name);
pspritegroup->intervals = poutintervals; pspritegroup->intervals = poutintervals;
@ -146,7 +147,7 @@ Mod_LoadSpriteModel (model_t *mod, void *buffer)
size = field_offset (msprite_t, frames[numframes]); size = field_offset (msprite_t, frames[numframes]);
psprite = Hunk_AllocName (size, mod->name); psprite = Hunk_AllocName (0, size, mod->name);
mod->cache.data = psprite; mod->cache.data = psprite;

View file

@ -835,7 +835,7 @@ NET_Init (void)
SetNetTime (); SetNetTime ();
for (i = 0; i < net_numsockets; i++) { for (i = 0; i < net_numsockets; i++) {
s = (qsocket_t *) Hunk_AllocName (sizeof (qsocket_t), "qsocket"); s = (qsocket_t *) Hunk_AllocName (0, sizeof (qsocket_t), "qsocket");
s->next = net_freeSockets; s->next = net_freeSockets;
net_freeSockets = s; net_freeSockets = s;
s->disconnected = true; s->disconnected = true;

View file

@ -62,7 +62,7 @@ PF_VarString (progs_t *pr, int first)
for (len = 0, i = first; i < pr->pr_argc; i++) for (len = 0, i = first; i < pr->pr_argc; i++)
len += strlen (P_GSTRING (pr, i)); len += strlen (P_GSTRING (pr, i));
dst = out = Hunk_TempAlloc (len + 1); dst = out = Hunk_TempAlloc (0, len + 1);
for (i = first; i < pr->pr_argc; i++) { for (i = first; i < pr->pr_argc; i++) {
src = P_GSTRING (pr, i); src = P_GSTRING (pr, i);
while (*src) while (*src)

View file

@ -509,7 +509,7 @@ Cmd_Exec_f (void)
return; return;
} }
mark = Hunk_LowMark (); mark = Hunk_LowMark (0);
f = (char *) QFS_LoadHunkFile (QFS_FOpenFile (Cmd_Argv (1))); f = (char *) QFS_LoadHunkFile (QFS_FOpenFile (Cmd_Argv (1)));
if (!f) { if (!f) {
Sys_Printf ("couldn't exec %s\n", Cmd_Argv (1)); Sys_Printf ("couldn't exec %s\n", Cmd_Argv (1));
@ -520,7 +520,7 @@ Cmd_Exec_f (void)
|| (developer && developer->int_val & SYS_dev))) || (developer && developer->int_val & SYS_dev)))
Sys_Printf ("execing %s\n", Cmd_Argv (1)); Sys_Printf ("execing %s\n", Cmd_Argv (1));
Cbuf_InsertText (cbuf_active, f); Cbuf_InsertText (cbuf_active, f);
Hunk_FreeToLowMark (mark); Hunk_FreeToLowMark (0, mark);
} }
/* /*

View file

@ -224,7 +224,7 @@ VISIBLE info_t *
Info_ParseString (const char *s, int maxsize, int flags) Info_ParseString (const char *s, int maxsize, int flags)
{ {
info_t *info; info_t *info;
char *string = Hunk_TempAlloc (strlen (s) + 1); char *string = Hunk_TempAlloc (0, strlen (s) + 1);
char *key, *value, *end; char *key, *value, *end;
info = malloc (sizeof (info_t)); info = malloc (sizeof (info_t));
@ -271,7 +271,7 @@ Info_MakeString (info_t *info, int (*filter) (const char *))
info_key_t **key_list; info_key_t **key_list;
info_key_t **key; info_key_t **key;
d = string = Hunk_TempAlloc (info->cursize + 1); d = string = Hunk_TempAlloc (0, info->cursize + 1);
key_list = (info_key_t **) Hash_GetList (info->tab); key_list = (info_key_t **) Hash_GetList (info->tab);
for (key = key_list; *key; key++) { for (key = key_list; *key; key++) {

View file

@ -1141,9 +1141,9 @@ QFS_LoadFile (QFile *file, int usehunk)
//base = QFS_FileBase (path); //base = QFS_FileBase (path);
if (usehunk == 1) if (usehunk == 1)
buf = Hunk_AllocName (len + 1, base); buf = Hunk_AllocName (0, len + 1, base);
else if (usehunk == 2) else if (usehunk == 2)
buf = Hunk_TempAlloc (len + 1); buf = Hunk_TempAlloc (0, len + 1);
else if (usehunk == 0) else if (usehunk == 0)
buf = calloc (1, len + 1); buf = calloc (1, len + 1);
else if (usehunk == 3) else if (usehunk == 3)

View file

@ -45,7 +45,7 @@ SZ_Alloc (sizebuf_t *buf, unsigned maxsize)
{ {
if (maxsize < 256) if (maxsize < 256)
maxsize = 256; maxsize = 256;
buf->data = Hunk_AllocName (maxsize, "sizebuf"); buf->data = Hunk_AllocName (0, maxsize, "sizebuf");
buf->maxsize = maxsize; buf->maxsize = maxsize;
buf->cursize = 0; buf->cursize = 0;
} }

View file

@ -48,9 +48,9 @@
#include "compat.h" #include "compat.h"
static void Cache_FreeLow (int new_low_hunk); static void Cache_FreeLow (memhunk_t *hunk, int new_low_hunk);
static void Cache_Profile (void); static void Cache_Profile_r (memhunk_t *hunk);
static qboolean Cache_FreeLRU (void); static qboolean Cache_FreeLRU (memhunk_t *hunk);
#define ZONEID 0x1d4a11 #define ZONEID 0x1d4a11
#define HUNK_SENTINAL 0x1df001ed #define HUNK_SENTINAL 0x1df001ed
@ -409,22 +409,35 @@ Z_CheckPointer (const memzone_t *zone, const void *ptr, size_t size)
//============================================================================ //============================================================================
typedef struct cache_system_s cache_system_t;
struct cache_system_s {
cache_system_t *prev, *next;
cache_system_t *lru_prev, *lru_next; // for LRU flushing
struct memhunk_s *hunk;
char name[16];
size_t size; // including this header
int readlock;
cache_user_t *user;
} __attribute__((aligned (64)));//FIXME base 64-bit size is 80, so 128...
typedef struct { typedef struct {
int sentinal1; int sentinal1;
int sentinal2; int sentinal2;
size_t size; // including sizeof(hunk_t), -1 = not allocated size_t size; // including sizeof(hunkblk_t), -1 = not allocated
char name[8]; char name[8];
// pad out to 64 bytes } __attribute__((aligned (64))) hunkblk_t;
char fill[64 - 2 * sizeof (int) - sizeof (size_t) - 8];
} hunk_t;
byte *hunk_base; struct memhunk_s {
size_t hunk_size; byte *base;
size_t hunk_low_used; size_t size;
size_t hunk_high_used; size_t low_used;
size_t hunk_tempmark; size_t high_used;
size_t tempmark;
qboolean tempactive;
cache_system_t cache_head;
} __attribute__((aligned (64)));
qboolean hunk_tempactive; static memhunk_t *global_hunk;
/* /*
Hunk_Check Hunk_Check
@ -432,17 +445,19 @@ qboolean hunk_tempactive;
Run consistancy and sentinal trahing checks Run consistancy and sentinal trahing checks
*/ */
VISIBLE void VISIBLE void
Hunk_Check (void) Hunk_Check (memhunk_t *hunk)
{ {
hunk_t *h; if (!hunk) { hunk = global_hunk; } //FIXME clean up callers
hunkblk_t *h;
byte *hunk_end = hunk->base + hunk->low_used;
for (h = (hunk_t *) hunk_base; (byte *) h < hunk_base + hunk_low_used; ) { for (h = (hunkblk_t *) hunk->base; (byte *) h < hunk_end; ) {
if (h->sentinal1 != HUNK_SENTINAL || h->sentinal2 != HUNK_SENTINAL) if (h->sentinal1 != HUNK_SENTINAL || h->sentinal2 != HUNK_SENTINAL)
Sys_Error ("Hunk_Check: trashed sentinal"); Sys_Error ("Hunk_Check: trashed sentinal");
if (h->size < sizeof (hunk_t) if (h->size < sizeof (hunkblk_t)
|| h->size + (byte *) h > hunk_base + hunk_size) || h->size + (byte *) h > hunk->base + hunk->size)
Sys_Error ("Hunk_Check: bad size"); Sys_Error ("Hunk_Check: bad size");
h = (hunk_t *) ((byte *) h + h->size); h = (hunkblk_t *) ((byte *) h + h->size);
} }
} }
@ -455,21 +470,22 @@ Hunk_Check (void)
*/ */
VISIBLE void VISIBLE void
Hunk_Print (qboolean all) Hunk_Print (memhunk_t *hunk, qboolean all)
{ {
hunk_t *h, *next, *endlow, *starthigh, *endhigh; if (!hunk) { hunk = global_hunk; } //FIXME clean up callers
hunkblk_t *h, *next, *endlow, *starthigh, *endhigh;
int count, sum, totalblocks; int count, sum, totalblocks;
count = 0; count = 0;
sum = 0; sum = 0;
totalblocks = 0; totalblocks = 0;
h = (hunk_t *) hunk_base; h = (hunkblk_t *) hunk->base;
endlow = (hunk_t *) (hunk_base + hunk_low_used); endlow = (hunkblk_t *) (hunk->base + hunk->low_used);
starthigh = (hunk_t *) (hunk_base + hunk_size - hunk_high_used); starthigh = (hunkblk_t *) (hunk->base + hunk->size - hunk->high_used);
endhigh = (hunk_t *) (hunk_base + hunk_size); endhigh = (hunkblk_t *) (hunk->base + hunk->size);
Sys_Printf (" :%8zd total hunk size\n", hunk_size); Sys_Printf (" :%8zd total hunk size\n", hunk->size);
Sys_Printf ("-------------------------\n"); Sys_Printf ("-------------------------\n");
while (1) { while (1) {
@ -477,7 +493,7 @@ Hunk_Print (qboolean all)
if (h == endlow) { if (h == endlow) {
Sys_Printf ("-------------------------\n"); Sys_Printf ("-------------------------\n");
Sys_Printf (" :%8zd REMAINING\n", Sys_Printf (" :%8zd REMAINING\n",
hunk_size - hunk_low_used - hunk_high_used); hunk->size - hunk->low_used - hunk->high_used);
Sys_Printf ("-------------------------\n"); Sys_Printf ("-------------------------\n");
h = starthigh; h = starthigh;
} }
@ -488,11 +504,11 @@ Hunk_Print (qboolean all)
// run consistancy checks // run consistancy checks
if (h->sentinal1 != HUNK_SENTINAL || h->sentinal2 != HUNK_SENTINAL) if (h->sentinal1 != HUNK_SENTINAL || h->sentinal2 != HUNK_SENTINAL)
Sys_Error ("Hunk_Check: trahsed sentinal"); Sys_Error ("Hunk_Check: trahsed sentinal");
if (h->size < (int) sizeof (hunk_t) if (h->size < (int) sizeof (hunkblk_t)
|| h->size + (byte *) h > hunk_base + hunk_size) || h->size + (byte *) h > hunk->base + hunk->size)
Sys_Error ("Hunk_Check: bad size"); Sys_Error ("Hunk_Check: bad size");
next = (hunk_t *) ((byte *) h + h->size); next = (hunkblk_t *) ((byte *) h + h->size);
count++; count++;
totalblocks++; totalblocks++;
sum += h->size; sum += h->size;
@ -518,59 +534,63 @@ Hunk_Print (qboolean all)
} }
static void static void
Hunk_FreeToHighMark (size_t mark) Hunk_FreeToHighMark (memhunk_t *hunk, size_t mark)
{ {
if (hunk_tempactive) { if (!hunk) { hunk = global_hunk; } //FIXME clean up callers
hunk_tempactive = false; if (hunk->tempactive) {
Hunk_FreeToHighMark (hunk_tempmark); hunk->tempactive = false;
Hunk_FreeToHighMark (hunk, hunk->tempmark);
} }
if (mark > hunk_high_used) if (mark > hunk->high_used)
Sys_Error ("Hunk_FreeToHighMark: bad mark %zd", mark); Sys_Error ("Hunk_FreeToHighMark: bad mark %zd", mark);
memset (hunk_base + hunk_size - hunk_high_used, 0, hunk_high_used - mark); memset (hunk->base + hunk->size - hunk->high_used, 0,
hunk_high_used = mark; hunk->high_used - mark);
hunk->high_used = mark;
} }
static int static int
Hunk_HighMark (void) Hunk_HighMark (memhunk_t *hunk)
{ {
if (hunk_tempactive) { if (!hunk) { hunk = global_hunk; } //FIXME clean up callers
hunk_tempactive = false; if (hunk->tempactive) {
Hunk_FreeToHighMark (hunk_tempmark); hunk->tempactive = false;
Hunk_FreeToHighMark (hunk, hunk->tempmark);
} }
return hunk_high_used; return hunk->high_used;
} }
VISIBLE void * VISIBLE void *
Hunk_AllocName (size_t size, const char *name) Hunk_AllocName (memhunk_t *hunk, size_t size, const char *name)
{ {
hunk_t *h; if (!hunk) { hunk = global_hunk; } //FIXME clean up callers
hunkblk_t *h;
#ifdef PARANOID #ifdef PARANOID
Hunk_Check (); Hunk_Check ();
#endif #endif
size = sizeof (hunk_t) + ((size + HUNK_ALIGN - 1) & ~(HUNK_ALIGN - 1)); size = sizeof (hunkblk_t) + ((size + HUNK_ALIGN - 1) & ~(HUNK_ALIGN - 1));
if (hunk_size - hunk_low_used - hunk_high_used < size) { if (hunk->size - hunk->low_used - hunk->high_used < size) {
Hunk_HighMark(); Hunk_HighMark (hunk);
Cache_FreeLRU (); Cache_FreeLRU (hunk);
} }
if (hunk_size - hunk_low_used - hunk_high_used < size) { if (hunk->size - hunk->low_used - hunk->high_used < size) {
int mem = hunk_size / (1024 * 1024); int mem = hunk->size / (1024 * 1024);
mem += 8; mem += 8;
mem &= ~7; mem &= ~7;
Cache_Profile (); Cache_Profile_r (hunk);
Sys_Error Sys_Error
("Not enough RAM allocated. Try starting using \"-mem %d\" on " ("Not enough RAM allocated. Try starting using \"-mem %d\" on "
"the %s command line. (%zd - %zd - %zd < %zd)", mem, "the %s command line. (%zd - %zd - %zd < %zd)", mem,
PACKAGE_NAME, hunk_size, hunk_low_used, hunk_high_used, size); PACKAGE_NAME, hunk->size, hunk->low_used, hunk->high_used, size);
} }
h = (hunk_t *) (hunk_base + hunk_low_used); h = (hunkblk_t *) (hunk->base + hunk->low_used);
hunk_low_used += size; hunk->low_used += size;
Cache_FreeLow (hunk_low_used); Cache_FreeLow (hunk, hunk->low_used);
memset (h, 0, size); memset (h, 0, size);
@ -584,49 +604,52 @@ Hunk_AllocName (size_t size, const char *name)
} }
VISIBLE void * VISIBLE void *
Hunk_Alloc (size_t size) Hunk_Alloc (memhunk_t *hunk, size_t size)
{ {
return Hunk_AllocName (size, "unknown"); if (!hunk) { hunk = global_hunk; } //FIXME clean up callers
return Hunk_AllocName (hunk, size, "unknown");
} }
VISIBLE size_t VISIBLE size_t
Hunk_LowMark (void) Hunk_LowMark (memhunk_t *hunk)
{ {
return hunk_low_used; if (!hunk) { hunk = global_hunk; } //FIXME clean up callers
return hunk->low_used;
} }
VISIBLE void VISIBLE void
Hunk_FreeToLowMark (size_t mark) Hunk_FreeToLowMark (memhunk_t *hunk, size_t mark)
{ {
if (mark > hunk_low_used) if (!hunk) { hunk = global_hunk; } //FIXME clean up callers
if (mark > hunk->low_used)
Sys_Error ("Hunk_FreeToLowMark: bad mark %zd", mark); Sys_Error ("Hunk_FreeToLowMark: bad mark %zd", mark);
memset (hunk_base + mark, 0, hunk_low_used - mark); memset (hunk->base + mark, 0, hunk->low_used - mark);
hunk_low_used = mark; hunk->low_used = mark;
} }
static void * static void *
Hunk_HighAlloc (size_t size) Hunk_HighAlloc (memhunk_t *hunk, size_t size)
{ {
hunk_t *h; hunkblk_t *h;
if (hunk_tempactive) { if (hunk->tempactive) {
Hunk_FreeToHighMark (hunk_tempmark); Hunk_FreeToHighMark (hunk, hunk->tempmark);
hunk_tempactive = false; hunk->tempactive = false;
} }
#ifdef PARANOID #ifdef PARANOID
Hunk_Check (); Hunk_Check (hunk);
#endif #endif
size = sizeof (hunk_t) + ((size + HUNK_ALIGN - 1) & ~(HUNK_ALIGN - 1)); size = sizeof (hunkblk_t) + ((size + HUNK_ALIGN - 1) & ~(HUNK_ALIGN - 1));
if (hunk_size - hunk_low_used - hunk_high_used < size) { if (hunk->size - hunk->low_used - hunk->high_used < size) {
Sys_Printf ("Hunk_HighAlloc: failed on %zd bytes\n", size); Sys_Printf ("Hunk_HighAlloc: failed on %zd bytes\n", size);
return NULL; return NULL;
} }
hunk_high_used += size; hunk->high_used += size;
h = (void *) (hunk_base + hunk_size - hunk_high_used); h = (void *) (hunk->base + hunk->size - hunk->high_used);
h->sentinal1 = HUNK_SENTINAL; h->sentinal1 = HUNK_SENTINAL;
h->sentinal2 = HUNK_SENTINAL; h->sentinal2 = HUNK_SENTINAL;
h->size = size; h->size = size;
@ -640,44 +663,37 @@ Hunk_HighAlloc (size_t size)
Return space from the top of the hunk Return space from the top of the hunk
*/ */
VISIBLE void * VISIBLE void *
Hunk_TempAlloc (size_t size) Hunk_TempAlloc (memhunk_t *hunk, size_t size)
{ {
if (!hunk) { hunk = global_hunk; } //FIXME clean up callers
void *buf; void *buf;
size = (size + HUNK_ALIGN - 1) & ~(HUNK_ALIGN - 1); size = (size + HUNK_ALIGN - 1) & ~(HUNK_ALIGN - 1);
if (hunk_tempactive) { if (hunk->tempactive) {
if (hunk_high_used - hunk_tempmark >= size + (int) sizeof (hunk_t)) { size_t temp_free = hunk->high_used - hunk->tempmark;
return (hunk_t *) (hunk_base + hunk_size - hunk_high_used) + 1; if (temp_free >= size + (int) sizeof (hunkblk_t)) {
byte *temp_block = hunk->base + hunk->size - hunk->high_used;
return (hunkblk_t *) temp_block + 1;
} }
Hunk_FreeToHighMark (hunk_tempmark); Hunk_FreeToHighMark (hunk, hunk->tempmark);
hunk_tempactive = false; hunk->tempactive = false;
} }
hunk_tempmark = Hunk_HighMark (); hunk->tempmark = Hunk_HighMark (hunk);
buf = Hunk_HighAlloc (size); buf = Hunk_HighAlloc (hunk, size);
hunk_tempactive = true; hunk->tempactive = true;
return buf; return buf;
} }
/* CACHE MEMORY */ /* CACHE MEMORY */
typedef struct cache_system_s cache_system_t;
struct cache_system_s {
cache_system_t *prev, *next;
cache_system_t *lru_prev, *lru_next; // for LRU flushing
char name[16];
size_t size; // including this header
int readlock;
cache_user_t *user;
};
static cache_system_t cache_head; static cache_system_t *Cache_TryAlloc (memhunk_t *hunk, size_t size,
qboolean nobottom);
static cache_system_t *Cache_TryAlloc (size_t size, qboolean nobottom);
#if 0 #if 0
static void static void
check_cache (void) check_cache (void)
@ -702,10 +718,11 @@ check_cache (void)
static void static void
Cache_Move (cache_system_t *c) Cache_Move (cache_system_t *c)
{ {
memhunk_t *hunk = c->hunk;
cache_system_t *new; cache_system_t *new;
// we are clearing up space at the bottom, so allocate it late // we are clearing up space at the bottom, so allocate it late
new = Cache_TryAlloc (c->size, true); new = Cache_TryAlloc (hunk, c->size, true);
if (new) { if (new) {
Sys_MaskPrintf (SYS_dev, "cache_move ok\n"); Sys_MaskPrintf (SYS_dev, "cache_move ok\n");
@ -727,15 +744,15 @@ Cache_Move (cache_system_t * c)
Throw things out until the hunk can be expanded to the given point Throw things out until the hunk can be expanded to the given point
*/ */
static void static void
Cache_FreeLow (int new_low_hunk) Cache_FreeLow (memhunk_t *hunk, int new_low_hunk)
{ {
cache_system_t *c; cache_system_t *c;
while (1) { while (1) {
c = cache_head.prev; c = hunk->cache_head.prev;
if (c == &cache_head) if (c == &hunk->cache_head)
return; // nothing in cache at all return; // nothing in cache at all
if ((byte *) c >= hunk_base + new_low_hunk) if ((byte *) c >= hunk->base + new_low_hunk)
return; // there is space to grow the hunk return; // there is space to grow the hunk
Sys_Error ("FIXME: Cache_FreeLow: not enough memory"); Sys_Error ("FIXME: Cache_FreeLow: not enough memory");
Cache_Move (c); // reclaim the space Cache_Move (c); // reclaim the space
@ -762,22 +779,22 @@ Cache_MakeLRU (cache_system_t * cs)
Sys_Error ("Cache_MakeLRU: active link: %.16s %p %p", Sys_Error ("Cache_MakeLRU: active link: %.16s %p %p",
cs->name, cs->lru_next, cs->lru_prev); cs->name, cs->lru_next, cs->lru_prev);
cache_head.lru_next->lru_prev = cs; cs->hunk->cache_head.lru_next->lru_prev = cs;
cs->lru_next = cache_head.lru_next; cs->lru_next = cs->hunk->cache_head.lru_next;
cs->lru_prev = &cache_head; cs->lru_prev = &cs->hunk->cache_head;
cache_head.lru_next = cs; cs->hunk->cache_head.lru_next = cs;
} }
static qboolean static qboolean
Cache_FreeLRU (void) Cache_FreeLRU (memhunk_t *hunk)
{ {
cache_system_t *cs; cache_system_t *cs;
//check_cache (); //check_cache ();
for (cs = cache_head.lru_prev; for (cs = hunk->cache_head.lru_prev;
cs != &cache_head && cs->readlock; cs = cs->lru_prev) cs != &hunk->cache_head && cs->readlock; cs = cs->lru_prev)
; ;
if (cs == &cache_head) if (cs == &hunk->cache_head)
return 0; return 0;
Cache_Free (cs->user); Cache_Free (cs->user);
return 1; return 1;
@ -800,27 +817,28 @@ link_cache_system (cache_system_t *new, cache_system_t *cs)
Size should already include the header and padding Size should already include the header and padding
*/ */
static cache_system_t * static cache_system_t *
Cache_TryAlloc (size_t size, qboolean nobottom) Cache_TryAlloc (memhunk_t *hunk, size_t size, qboolean nobottom)
{ {
cache_system_t *cs, *new; cache_system_t *cs, *new;
//check_cache (); //check_cache ();
// is the cache completely empty? // is the cache completely empty?
if (!nobottom && cache_head.prev == &cache_head) { if (!nobottom && hunk->cache_head.prev == &hunk->cache_head) {
new = (cache_system_t *) Hunk_HighAlloc (size); new = (cache_system_t *) Hunk_HighAlloc (hunk, size);
if (!new) if (!new)
return 0; return 0;
memset (new, 0, size); memset (new, 0, size);
new->size = size; new->size = size;
cache_head.prev = cache_head.next = new; new->hunk = hunk;
new->prev = new->next = &cache_head; hunk->cache_head.prev = hunk->cache_head.next = new;
new->prev = new->next = &hunk->cache_head;
Cache_MakeLRU (new); Cache_MakeLRU (new);
//check_cache (); //check_cache ();
return new; return new;
} }
// search for space in existing cache // search for space in existing cache
for (cs = cache_head.next; cs != &cache_head; cs = cs->next) { for (cs = hunk->cache_head.next; cs != &hunk->cache_head; cs = cs->next) {
if (cs->user) if (cs->user)
continue; // block isn't free continue; // block isn't free
if (cs->size >= size) { if (cs->size >= size) {
@ -832,6 +850,7 @@ Cache_TryAlloc (size_t size, qboolean nobottom)
new = (cache_system_t *) ((char *) cs + cs->size - size); new = (cache_system_t *) ((char *) cs + cs->size - size);
memset (new, 0, size); memset (new, 0, size);
new->size = size; new->size = size;
new->hunk = hunk;
cs->size -= size; cs->size -= size;
link_cache_system (new, cs); link_cache_system (new, cs);
//check_cache (); //check_cache ();
@ -845,11 +864,12 @@ Cache_TryAlloc (size_t size, qboolean nobottom)
return 0; return 0;
// didn't find a free block, so make a new one. // didn't find a free block, so make a new one.
new = Hunk_HighAlloc (size); new = Hunk_HighAlloc (hunk, size);
if (new) { if (new) {
memset (new, 0, size); memset (new, 0, size);
new->size = size; new->size = size;
link_cache_system (new, &cache_head); new->hunk = hunk;
link_cache_system (new, &hunk->cache_head);
Cache_MakeLRU (new); Cache_MakeLRU (new);
//check_cache (); //check_cache ();
return new; return new;
@ -859,15 +879,15 @@ Cache_TryAlloc (size_t size, qboolean nobottom)
} }
static void static void
Cache_Profile (void) Cache_Profile_r (memhunk_t *hunk)
{ {
cache_system_t *cs; cache_system_t *cs;
unsigned int i; unsigned int i;
unsigned int items[31] = {0}, sizes[31] = {0}; unsigned int items[31] = {0}, sizes[31] = {0};
int count = 0, total = 0; int count = 0, total = 0;
cs = cache_head.next; cs = hunk->cache_head.next;
while (cs != &cache_head) { while (cs != &hunk->cache_head) {
for (i = 0; (cs->size >> (i + 1)) && i < 30; i++) for (i = 0; (cs->size >> (i + 1)) && i < 30; i++)
; ;
items[i]++; items[i]++;
@ -893,23 +913,39 @@ Cache_Profile (void)
} }
static void static void
Cache_Print (void) Cache_Profile (void)
{
Cache_Profile_r (global_hunk);
}
static void
Cache_Print_r (memhunk_t *hunk)
{ {
cache_system_t *cd; cache_system_t *cd;
for (cd = cache_head.next; cd != &cache_head; cd = cd->next) { for (cd = hunk->cache_head.next; cd != &hunk->cache_head; cd = cd->next) {
Sys_Printf ("%8d : %.16s\n", (int) cd->size, cd->name); Sys_Printf ("%8d : %.16s\n", (int) cd->size, cd->name);
} }
} }
static void
Cache_Print (void)
{
Cache_Print_r (global_hunk);
}
static void
init_cache (memhunk_t *hunk)
{
hunk->cache_head.next = hunk->cache_head.prev = &hunk->cache_head;
hunk->cache_head.lru_next = hunk->cache_head.lru_prev = &hunk->cache_head;
hunk->cache_head.user = (cache_user_t *) 1; // make it look allocated
hunk->cache_head.readlock = 1; // don't try to free or move it
}
static void static void
Cache_Init (void) Cache_Init (void)
{ {
cache_head.next = cache_head.prev = &cache_head;
cache_head.lru_next = cache_head.lru_prev = &cache_head;
cache_head.user = (cache_user_t *) 1; // make it look allocated
cache_head.readlock = 1; // don't try to free or move it
Cmd_AddCommand ("cache_flush", Cache_Flush, "Clears the current game " Cmd_AddCommand ("cache_flush", Cache_Flush, "Clears the current game "
"cache"); "cache");
Cmd_AddCommand ("cache_profile", Cache_Profile, "Prints a profile of " Cmd_AddCommand ("cache_profile", Cache_Profile, "Prints a profile of "
@ -923,20 +959,28 @@ Cache_Init (void)
Throw everything out, so new data will be demand cached Throw everything out, so new data will be demand cached
*/ */
void static void
Cache_Flush (void) Cache_Flush_r (memhunk_t *hunk)
{ {
// cache_head.prev is guaranteed to not be free because it's the bottom // cache_head.prev is guaranteed to not be free because it's the bottom
// one and Cache_Free actually properly releases it // one and Cache_Free actually properly releases it
while (cache_head.prev != &cache_head) { while (hunk->cache_head.prev != &hunk->cache_head) {
if (!cache_head.prev->user->data) if (!hunk->cache_head.prev->user->data)
Sys_Error ("Cache_Flush: user/system out of sync for " Sys_Error ("Cache_Flush: user/system out of sync for "
"'%.16s' with %d size", "'%.16s' with %d size",
cache_head.prev->name, (int) cache_head.prev->size); hunk->cache_head.prev->name,
Cache_Free (cache_head.prev->user); // reclaim the space (int) hunk->cache_head.prev->size);
Cache_Free (hunk->cache_head.prev->user); // reclaim the space
} }
} }
VISIBLE void
Cache_Flush (void)
{
// cache_head.prev is guaranteed to not be free because it's the bottom
Cache_Flush_r (global_hunk);
}
VISIBLE void * VISIBLE void *
Cache_Check (cache_user_t *c) Cache_Check (cache_user_t *c)
{ {
@ -968,6 +1012,7 @@ Cache_Free (cache_user_t *c)
Sys_Error ("Cache_Free: not allocated"); Sys_Error ("Cache_Free: not allocated");
cs = ((cache_system_t *) c->data) - 1; cs = ((cache_system_t *) c->data) - 1;
memhunk_t *hunk = cs->hunk;
if (cs->readlock) if (cs->readlock)
Sys_Error ("Cache_Free: attempt to free locked block"); Sys_Error ("Cache_Free: attempt to free locked block");
@ -989,35 +1034,36 @@ Cache_Free (cache_user_t *c)
cs->prev->prev->next = cs; cs->prev->prev->next = cs;
cs->prev = cs->prev->prev; cs->prev = cs->prev->prev;
} }
if (cs->next == &cache_head) { if (cs->next == &hunk->cache_head) {
cs->next->prev = cs->prev; cs->next->prev = cs->prev;
cs->prev->next = cs->next; cs->prev->next = cs->next;
if (cs->prev != &cache_head) if (cs->prev != &hunk->cache_head)
Hunk_FreeToHighMark (hunk_size - ((byte*)cs->prev - hunk_base)); Hunk_FreeToHighMark (hunk,
hunk->size - ((byte*)cs->prev - hunk->base));
else else
Hunk_FreeToHighMark (0); Hunk_FreeToHighMark (hunk, 0);
} }
//check_cache (); //check_cache ();
c->data = NULL; c->data = NULL;
} }
VISIBLE void * static void *
Cache_Alloc (cache_user_t *c, size_t size, const char *name) Cache_Alloc_r (memhunk_t *hunk, cache_user_t *c, size_t size, const char *name)
{ {
cache_system_t *cs; cache_system_t *cs;
if (c->data) if (c->data)
Sys_Error ("Cache_Alloc: already allocated"); Sys_Error ("Cache_Alloc_r: already allocated");
if (size <= 0) if (size <= 0)
Sys_Error ("Cache_Alloc: size %zd", size); Sys_Error ("Cache_Alloc_r: size %zd", size);
size = (size + sizeof (cache_system_t) + HUNK_ALIGN - 1) & ~(HUNK_ALIGN-1); size = (size + sizeof (cache_system_t) + HUNK_ALIGN - 1) & ~(HUNK_ALIGN-1);
// find memory for it // find memory for it
while (1) { while (1) {
cs = Cache_TryAlloc (size, false); cs = Cache_TryAlloc (hunk, size, false);
if (cs) { if (cs) {
strncpy (cs->name, name, sizeof (cs->name) - 1); strncpy (cs->name, name, sizeof (cs->name) - 1);
c->data = (void *) (cs + 1); c->data = (void *) (cs + 1);
@ -1025,19 +1071,32 @@ Cache_Alloc (cache_user_t *c, size_t size, const char *name)
break; break;
} }
// free the least recently used cachedat // free the least recently used cachedat
if (!Cache_FreeLRU()) if (!Cache_FreeLRU (hunk))
Sys_Error ("Cache_Alloc: out of memory"); Sys_Error ("Cache_Alloc: out of memory");
} }
return Cache_Check (c); return Cache_Check (c);
} }
VISIBLE void *
Cache_Alloc (cache_user_t *c, size_t size, const char *name)
{
return Cache_Alloc_r (global_hunk, c, size, name);
}
static void
Cache_Report_r (memhunk_t *hunk)
{
if (!hunk) { hunk = global_hunk; } //FIXME clean up callers
Sys_MaskPrintf (SYS_dev, "%4.1f megabyte data cache\n",
(hunk->size - hunk->high_used -
hunk->low_used) / (float) (1024 * 1024));
}
VISIBLE void VISIBLE void
Cache_Report (void) Cache_Report (void)
{ {
Sys_MaskPrintf (SYS_dev, "%4.1f megabyte data cache\n", Cache_Report_r (global_hunk);
(hunk_size - hunk_high_used -
hunk_low_used) / (float) (1024 * 1024));
} }
VISIBLE void VISIBLE void
@ -1116,13 +1175,22 @@ Cache_ReadLock (cache_user_t *c)
//============================================================================ //============================================================================
VISIBLE memhunk_t *
Hunk_Init (void *buf, size_t size)
{
memhunk_t *hunk = buf;
hunk->base = (byte *) (hunk + 1);
hunk->size = size - sizeof (memhunk_t);
hunk->low_used = 0;
hunk->high_used = 0;
init_cache (hunk);
return hunk;
}
VISIBLE void VISIBLE void
Memory_Init (void *buf, size_t size) Memory_Init (void *buf, size_t size)
{ {
hunk_base = buf; global_hunk = Hunk_Init (buf, size);
hunk_size = size;
hunk_low_used = 0;
hunk_high_used = 0;
Cache_Init (); Cache_Init ();
} }

View file

@ -459,7 +459,7 @@ do_subimage_2 (int i)
width = rect->w * lightmap_bytes; width = rect->w * lightmap_bytes;
stride = BLOCK_WIDTH * lightmap_bytes; stride = BLOCK_WIDTH * lightmap_bytes;
b = block = Hunk_TempAlloc (rect->h * width); b = block = Hunk_TempAlloc (0, rect->h * width);
lm = lightmaps[i] + (rect->t * BLOCK_WIDTH + rect->l) * lightmap_bytes; lm = lightmaps[i] + (rect->t * BLOCK_WIDTH + rect->l) * lightmap_bytes;
for (i = rect->h; i > 0; i--) { for (i = rect->h; i > 0; i--) {
memcpy (b, lm, width); memcpy (b, lm, width);

View file

@ -292,7 +292,7 @@ GL_GetAliasFrameVerts16 (aliashdr_t *paliashdr, entity_t *e)
verts = (trivertx16_t *) ((byte *) paliashdr + paliashdr->posedata); verts = (trivertx16_t *) ((byte *) paliashdr + paliashdr->posedata);
count = paliashdr->poseverts; count = paliashdr->poseverts;
vo = Hunk_TempAlloc (sizeof (*vo) + count * sizeof (blended_vert_t)); vo = Hunk_TempAlloc (0, sizeof (*vo) + count * sizeof (blended_vert_t));
vo->order = (int *) ((byte *) paliashdr + paliashdr->commands); vo->order = (int *) ((byte *) paliashdr + paliashdr->commands);
vo->verts = (blended_vert_t *) &vo[1]; vo->verts = (blended_vert_t *) &vo[1];
if (paliashdr->tex_coord) { if (paliashdr->tex_coord) {
@ -358,7 +358,7 @@ GL_GetAliasFrameVerts (aliashdr_t *paliashdr, entity_t *e)
verts = (trivertx_t *) ((byte *) paliashdr + paliashdr->posedata); verts = (trivertx_t *) ((byte *) paliashdr + paliashdr->posedata);
count = paliashdr->poseverts; count = paliashdr->poseverts;
vo = Hunk_TempAlloc (sizeof (*vo) + count * sizeof (blended_vert_t)); vo = Hunk_TempAlloc (0, sizeof (*vo) + count * sizeof (blended_vert_t));
vo->order = (int *) ((byte *) paliashdr + paliashdr->commands); vo->order = (int *) ((byte *) paliashdr + paliashdr->commands);
vo->verts = (blended_vert_t *) &vo[1]; vo->verts = (blended_vert_t *) &vo[1];
if (paliashdr->tex_coord) { if (paliashdr->tex_coord) {

View file

@ -840,7 +840,7 @@ GL_BuildSurfaceDisplayList (msurface_t *surf)
lnumverts = surf->numedges; lnumverts = surf->numedges;
// draw texture // draw texture
poly = Hunk_Alloc (sizeof (glpoly_t) + (lnumverts - 4) * poly = Hunk_Alloc (0, sizeof (glpoly_t) + (lnumverts - 4) *
VERTEXSIZE * sizeof (float)); VERTEXSIZE * sizeof (float));
poly->next = surf->polys; poly->next = surf->polys;
poly->flags = surf->flags; poly->flags = surf->flags;

View file

@ -91,7 +91,7 @@ gl_SCR_ScreenShot (unsigned width, unsigned height)
int count, dex, dey, dx, dy, nx, r, g, b, x, y, w, h; int count, dex, dey, dx, dy, nx, r, g, b, x, y, w, h;
tex_t *tex; tex_t *tex;
snap = Hunk_TempAlloc (vid.width * vid.height * 3); snap = Hunk_TempAlloc (0, vid.width * vid.height * 3);
qfglReadPixels (0, 0, vid.width, vid.height, GL_RGB, GL_UNSIGNED_BYTE, qfglReadPixels (0, 0, vid.width, vid.height, GL_RGB, GL_UNSIGNED_BYTE,
snap); snap);

View file

@ -76,7 +76,7 @@ R_IQMBlendFrames (const iqm_t *iqm, int frame1, int frame2, float blend,
iqmframe_t *frame; iqmframe_t *frame;
int i; int i;
frame = Hunk_TempAlloc (iqm->num_joints * sizeof (iqmframe_t) + extra); frame = Hunk_TempAlloc (0, iqm->num_joints * sizeof (iqmframe_t) + extra);
if (iqm->num_frames) { if (iqm->num_frames) {
#if 0 #if 0
for (i = 0; i < iqm->num_joints; i++) { for (i = 0; i < iqm->num_joints; i++) {

View file

@ -636,7 +636,7 @@ R_AliasDrawModel (alight_t *plighting)
size = (CACHE_SIZE - 1) size = (CACHE_SIZE - 1)
+ sizeof (finalvert_t) * (pmdl->numverts + 1) + sizeof (finalvert_t) * (pmdl->numverts + 1)
+ sizeof (auxvert_t) * pmdl->numverts; + sizeof (auxvert_t) * pmdl->numverts;
finalverts = (finalvert_t *) Hunk_TempAlloc (size); finalverts = (finalvert_t *) Hunk_TempAlloc (0, size);
if (!finalverts) if (!finalverts)
Sys_Error ("R_AliasDrawModel: out of memory"); Sys_Error ("R_AliasDrawModel: out of memory");

View file

@ -190,7 +190,8 @@ R_NewMap (model_t *worldmodel, struct model_s **models, int num_models)
r_cnumsurfs = MINSURFACES; r_cnumsurfs = MINSURFACES;
if (r_cnumsurfs > NUMSTACKSURFACES) { if (r_cnumsurfs > NUMSTACKSURFACES) {
surfaces = Hunk_AllocName (r_cnumsurfs * sizeof (surf_t), "surfaces"); surfaces = Hunk_AllocName (0, r_cnumsurfs * sizeof (surf_t),
"surfaces");
surface_p = surfaces; surface_p = surfaces;
surf_max = &surfaces[r_cnumsurfs]; surf_max = &surfaces[r_cnumsurfs];
@ -214,7 +215,7 @@ R_NewMap (model_t *worldmodel, struct model_s **models, int num_models)
if (r_numallocatededges <= NUMSTACKEDGES) { if (r_numallocatededges <= NUMSTACKEDGES) {
auxedges = NULL; auxedges = NULL;
} else { } else {
auxedges = Hunk_AllocName (r_numallocatededges * sizeof (edge_t), auxedges = Hunk_AllocName (0, r_numallocatededges * sizeof (edge_t),
"edges"); "edges");
} }
@ -842,7 +843,7 @@ R_RenderView (void)
if (delta < -10000 || delta > 10000) if (delta < -10000 || delta > 10000)
Sys_Error ("R_RenderView: called without enough stack"); Sys_Error ("R_RenderView: called without enough stack");
if (Hunk_LowMark () & 3) if (Hunk_LowMark (0) & 3)
Sys_Error ("Hunk is missaligned"); Sys_Error ("Hunk is missaligned");
if ((intptr_t) (&dummy) & 3) if ((intptr_t) (&dummy) & 3)

View file

@ -637,7 +637,7 @@ sw32_R_AliasDrawModel (alight_t *plighting)
size = (CACHE_SIZE - 1) size = (CACHE_SIZE - 1)
+ sizeof (finalvert_t) * (pmdl->numverts + 1) + sizeof (finalvert_t) * (pmdl->numverts + 1)
+ sizeof (auxvert_t) * pmdl->numverts; + sizeof (auxvert_t) * pmdl->numverts;
finalverts = (finalvert_t *) Hunk_TempAlloc (size); finalverts = (finalvert_t *) Hunk_TempAlloc (0, size);
if (!finalverts) if (!finalverts)
Sys_Error ("R_AliasDrawModel: out of memory"); Sys_Error ("R_AliasDrawModel: out of memory");

View file

@ -115,7 +115,7 @@ sw32_R_Textures_Init (void)
// create a simple checkerboard texture for the default // create a simple checkerboard texture for the default
r_notexture_mip = r_notexture_mip =
Hunk_AllocName (sizeof (texture_t) + 16 * 16 + 8 * 8 + 4 * 4 + 2 * 2, Hunk_AllocName (0, sizeof (texture_t) + 16 * 16 + 8 * 8 + 4 * 4 + 2 * 2,
"notexture"); "notexture");
r_notexture_mip->width = r_notexture_mip->height = 16; r_notexture_mip->width = r_notexture_mip->height = 16;
@ -205,7 +205,8 @@ sw32_R_NewMap (model_t *worldmodel, struct model_s **models, int num_models)
r_cnumsurfs = MINSURFACES; r_cnumsurfs = MINSURFACES;
if (r_cnumsurfs > NUMSTACKSURFACES) { if (r_cnumsurfs > NUMSTACKSURFACES) {
sw32_surfaces = Hunk_AllocName (r_cnumsurfs * sizeof (surf_t), "surfaces"); sw32_surfaces = Hunk_AllocName (0, r_cnumsurfs * sizeof (surf_t),
"surfaces");
sw32_surface_p = sw32_surfaces; sw32_surface_p = sw32_surfaces;
sw32_surf_max = &sw32_surfaces[r_cnumsurfs]; sw32_surf_max = &sw32_surfaces[r_cnumsurfs];
@ -228,7 +229,8 @@ sw32_R_NewMap (model_t *worldmodel, struct model_s **models, int num_models)
if (sw32_r_numallocatededges <= NUMSTACKEDGES) { if (sw32_r_numallocatededges <= NUMSTACKEDGES) {
sw32_auxedges = NULL; sw32_auxedges = NULL;
} else { } else {
sw32_auxedges = Hunk_AllocName (sw32_r_numallocatededges * sizeof (edge_t), sw32_auxedges = Hunk_AllocName (0,
sw32_r_numallocatededges * sizeof (edge_t),
"edges"); "edges");
} }
@ -839,7 +841,7 @@ sw32_R_RenderView (void)
if (delta < -10000 || delta > 10000) if (delta < -10000 || delta > 10000)
Sys_Error ("R_RenderView: called without enough stack"); Sys_Error ("R_RenderView: called without enough stack");
if (Hunk_LowMark () & 3) if (Hunk_LowMark (0) & 3)
Sys_Error ("Hunk is missaligned"); Sys_Error ("Hunk is missaligned");
if ((intptr_t) (&dummy) & 3) if ((intptr_t) (&dummy) & 3)

View file

@ -315,7 +315,7 @@ CL_NewMap (const char *mapname)
{ {
r_funcs->R_NewMap (cl.worldmodel, cl.model_precache, cl.nummodels); r_funcs->R_NewMap (cl.worldmodel, cl.model_precache, cl.nummodels);
Con_NewMap (); Con_NewMap ();
Hunk_Check (); // make sure nothing is hurt Hunk_Check (0); // make sure nothing is hurt
Sbar_CenterPrint (0); Sbar_CenterPrint (0);
if (cl.model_precache[1] && cl.model_precache[1]->brush.entities) { if (cl.model_precache[1] && cl.model_precache[1]->brush.entities) {
@ -365,7 +365,7 @@ CL_ParseServerInfo (void)
Sys_Printf ("Bad maxclients (%u) from server\n", cl.maxclients); Sys_Printf ("Bad maxclients (%u) from server\n", cl.maxclients);
goto done; goto done;
} }
cl.players = Hunk_AllocName (cl.maxclients * sizeof (*cl.players), cl.players = Hunk_AllocName (0, cl.maxclients * sizeof (*cl.players),
"players"); "players");
for (i = 0; i < cl.maxclients; i++) { for (i = 0; i < cl.maxclients; i++) {
cl.players[i].userinfo = Info_ParseString ("name\\", 0, 0); cl.players[i].userinfo = Info_ParseString ("name\\", 0, 0);
@ -444,7 +444,7 @@ CL_ParseServerInfo (void)
dstring_clearstr (centerprint); dstring_clearstr (centerprint);
CL_NewMap (model_precache[1]); CL_NewMap (model_precache[1]);
Hunk_Check (); // make sure nothing is hurt Hunk_Check (0); // make sure nothing is hurt
noclip_anglehack = false; // noclip is turned off at start noclip_anglehack = false; // noclip is turned off at start
r_data->gravity = 800.0; // Set up gravity for renderer effects r_data->gravity = 800.0; // Set up gravity for renderer effects

View file

@ -242,7 +242,7 @@ Host_FindMaxClients (void)
if (svs.maxclientslimit < 4) if (svs.maxclientslimit < 4)
svs.maxclientslimit = 4; svs.maxclientslimit = 4;
svs.clients = svs.clients =
Hunk_AllocName (svs.maxclientslimit * sizeof (client_t), "clients"); Hunk_AllocName (0, svs.maxclientslimit * sizeof (client_t), "clients");
if (svs.maxclients > 1) if (svs.maxclients > 1)
Cvar_SetValue (deathmatch, 1.0); Cvar_SetValue (deathmatch, 1.0);
@ -499,7 +499,7 @@ Host_ClearMemory (void)
CL_ClearMemory (); CL_ClearMemory ();
Mod_ClearAll (); Mod_ClearAll ();
if (host_hunklevel) if (host_hunklevel)
Hunk_FreeToLowMark (host_hunklevel); Hunk_FreeToLowMark (0, host_hunklevel);
cls.signon = 0; cls.signon = 0;
memset (&sv, 0, sizeof (sv)); memset (&sv, 0, sizeof (sv));
@ -907,8 +907,8 @@ Host_Init (void)
COM_ExecConfig (host_cbuf, isDedicated || !cl_quakerc->int_val); COM_ExecConfig (host_cbuf, isDedicated || !cl_quakerc->int_val);
Hunk_AllocName (0, "-HOST_HUNKLEVEL-"); Hunk_AllocName (0, 0, "-HOST_HUNKLEVEL-");
host_hunklevel = Hunk_LowMark (); host_hunklevel = Hunk_LowMark (0);
Sys_Printf ("\nVersion %s (build %04d)\n\n", PACKAGE_VERSION, Sys_Printf ("\nVersion %s (build %04d)\n\n", PACKAGE_VERSION,
build_number ()); build_number ());

View file

@ -493,7 +493,7 @@ convert_to_game_dict (script_t *script)
PL_A_AddObject (item, PL_NewString (script->token->str)); PL_A_AddObject (item, PL_NewString (script->token->str));
//char *s; //char *s;
//s = Hunk_Alloc (strlen (script->token->str) + 1); //s = Hunk_Alloc (0, strlen (script->token->str) + 1);
//strcpy (s, script->token->str); //strcpy (s, script->token->str);
//sv.lightstyles[i] = s; //sv.lightstyles[i] = s;
} }
@ -687,7 +687,7 @@ Host_Loadgame_f (void)
break; break;
item = PL_ObjectAtIndex (list, i); item = PL_ObjectAtIndex (list, i);
style = PL_String (item); style = PL_String (item);
sv.lightstyles[i] = str = Hunk_Alloc (strlen (style) + 1); sv.lightstyles[i] = str = Hunk_Alloc (0, strlen (style) + 1);
strcpy (str, style); strcpy (str, style);
} }
@ -803,7 +803,7 @@ Host_Say (qboolean teamonly)
save = host_client; save = host_client;
p = Hunk_TempAlloc (strlen (Cmd_Args (1)) + 1); p = Hunk_TempAlloc (0, strlen (Cmd_Args (1)) + 1);
strcpy (p, Cmd_Args (1)); strcpy (p, Cmd_Args (1));
// remove quotes if present // remove quotes if present
if (*p == '"') { if (*p == '"') {
@ -869,7 +869,7 @@ Host_Tell_f (void)
strcpy (text, host_client->name); strcpy (text, host_client->name);
strcat (text, ": "); strcat (text, ": ");
p = Hunk_TempAlloc (strlen (Cmd_Args (1)) + 1); p = Hunk_TempAlloc (0, strlen (Cmd_Args (1)) + 1);
strcpy (p, Cmd_Args (1)); strcpy (p, Cmd_Args (1));
// remove quotes if present // remove quotes if present

View file

@ -448,9 +448,9 @@ SV_Push (edict_t *pusher, const vec3_t tmove, const vec3_t amove)
VectorAdd (p_angles, amove, p_angles); VectorAdd (p_angles, amove, p_angles);
SV_LinkEdict (pusher, false); SV_LinkEdict (pusher, false);
mark = Hunk_LowMark (); mark = Hunk_LowMark (0);
moved_edict = Hunk_Alloc (sv.num_edicts * sizeof (edict_t *)); moved_edict = Hunk_Alloc (0, sv.num_edicts * sizeof (edict_t *));
moved_from = Hunk_Alloc (sv.num_edicts * sizeof (vec_t)); moved_from = Hunk_Alloc (0, sv.num_edicts * sizeof (vec_t));
// see if any solid entities are inside the final position // see if any solid entities are inside the final position
num_moved = 0; num_moved = 0;
@ -550,10 +550,10 @@ SV_Push (edict_t *pusher, const vec3_t tmove, const vec3_t amove)
VectorSubtract (m_angles, amove, m_angles); VectorSubtract (m_angles, amove, m_angles);
SV_LinkEdict (moved_edict[i], false); SV_LinkEdict (moved_edict[i], false);
} }
Hunk_FreeToLowMark (mark); Hunk_FreeToLowMark (0, mark);
return false; return false;
} }
Hunk_FreeToLowMark (mark); Hunk_FreeToLowMark (0, mark);
return true; return true;
} }

View file

@ -769,7 +769,7 @@ do_precache (progs_t *pr, const char **cache, int max, const char *name,
PR_CheckEmptyString (pr, name); PR_CheckEmptyString (pr, name);
s = Hunk_TempAlloc (strlen (name) + 1); s = Hunk_TempAlloc (0, strlen (name) + 1);
for (i = 0; *name; i++, name++) { for (i = 0; *name; i++, name++) {
int c = (byte) *name; int c = (byte) *name;
s[i] = tolower (c); s[i] = tolower (c);
@ -778,7 +778,7 @@ do_precache (progs_t *pr, const char **cache, int max, const char *name,
for (i = 0; i < MAX_SOUNDS; i++) { for (i = 0; i < MAX_SOUNDS; i++) {
if (!cache[i]) { if (!cache[i]) {
char *c = Hunk_Alloc (strlen (s) + 1); char *c = Hunk_Alloc (0, strlen (s) + 1);
strcpy (c, s); strcpy (c, s);
cache[i] = c; // blah, const cache[i] = c; // blah, const
Sys_MaskPrintf (SYS_dev, "%s: %3d %s\n", func, i, s); Sys_MaskPrintf (SYS_dev, "%s: %3d %s\n", func, i, s);

View file

@ -416,7 +416,7 @@ CL_ClearState (void)
VID_ClearMemory (); VID_ClearMemory ();
Mod_ClearAll (); Mod_ClearAll ();
if (host_hunklevel) // FIXME: check this... if (host_hunklevel) // FIXME: check this...
Hunk_FreeToLowMark (host_hunklevel); Hunk_FreeToLowMark (0, host_hunklevel);
CL_ClearEnts (); CL_ClearEnts ();
CL_ClearTEnts (); CL_ClearTEnts ();
@ -1812,8 +1812,8 @@ Host_Init (void)
// make sure all + commands have been executed // make sure all + commands have been executed
Cbuf_Execute_Stack (cl_cbuf); Cbuf_Execute_Stack (cl_cbuf);
Hunk_AllocName (0, "-HOST_HUNKLEVEL-"); Hunk_AllocName (0, 0, "-HOST_HUNKLEVEL-");
host_hunklevel = Hunk_LowMark (); host_hunklevel = Hunk_LowMark (0);
Sys_Printf ("\nClient version %s (build %04d)\n\n", PACKAGE_VERSION, Sys_Printf ("\nClient version %s (build %04d)\n\n", PACKAGE_VERSION,
build_number ()); build_number ());

View file

@ -319,7 +319,7 @@ CL_NewMap (const char *mapname)
r_funcs->R_NewMap (cl.worldmodel, cl.model_precache, cl.nummodels); r_funcs->R_NewMap (cl.worldmodel, cl.model_precache, cl.nummodels);
Team_NewMap (); Team_NewMap ();
Con_NewMap (); Con_NewMap ();
Hunk_Check (); // make sure nothing is hurt Hunk_Check (0); // make sure nothing is hurt
Sbar_CenterPrint (0); Sbar_CenterPrint (0);
if (cl.model_precache[1] && cl.model_precache[1]->brush.entities) { if (cl.model_precache[1] && cl.model_precache[1]->brush.entities) {

View file

@ -183,7 +183,7 @@ CL_Color_f (void)
static void static void
skin_f (cvar_t *var) skin_f (cvar_t *var)
{ {
char *s = Hunk_TempAlloc (strlen (var->string) + 1); char *s = Hunk_TempAlloc (0, strlen (var->string) + 1);
QFS_StripExtension (var->string, s); QFS_StripExtension (var->string, s);
Cvar_Set (var, s); Cvar_Set (var, s);
Cvar_Info (var); Cvar_Info (var);

View file

@ -779,7 +779,7 @@ SV_ConSay (const char *prefix, client_t *client)
if (Cmd_Argc () < 2) if (Cmd_Argc () < 2)
return; return;
p = Hunk_TempAlloc (strlen (Cmd_Args (1)) + 1); p = Hunk_TempAlloc (0, strlen (Cmd_Args (1)) + 1);
strcpy (p, Cmd_Args (1)); strcpy (p, Cmd_Args (1));
if (*p == '"') { if (*p == '"') {
p++; p++;

View file

@ -787,7 +787,7 @@ Demo_Init (void)
demo_name = dstring_newstr (); demo_name = dstring_newstr ();
demo_text = dstring_newstr (); demo_text = dstring_newstr ();
svs.demomem = Hunk_AllocName (size, "demo"); svs.demomem = Hunk_AllocName (0, size, "demo");
svs.demomemsize = size; svs.demomemsize = size;
demo_max_size = size - 0x80000; demo_max_size = size - 0x80000;

View file

@ -222,7 +222,8 @@ sv_alloc_vis_array (unsigned numleafs)
unsigned size = SET_SIZE (numleafs - 1); unsigned size = SET_SIZE (numleafs - 1);
if (size > SET_DEFMAP_SIZE * SET_BITS) { if (size > SET_DEFMAP_SIZE * SET_BITS) {
set_t *sets = Hunk_Alloc (numleafs * (sizeof (set_t) + size / 8)); set_t *sets = Hunk_Alloc (0,
numleafs * (sizeof (set_t) + size / 8));
unsigned words = size / SET_BITS; unsigned words = size / SET_BITS;
set_bits_t *bits = (set_bits_t *) (&sets[numleafs]); set_bits_t *bits = (set_bits_t *) (&sets[numleafs]);
for (unsigned i = 0; i < numleafs; i++) { for (unsigned i = 0; i < numleafs; i++) {
@ -232,7 +233,7 @@ sv_alloc_vis_array (unsigned numleafs)
} }
return sets; return sets;
} else { } else {
set_t *sets = Hunk_Alloc (numleafs * sizeof (set_t)); set_t *sets = Hunk_Alloc (0, numleafs * sizeof (set_t));
for (unsigned i = 0; i < numleafs; i++) { for (unsigned i = 0; i < numleafs; i++) {
sets[i].size = size; sets[i].size = size;
sets[i].map = sets[i].defmap; sets[i].map = sets[i].defmap;
@ -337,7 +338,7 @@ SV_SpawnServer (const char *server)
sv_pr_state.null_bad = 0; sv_pr_state.null_bad = 0;
Mod_ClearAll (); Mod_ClearAll ();
Hunk_FreeToLowMark (host_hunklevel); Hunk_FreeToLowMark (0, host_hunklevel);
// wipe the entire per-level structure, but don't lose sv.recorders // wipe the entire per-level structure, but don't lose sv.recorders
// or signon buffers (good thing we're not multi-threaded FIXME?) // or signon buffers (good thing we're not multi-threaded FIXME?)

View file

@ -2541,8 +2541,8 @@ SV_Init (void)
SVR_Init (); SVR_Init ();
Demo_Init (); Demo_Init ();
Hunk_AllocName (0, "-HOST_HUNKLEVEL-"); Hunk_AllocName (0, 0, "-HOST_HUNKLEVEL-");
host_hunklevel = Hunk_LowMark (); host_hunklevel = Hunk_LowMark (0);
Cbuf_InsertText (sv_cbuf, "exec server.cfg\n"); Cbuf_InsertText (sv_cbuf, "exec server.cfg\n");

View file

@ -451,9 +451,9 @@ SV_Push (edict_t *pusher, const vec3_t tmove, const vec3_t amove)
VectorAdd (p_angles, amove, p_angles); VectorAdd (p_angles, amove, p_angles);
SV_LinkEdict (pusher, false); SV_LinkEdict (pusher, false);
mark = Hunk_LowMark (); mark = Hunk_LowMark (0);
moved_edict = Hunk_Alloc (sv.num_edicts * sizeof (edict_t *)); moved_edict = Hunk_Alloc (0, sv.num_edicts * sizeof (edict_t *));
moved_from = Hunk_Alloc (sv.num_edicts * sizeof (vec_t)); moved_from = Hunk_Alloc (0, sv.num_edicts * sizeof (vec_t));
// see if any solid entities are inside the final position // see if any solid entities are inside the final position
num_moved = 0; num_moved = 0;
@ -553,10 +553,10 @@ SV_Push (edict_t *pusher, const vec3_t tmove, const vec3_t amove)
VectorSubtract (m_angles, amove, m_angles); VectorSubtract (m_angles, amove, m_angles);
SV_LinkEdict (moved_edict[i], false); SV_LinkEdict (moved_edict[i], false);
} }
Hunk_FreeToLowMark (mark); Hunk_FreeToLowMark (0, mark);
return false; return false;
} }
Hunk_FreeToLowMark (mark); Hunk_FreeToLowMark (0, mark);
return true; return true;
} }

View file

@ -739,7 +739,7 @@ do_precache (progs_t *pr, const char **cache, int max, const char *name,
PR_CheckEmptyString (pr, name); PR_CheckEmptyString (pr, name);
s = Hunk_TempAlloc (strlen (name) + 1); s = Hunk_TempAlloc (0, strlen (name) + 1);
for (i = 0; *name; i++, name++) { for (i = 0; *name; i++, name++) {
int c = (byte) *name; int c = (byte) *name;
s[i] = tolower (c); s[i] = tolower (c);
@ -748,7 +748,7 @@ do_precache (progs_t *pr, const char **cache, int max, const char *name,
for (i = 0; i < max; i++) { for (i = 0; i < max; i++) {
if (!cache[i]) { if (!cache[i]) {
char *c = Hunk_Alloc (strlen (s) + 1); char *c = Hunk_Alloc (0, strlen (s) + 1);
strcpy (c, s); strcpy (c, s);
cache[i] = c; // blah, const cache[i] = c; // blah, const
Sys_MaskPrintf (SYS_dev, "%s: %3d %s\n", func, i, s); Sys_MaskPrintf (SYS_dev, "%s: %3d %s\n", func, i, s);

View file

@ -174,7 +174,7 @@ PF_substr (progs_t *pr)
if (len > l) if (len > l)
len = l; len = l;
tmp = Hunk_TempAlloc (len + 1); tmp = Hunk_TempAlloc (0, len + 1);
strncpy (tmp, s, len); strncpy (tmp, s, len);
tmp[len] = 0; tmp[len] = 0;

View file

@ -862,7 +862,7 @@ SV_Say (qboolean team)
host_client->whensaid[host_client->whensaidhead] = realtime; host_client->whensaid[host_client->whensaidhead] = realtime;
} }
p = Hunk_TempAlloc (strlen (Cmd_Args (1)) + 1); p = Hunk_TempAlloc (0, strlen (Cmd_Args (1)) + 1);
strcpy (p, Cmd_Args (1)); strcpy (p, Cmd_Args (1));
if (*p == '"') { if (*p == '"') {

View file

@ -91,7 +91,7 @@ bi_read (progs_t *pr)
int res; int res;
char *buffer; char *buffer;
buffer = Hunk_TempAlloc (count); buffer = Hunk_TempAlloc (0, count);
if (!buffer) if (!buffer)
PR_Error (pr, "%s: couldn't allocate %d bytes", "bi_read", count); PR_Error (pr, "%s: couldn't allocate %d bytes", "bi_read", count);
res = read (handle, buffer, count); res = read (handle, buffer, count);