X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fmemory.c;h=404bbc481b36a967e5fa04c94c406842afd14a0c;hb=9df860ab2839447c7143bbe705a573df152d7734;hp=7089cc5cadb64d31aec69a2ecd8dccc6b518821d;hpb=2b481ae25adcf3bebf37be182eafc8bfa0acb4c1;p=flatwaifu.git diff --git a/src/memory.c b/src/memory.c index 7089cc5..404bbc4 100644 --- a/src/memory.c +++ b/src/memory.c @@ -1,91 +1,91 @@ -/* - Copyright (C) Prikol Software 1996-1997 - Copyright (C) Aleksey Volynskov 1996-1997 - - This file is part of the Doom2D:Rembo project. - - Doom2D:Rembo is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License version 2 as - published by the Free Software Foundation. - - Doom2D:Rembo is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, see or - write to the Free Software Foundation, Inc., - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ +/* Copyright (C) 1996-1997 Aleksey Volynskov + * Copyright (C) 2011 Rambo + * Copyright (C) 2020 SovietPony + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License ONLY. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "glob.h" #include #include #include +#include #include "error.h" #include "files.h" #include "memory.h" -static byte m_active; -static void *resp[MAX_WAD]; -static short resl[MAX_WAD]; +#include "common/wadres.h" +#include "common/streams.h" + +typedef struct Block { + int id; + int ref; + char data[]; +} Block; + +static Block *blocks[MAX_RESOURCES]; void M_startup (void) { - if(m_active) return; - logo("M_startup: настройка памяти\n"); - memset(resp,0,sizeof(resp)); - memset(resl,0,sizeof(resl)); - // logo(" свободно DPMI-памяти: %uK\n",dpmi_memavl()>>10); - m_active=TRUE; + memset(blocks, 0, sizeof(blocks)); } void M_shutdown (void) { - if(!m_active) return; - m_active=FALSE; + // stub } -static void allocres (int h) { - int *p,s; - - if(h>d_start && h=MAX_WAD) ERR_fatal("M_lock: странный номер ресурса"); - if(!resl[h]) if(!resp[h]) allocres(h); - ++resl[h]; - return resp[h]; +void *M_lock (int id) { + assert(id >= -1 && id < MAX_RESOURCES); + if (id >= 0) { + Block *x = blocks[id]; + if (x) { + x->ref += 1; + return x->data; + } else { + x = malloc(sizeof(Block) + WADRES_getsize(id)); + if (x) { + x->id = id; + x->ref = 1; + WADRES_getdata(id, x->data); + blocks[id] = x; + return x->data; + } + } + } + return NULL; } void M_unlock (void *p) { - int h; - - if(!p) return; - h=((int*)p)[-1]; - if(h>=MAX_WAD) ERR_fatal("M_unlock: странный номер ресурса"); - if(!resl[h]) return; - --resl[h]; + if (p) { + Block *x = p - sizeof(Block); + int id = x->id; + assert(id >= 0 && id < MAX_RESOURCES); + x->ref -= 1; + assert(x->ref >= 0); +#if 0 + if (x->ref == 0) { + blocks[id] = NULL; + free(x); + } +#endif + } } -int M_locked (int h) { - return (h != -1) && (h != 0xFFFF) && (resl[h] != 0); +int M_locked (int id) { + assert(id >= -1 && id < MAX_RESOURCES); + return (id >= 0) && (blocks[id] != NULL) && (blocks[id]->ref >= 1); } -int M_was_locked (int h) { - return (h != -1) && (h != 0xFFFF) && (resp[h] != NULL); +int M_was_locked (int id) { + assert(id >= -1 && id < MAX_RESOURCES); + return (id >= 0) && (blocks[id] != NULL) && (blocks[id]->ref >= 0); }