From 9a750b4e4ef463fbbf901a86c2777ce9b3e80e50 Mon Sep 17 00:00:00 2001 From: Yamagi Burmeister Date: Mon, 18 Oct 2010 13:19:17 +0000 Subject: [PATCH] Bennene posix.c zu hunk.c um --- Makefile | 12 +- src/posix/hunk.c | 142 ++++++++++++++++++++ src/posix/posix.c | 325 --------------------------------------------- src/posix/system.c | 207 +++++++++++++++++++++++++++-- 4 files changed, 345 insertions(+), 341 deletions(-) create mode 100644 src/posix/hunk.c delete mode 100644 src/posix/posix.c diff --git a/Makefile b/Makefile index cf2d5630..9339d3a3 100644 --- a/Makefile +++ b/Makefile @@ -254,7 +254,7 @@ SERVER_OBJS = \ # POSIX platform objects POSIX_OBJS = \ build/posix/network.o \ - build/posix/posix.o \ + build/posix/hunk.o \ build/posix/system.o \ build/posix/glob/glob.o \ build/posix/vid/menu.o \ @@ -314,7 +314,7 @@ DEDICATED_SERVER_COMMON_OBJS = \ DEDICATED_SERVER_POSIX_OBJS = \ build/dedicated_server_posix/glob/glob.o \ build/dedicated_server_posix/network.o \ - build/dedicated_server_posix/posix.o \ + build/dedicated_server_posix/hunk.o \ build/dedicated_server_posix/system.o # ---------- @@ -343,7 +343,7 @@ OPENGL_GAME_OBJS = \ OPENGL_POSIX_OBJS = \ build/ref_gl_posix/abi.o \ build/ref_gl_posix/glob.o \ - build/ref_gl_posix/posix.o \ + build/ref_gl_posix/hunk.o \ build/ref_gl_posix/qgl.o \ build/ref_gl_posix/refresh.o @@ -620,7 +620,7 @@ build/server/sv_world.o : src/server/sv_world.c build/posix/network.o : src/posix/network.c $(CC) $(CFLAGS_CLIENT) -o $@ -c $< -build/posix/posix.o : src/posix/posix.c +build/posix/hunk.o : src/posix/hunk.c $(CC) $(CFLAGS_CLIENT) -o $@ -c $< build/posix/system.o : src/posix/system.c @@ -750,7 +750,7 @@ build/dedicated_server_posix/glob/glob.o : src/posix/glob/glob.c build/dedicated_server_posix/network.o : src/posix/network.c $(CC) $(CFLAGS_DEDICATED_SERVER) -o $@ -c $< -build/dedicated_server_posix/posix.o : src/posix/posix.c +build/dedicated_server_posix/hunk.o : src/posix/hunk.c $(CC) $(CFLAGS_DEDICATED_SERVER) -o $@ -c $< build/dedicated_server_posix/system.o : src/posix/system.c @@ -800,7 +800,7 @@ build/ref_gl_posix/abi.o: src/posix/refresh/abi.c build/ref_gl_posix/glob.o: src/posix/glob/glob.c $(CC) $(CFLAGS_OPENGL) -o $@ -c $< -build/ref_gl_posix/posix.o: src/posix/posix.c +build/ref_gl_posix/hunk.o: src/posix/hunk.c $(CC) $(CFLAGS_OPENGL) -o $@ -c $< build/ref_gl_posix/qgl.o: src/posix/refresh/qgl.c diff --git a/src/posix/hunk.c b/src/posix/hunk.c new file mode 100644 index 00000000..ba74a7b1 --- /dev/null +++ b/src/posix/hunk.c @@ -0,0 +1,142 @@ +/* + * Copyright (C) 1997-2001 Id Software, Inc. + * + * 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; either version 2 of the License, or (at + * your option) any later version. + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * ======================================================================= + * + * This file implements the low level part of the Hunk_* memory system + * + * ======================================================================= + */ + +#include +#include +#include + +#include "../common/header/common.h" + +#if defined( __FreeBSD__ ) + #include + #define MAP_ANONYMOUS MAP_ANON +#endif + + +/* For mremap() */ +#if defined( __linux__ ) + #define __USE_GNU +#endif + +byte *membase; +int maxhunksize; +int curhunksize; + +void * +Hunk_Begin ( int maxsize ) +{ + /* reserve a huge chunk of memory, but don't commit any yet */ + maxhunksize = maxsize + sizeof ( int ); + curhunksize = 0; + + membase = mmap( 0, maxhunksize, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0 ); + + if ( ( membase == NULL ) || ( membase == (byte *) -1 ) ) + { + Sys_Error( "unable to virtual allocate %d bytes", maxsize ); + } + + *( (int *) membase ) = curhunksize; + + return ( membase + sizeof ( int ) ); +} + +void * +Hunk_Alloc ( int size ) +{ + byte *buf; + + /* round to cacheline */ + size = ( size + 31 ) & ~31; + + if ( curhunksize + size > maxhunksize ) + { + Sys_Error( "Hunk_Alloc overflow" ); + } + + buf = membase + sizeof ( int ) + curhunksize; + curhunksize += size; + return ( buf ); +} + +int +Hunk_End ( void ) +{ + byte *n = NULL; + +#if defined( __FreeBSD__ ) + size_t old_size = maxhunksize; + size_t new_size = curhunksize + sizeof ( int ); + void *unmap_base; + size_t unmap_len; + + new_size = round_page( new_size ); + old_size = round_page( old_size ); + + if ( new_size > old_size ) + { + n = 0; /* error */ + } + else if ( new_size < old_size ) + { + unmap_base = (caddr_t) ( membase + new_size ); + unmap_len = old_size - new_size; + n = munmap( unmap_base, unmap_len ) + membase; + } + +#endif + +#if defined( __linux__ ) + n = mremap( membase, maxhunksize, curhunksize + sizeof ( int ), 0 ); +#endif + + if ( n != membase ) + { + Sys_Error( "Hunk_End: Could not remap virtual block (%d)", errno ); + } + + *( (int *) membase ) = curhunksize + sizeof ( int ); + + return ( curhunksize ); +} + +void +Hunk_Free ( void *base ) +{ + byte *m; + + if ( base ) + { + m = ( (byte *) base ) - sizeof ( int ); + + if ( munmap( m, *( (int *) m ) ) ) + { + Sys_Error( "Hunk_Free: munmap failed (%d)", errno ); + } + } +} + diff --git a/src/posix/posix.c b/src/posix/posix.c deleted file mode 100644 index 6a2b4435..00000000 --- a/src/posix/posix.c +++ /dev/null @@ -1,325 +0,0 @@ -/* - * Copyright (C) 1997-2001 Id Software, Inc. - * - * 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; either version 2 - * of the License, or (at your option) any later version. - * - * 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, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - #include "glob/glob.h" -#include "../common/header/common.h" - -#if defined( __FreeBSD__ ) - #include - #define MAP_ANONYMOUS MAP_ANON -#endif - - -/* For mremap() */ -#if defined( __linux__ ) - #define __USE_GNU -#endif - -byte *membase; -int maxhunksize; -int curhunksize; - -void * -Hunk_Begin ( int maxsize ) -{ - /* reserve a huge chunk of memory, but don't commit any yet */ - maxhunksize = maxsize + sizeof ( int ); - curhunksize = 0; - - membase = mmap( 0, maxhunksize, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0 ); - - if ( ( membase == NULL ) || ( membase == (byte *) -1 ) ) - { - Sys_Error( "unable to virtual allocate %d bytes", maxsize ); - } - - *( (int *) membase ) = curhunksize; - - return ( membase + sizeof ( int ) ); -} - -void * -Hunk_Alloc ( int size ) -{ - byte *buf; - - /* round to cacheline */ - size = ( size + 31 ) & ~31; - - if ( curhunksize + size > maxhunksize ) - { - Sys_Error( "Hunk_Alloc overflow" ); - } - - buf = membase + sizeof ( int ) + curhunksize; - curhunksize += size; - return ( buf ); -} - -int -Hunk_End ( void ) -{ - byte *n = NULL; - -#if defined( __FreeBSD__ ) - size_t old_size = maxhunksize; - size_t new_size = curhunksize + sizeof ( int ); - void *unmap_base; - size_t unmap_len; - - new_size = round_page( new_size ); - old_size = round_page( old_size ); - - if ( new_size > old_size ) - { - n = 0; /* error */ - } - else if ( new_size < old_size ) - { - unmap_base = (caddr_t) ( membase + new_size ); - unmap_len = old_size - new_size; - n = munmap( unmap_base, unmap_len ) + membase; - } - -#endif - -#if defined( __linux__ ) - n = mremap( membase, maxhunksize, curhunksize + sizeof ( int ), 0 ); -#endif - - if ( n != membase ) - { - Sys_Error( "Hunk_End: Could not remap virtual block (%d)", errno ); - } - - *( (int *) membase ) = curhunksize + sizeof ( int ); - - return ( curhunksize ); -} - -void -Hunk_Free ( void *base ) -{ - byte *m; - - if ( base ) - { - m = ( (byte *) base ) - sizeof ( int ); - - if ( munmap( m, *( (int *) m ) ) ) - { - Sys_Error( "Hunk_Free: munmap failed (%d)", errno ); - } - } -} - -int curtime; - -int -Sys_Milliseconds ( void ) -{ - struct timeval tp; - struct timezone tzp; - static int secbase; - - gettimeofday( &tp, &tzp ); - - if ( !secbase ) - { - secbase = tp.tv_sec; - return ( tp.tv_usec / 1000 ); - } - - curtime = ( tp.tv_sec - secbase ) * 1000 + tp.tv_usec / 1000; - - return ( curtime ); -} - -void -Sys_Mkdir ( char *path ) -{ - mkdir( path, 0755 ); -} - -void -Sys_Rmdir ( char *path ) -{ - rmdir( path ); -} - -char * -Sys_GetCurrentDirectory ( void ) -{ - static char dir [ MAX_OSPATH ]; - - if ( !getcwd( dir, sizeof ( dir ) ) ) - { - Sys_Error( "Couldn't get current working directory" ); - } - - return ( dir ); -} - -char * -strlwr ( char *s ) -{ - char *p = s; - - while ( *s ) - { - *s = tolower( *s ); - s++; - } - - return ( p ); -} - - -static char findbase [ MAX_OSPATH ]; -static char findpath [ MAX_OSPATH ]; -static char findpattern [ MAX_OSPATH ]; -static DIR *fdir; - -static qboolean -CompareAttributes ( char *path, char *name, unsigned musthave, unsigned canthave ) -{ - struct stat st; - char fn [ MAX_OSPATH ]; - - /* . and .. never match */ - if ( ( strcmp( name, "." ) == 0 ) || ( strcmp( name, ".." ) == 0 ) ) - { - return ( false ); - } - - return ( true ); - - if ( stat( fn, &st ) == -1 ) - { - return ( false ); /* shouldn't happen */ - } - - if ( ( st.st_mode & S_IFDIR ) && ( canthave & SFF_SUBDIR ) ) - { - return ( false ); - } - - if ( ( musthave & SFF_SUBDIR ) && !( st.st_mode & S_IFDIR ) ) - { - return ( false ); - } - - return ( true ); -} - -char * -Sys_FindFirst ( char *path, unsigned musthave, unsigned canhave ) -{ - struct dirent *d; - char *p; - - if ( fdir ) - { - Sys_Error( "Sys_BeginFind without close" ); - } - - strcpy( findbase, path ); - - if ( ( p = strrchr( findbase, '/' ) ) != NULL ) - { - *p = 0; - strcpy( findpattern, p + 1 ); - } - else - { - strcpy( findpattern, "*" ); - } - - if ( strcmp( findpattern, "*.*" ) == 0 ) - { - strcpy( findpattern, "*" ); - } - - if ( ( fdir = opendir( findbase ) ) == NULL ) - { - return ( NULL ); - } - - while ( ( d = readdir( fdir ) ) != NULL ) - { - if ( !*findpattern || glob_match( findpattern, d->d_name ) ) - { - if ( CompareAttributes( findbase, d->d_name, musthave, canhave ) ) - { - sprintf( findpath, "%s/%s", findbase, d->d_name ); - return ( findpath ); - } - } - } - - return ( NULL ); -} - -char * -Sys_FindNext ( unsigned musthave, unsigned canhave ) -{ - struct dirent *d; - - if ( fdir == NULL ) - { - return ( NULL ); - } - - while ( ( d = readdir( fdir ) ) != NULL ) - { - if ( !*findpattern || glob_match( findpattern, d->d_name ) ) - { - if ( CompareAttributes( findbase, d->d_name, musthave, canhave ) ) - { - sprintf( findpath, "%s/%s", findbase, d->d_name ); - return ( findpath ); - } - } - } - - return ( NULL ); -} - -void -Sys_FindClose ( void ) -{ - if ( fdir != NULL ) - { - closedir( fdir ); - } - - fdir = NULL; -} - diff --git a/src/posix/system.c b/src/posix/system.c index 6d586caf..18764410 100644 --- a/src/posix/system.c +++ b/src/posix/system.c @@ -1,22 +1,29 @@ /* * Copyright (C) 1997-2001 Id Software, Inc. * - * 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; either version 2 - * of the License, or (at your option) any later version. + * 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; either version 2 of the License, or (at + * your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of + * 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, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. * + * ======================================================================= + * + * This file implements all system dependend generic funktions + * + * ======================================================================= */ + #include #include #include @@ -36,18 +43,201 @@ #include #include #include +#include +#include "glob/glob.h" #include "../common/header/common.h" #include "posix.h" unsigned sys_frame_time; +int curtime; static void *game_library; +static char findbase [ MAX_OSPATH ]; +static char findpath [ MAX_OSPATH ]; +static char findpattern [ MAX_OSPATH ]; +static DIR *fdir; + cvar_t *nostdout; uid_t saved_euid; qboolean stdin_active = true; +int +Sys_Milliseconds ( void ) +{ + struct timeval tp; + struct timezone tzp; + static int secbase; + + gettimeofday( &tp, &tzp ); + + if ( !secbase ) + { + secbase = tp.tv_sec; + return ( tp.tv_usec / 1000 ); + } + + curtime = ( tp.tv_sec - secbase ) * 1000 + tp.tv_usec / 1000; + + return ( curtime ); +} + +void +Sys_Mkdir ( char *path ) +{ + mkdir( path, 0755 ); +} + +void +Sys_Rmdir ( char *path ) +{ + rmdir( path ); +} + +char * +Sys_GetCurrentDirectory ( void ) +{ + static char dir [ MAX_OSPATH ]; + + if ( !getcwd( dir, sizeof ( dir ) ) ) + { + Sys_Error( "Couldn't get current working directory" ); + } + + return ( dir ); +} + +char * +strlwr ( char *s ) +{ + char *p = s; + + while ( *s ) + { + *s = tolower( *s ); + s++; + } + + return ( p ); +} + +static qboolean +CompareAttributes ( char *path, char *name, unsigned musthave, unsigned canthave ) +{ + struct stat st; + char fn [ MAX_OSPATH ]; + + /* . and .. never match */ + if ( ( strcmp( name, "." ) == 0 ) || ( strcmp( name, ".." ) == 0 ) ) + { + return ( false ); + } + + return ( true ); + + if ( stat( fn, &st ) == -1 ) + { + return ( false ); /* shouldn't happen */ + } + + if ( ( st.st_mode & S_IFDIR ) && ( canthave & SFF_SUBDIR ) ) + { + return ( false ); + } + + if ( ( musthave & SFF_SUBDIR ) && !( st.st_mode & S_IFDIR ) ) + { + return ( false ); + } + + return ( true ); +} + +char * +Sys_FindFirst ( char *path, unsigned musthave, unsigned canhave ) +{ + struct dirent *d; + char *p; + + if ( fdir ) + { + Sys_Error( "Sys_BeginFind without close" ); + } + + strcpy( findbase, path ); + + if ( ( p = strrchr( findbase, '/' ) ) != NULL ) + { + *p = 0; + strcpy( findpattern, p + 1 ); + } + else + { + strcpy( findpattern, "*" ); + } + + if ( strcmp( findpattern, "*.*" ) == 0 ) + { + strcpy( findpattern, "*" ); + } + + if ( ( fdir = opendir( findbase ) ) == NULL ) + { + return ( NULL ); + } + + while ( ( d = readdir( fdir ) ) != NULL ) + { + if ( !*findpattern || glob_match( findpattern, d->d_name ) ) + { + if ( CompareAttributes( findbase, d->d_name, musthave, canhave ) ) + { + sprintf( findpath, "%s/%s", findbase, d->d_name ); + return ( findpath ); + } + } + } + + return ( NULL ); +} + +char * +Sys_FindNext ( unsigned musthave, unsigned canhave ) +{ + struct dirent *d; + + if ( fdir == NULL ) + { + return ( NULL ); + } + + while ( ( d = readdir( fdir ) ) != NULL ) + { + if ( !*findpattern || glob_match( findpattern, d->d_name ) ) + { + if ( CompareAttributes( findbase, d->d_name, musthave, canhave ) ) + { + sprintf( findpath, "%s/%s", findbase, d->d_name ); + return ( findpath ); + } + } + } + + return ( NULL ); +} + +void +Sys_FindClose ( void ) +{ + if ( fdir != NULL ) + { + closedir( fdir ); + } + + fdir = NULL; +} + void Sys_ConsoleOutput ( char *string ) { @@ -203,7 +393,6 @@ Sys_ConsoleInput ( void ) return ( text ); } - void Sys_UnloadGame ( void ) { @@ -319,8 +508,6 @@ Sys_SendKeyEvents ( void ) sys_frame_time = Sys_Milliseconds(); } -/*****************************************************************************/ - int main ( int argc, char **argv ) {