diff options
author | Andrey Nazarov <skuller@skuller.net> | 2008-08-16 10:19:42 +0000 |
---|---|---|
committer | Andrey Nazarov <skuller@skuller.net> | 2008-08-16 10:19:42 +0000 |
commit | 1526e22e4ff29153e9c127081e8ea8d9e2f33b8c (patch) | |
tree | b361766433d4a7b4a111865afd52803e2bbf7754 /source/q_fifo.h | |
parent | e826e5f176f21cd18b3bbc22887a266835ada57c (diff) |
Split some monolithic include files into smaller ones.
Use single BSP models cache for refresh and collision subsystems.
Refresh libraries may not longer be dynamically loaded.
Made gi.TagMalloc use separate tag namespace to avoid
conflicts with engine reserverd tags.
Fixed listing order of MVD channels in chooser menu.
A lot of misc changes... MSVC build is definitely broken now.
Diffstat (limited to 'source/q_fifo.h')
-rw-r--r-- | source/q_fifo.h | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/source/q_fifo.h b/source/q_fifo.h new file mode 100644 index 0000000..9d70bce --- /dev/null +++ b/source/q_fifo.h @@ -0,0 +1,114 @@ +/* +Copyright (C) 2003-2008 Andrey Nazarov + +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. + +*/ + +// +// q_fifo.h +// + +typedef struct { + byte *data; + size_t size; + size_t ax, ay, bs; +} fifo_t; + +static inline void *FIFO_Reserve( fifo_t *fifo, size_t *reserved ) { + size_t tail; + + if( fifo->bs ) { + *reserved = fifo->ax - fifo->bs; + return fifo->data + fifo->bs; + } + + tail = fifo->size - fifo->ay; + if( fifo->ax < tail ) { + *reserved = tail; + return fifo->data + fifo->ay; + } + + *reserved = fifo->ax; + return fifo->data; +} + +static inline void FIFO_Commit( fifo_t *fifo, size_t len ) { + size_t tail; + + if( fifo->bs ) { + fifo->bs += len; + return; + } + + tail = fifo->size - fifo->ay; + if( fifo->ax < tail ) { + fifo->ay += len; + return; + } + + fifo->bs = len; +} + +static inline void *FIFO_Peek( fifo_t *fifo, size_t *len ) { + *len = fifo->ay - fifo->ax; + return fifo->data + fifo->ax; +} + +static inline void FIFO_Decommit( fifo_t *fifo, size_t len ) { + if( fifo->ax + len < fifo->ay ) { + fifo->ax += len; + return; + } + + fifo->ay = fifo->bs; + fifo->ax = fifo->bs = 0; +} + +static inline size_t FIFO_Usage( fifo_t *fifo ) { + return fifo->ay - fifo->ax + fifo->bs; +} + +static inline int FIFO_Percent( fifo_t *fifo ) { + if( !fifo->size ) { + return 0; + } + return ( int )( FIFO_Usage( fifo ) * 100 / fifo->size ); +} + +static inline void FIFO_Clear( fifo_t *fifo ) { + fifo->ax = fifo->ay = fifo->bs = 0; +} + +size_t FIFO_Read( fifo_t *fifo, void *buffer, size_t len ); +size_t FIFO_Write( fifo_t *fifo, const void *buffer, size_t len ); + +static inline qboolean FIFO_TryRead( fifo_t *fifo, void *buffer, size_t len ) { + if( FIFO_Read( fifo, NULL, len ) < len ) { + return qfalse; + } + FIFO_Read( fifo, buffer, len ); + return qtrue; +} + +static inline qboolean FIFO_TryWrite( fifo_t *fifo, void *buffer, size_t len ) { + if( FIFO_Write( fifo, NULL, len ) < len ) { + return qfalse; + } + FIFO_Write( fifo, buffer, len ); + return qtrue; +} + |