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);
}