File: win32\q_shwin.c

    1 /*
    2 Copyright (C) 1997-2001 Id Software, Inc.
    3 
    4 This program is free software; you can redistribute it and/or
    5 modify it under the terms of the GNU General Public License
    6 as published by the Free Software Foundation; either version 2
    7 of the License, or (at your option) any later version.
    8 
    9 This program is distributed in the hope that it will be useful,
   10 but WITHOUT ANY WARRANTY; without even the implied warranty of
   11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
   12 
   13 See the GNU General Public License for more details.
   14 
   15 You should have received a copy of the GNU General Public License
   16 along with this program; if not, write to the Free Software
   17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
   18 
   19 */
   20 
   21 #include "../qcommon/qcommon.h"
   22 #include "winquake.h"
   23 #include <errno.h>
   24 #include <fcntl.h>
   25 #include <stdio.h>
   26 #include <direct.h>
   27 #include <io.h>
   28 #include <conio.h>
   29 
   30 //===============================================================================
   31 
   32 int             hunkcount;
   33 
   34 
   35 byte    *membase;
   36 int             hunkmaxsize;
   37 int             cursize;
   38 
   39 #define VIRTUAL_ALLOC
   40 
   41 void *Hunk_Begin (int maxsize)
   42 {
   43         // reserve a huge chunk of memory, but don't commit any yet
   44         cursize = 0;
   45         hunkmaxsize = maxsize;
   46 #ifdef VIRTUAL_ALLOC
   47         membase = VirtualAlloc (NULL, maxsize, MEM_RESERVE, PAGE_NOACCESS);
48 #else 49 membase = malloc (maxsize); 50 memset (membase, 0, maxsize);
51 #endif 52 if (!membase) 53 Sys_Error ("VirtualAlloc reserve failed"); 54 return (void *)membase; 55 } 56 57 void *Hunk_Alloc (int size) 58 { 59 void *buf; 60 61 // round to cacheline 62 size = (size+31)&~31; 63 64 #ifdef VIRTUAL_ALLOC 65 // commit pages as needed 66 // buf = VirtualAlloc (membase+cursize, size, MEM_COMMIT, PAGE_READWRITE); 67 buf = VirtualAlloc (membase, cursize+size, MEM_COMMIT, PAGE_READWRITE); 68 if (!buf) 69 { 70 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &buf, 0, NULL); 71 Sys_Error ("VirtualAlloc commit failed.\n%s", buf); 72 } 73 #endif 74 cursize += size; 75 if (cursize > hunkmaxsize) 76 Sys_Error ("Hunk_Alloc overflow"); 77 78 return (void *)(membase+cursize-size); 79 } 80 81 int Hunk_End (void) 82 { 83 84 // free the remaining unused virtual memory 85 #if 0
86 void *buf; 87 88 // write protect it 89 buf = VirtualAlloc (membase, cursize, MEM_COMMIT, PAGE_READONLY); 90 if (!buf) 91 Sys_Error ("VirtualAlloc commit failed");
92 #endif 93 94 hunkcount++; 95 //Com_Printf ("hunkcount: %i\n", hunkcount); 96 return cursize; 97 } 98 99 void Hunk_Free (void *base) 100 { 101 if ( base ) 102 #ifdef VIRTUAL_ALLOC 103 VirtualFree (base, 0, MEM_RELEASE);
104 #else 105 free (base);
106 #endif 107 108 hunkcount--; 109 } 110 111 //=============================================================================== 112 113 114 /* 115 ================ 116 Sys_Milliseconds 117 ================ 118 */ 119 int curtime; 120 int Sys_Milliseconds (void) 121 { 122 static int base; 123 static qboolean initialized = false; 124 125 if (!initialized) 126 { // let base retain 16 bits of effectively random data 127 base = timeGetTime() & 0xffff0000; 128 initialized = true; 129 } 130 curtime = timeGetTime() - base; 131 132 return curtime; 133 } 134 135 void Sys_Mkdir (char *path) 136 { 137 _mkdir (path); 138 } 139 140 //============================================ 141 142 char findbase[MAX_OSPATH]; 143 char findpath[MAX_OSPATH]; 144 int findhandle; 145 146 static qboolean CompareAttributes( unsigned found, unsigned musthave, unsigned canthave ) 147 { 148 if ( ( found & _A_RDONLY ) && ( canthave & SFF_RDONLY ) ) 149 return false; 150 if ( ( found & _A_HIDDEN ) && ( canthave & SFF_HIDDEN ) ) 151 return false; 152 if ( ( found & _A_SYSTEM ) && ( canthave & SFF_SYSTEM ) ) 153 return false; 154 if ( ( found & _A_SUBDIR ) && ( canthave & SFF_SUBDIR ) ) 155 return false; 156 if ( ( found & _A_ARCH ) && ( canthave & SFF_ARCH ) ) 157 return false; 158 159 if ( ( musthave & SFF_RDONLY ) && !( found & _A_RDONLY ) ) 160 return false; 161 if ( ( musthave & SFF_HIDDEN ) && !( found & _A_HIDDEN ) ) 162 return false; 163 if ( ( musthave & SFF_SYSTEM ) && !( found & _A_SYSTEM ) ) 164 return false; 165 if ( ( musthave & SFF_SUBDIR ) && !( found & _A_SUBDIR ) ) 166 return false; 167 if ( ( musthave & SFF_ARCH ) && !( found & _A_ARCH ) ) 168 return false; 169 170 return true; 171 } 172 173 char *Sys_FindFirst (char *path, unsigned musthave, unsigned canthave ) 174 { 175 struct _finddata_t findinfo; 176 177 if (findhandle) 178 Sys_Error ("Sys_BeginFind without close"); 179 findhandle = 0; 180 181 COM_FilePath (path, findbase); 182 findhandle = _findfirst (path, &findinfo); 183 if (findhandle == -1) 184 return NULL; 185 if ( !CompareAttributes( findinfo.attrib, musthave, canthave ) ) 186 return NULL; 187 Com_sprintf (findpath, sizeof(findpath), "%s/%s", findbase, findinfo.name); 188 return findpath; 189 } 190 191 char *Sys_FindNext ( unsigned musthave, unsigned canthave ) 192 { 193 struct _finddata_t findinfo; 194 195 if (findhandle == -1) 196 return NULL; 197 if (_findnext (findhandle, &findinfo) == -1) 198 return NULL; 199 if ( !CompareAttributes( findinfo.attrib, musthave, canthave ) ) 200 return NULL; 201 202 Com_sprintf (findpath, sizeof(findpath), "%s/%s", findbase, findinfo.name); 203 return findpath; 204 } 205 206 void Sys_FindClose (void) 207 { 208 if (findhandle != -1) 209 _findclose (findhandle); 210 findhandle = 0; 211 } 212 213 214 //============================================ 215 216