diff options
| author | José Fonseca <jfonseca@vmware.com> | 2010-02-14 16:55:04 +0000 | 
|---|---|---|
| committer | José Fonseca <jfonseca@vmware.com> | 2010-02-14 23:25:33 +0000 | 
| commit | 2b4575f16d24a212b9a43cbd4a9966b3668e4b32 (patch) | |
| tree | 6d6eb6a87e5641fb48c9e76181893a711e01d43b /src/gallium/auxiliary | |
| parent | e7660a54423c69fe352e21eedd2a082d9c7aeac0 (diff) | |
os: Make streams abstract.
Also replace windows kernel stream with null implementation. It was
severely limited and no easy means to test it now.
Diffstat (limited to 'src/gallium/auxiliary')
| -rw-r--r-- | src/gallium/auxiliary/Makefile | 2 | ||||
| -rw-r--r-- | src/gallium/auxiliary/SConscript | 2 | ||||
| -rw-r--r-- | src/gallium/auxiliary/os/os_stream.h | 55 | ||||
| -rw-r--r-- | src/gallium/auxiliary/os/os_stream_null.c | 72 | ||||
| -rw-r--r-- | src/gallium/auxiliary/os/os_stream_stdc.c | 71 | ||||
| -rw-r--r-- | src/gallium/auxiliary/os/os_stream_wd.c | 222 | 
6 files changed, 160 insertions, 264 deletions
diff --git a/src/gallium/auxiliary/Makefile b/src/gallium/auxiliary/Makefile index 3f96da61ae..aea2123367 100644 --- a/src/gallium/auxiliary/Makefile +++ b/src/gallium/auxiliary/Makefile @@ -50,7 +50,7 @@ C_SOURCES = \  	indices/u_unfilled_gen.c \  	os/os_misc.c \  	os/os_stream_stdc.c \ -	os/os_stream_wd.c \ +	os/os_stream_null.c \  	os/os_time.c \  	pipebuffer/pb_buffer_malloc.c \  	pipebuffer/pb_bufmgr_alt.c \ diff --git a/src/gallium/auxiliary/SConscript b/src/gallium/auxiliary/SConscript index f226f46285..c8a3ecf4f9 100644 --- a/src/gallium/auxiliary/SConscript +++ b/src/gallium/auxiliary/SConscript @@ -84,7 +84,7 @@ source = [      'indices/u_unfilled_gen.c',      'os/os_misc.c',      'os/os_stream_stdc.c', -    'os/os_stream_wd.c', +    'os/os_stream_null.c',      'os/os_time.c',      'pipebuffer/pb_buffer_fenced.c',      'pipebuffer/pb_buffer_malloc.c', diff --git a/src/gallium/auxiliary/os/os_stream.h b/src/gallium/auxiliary/os/os_stream.h index bf30e6542d..8232b0f158 100644 --- a/src/gallium/auxiliary/os/os_stream.h +++ b/src/gallium/auxiliary/os/os_stream.h @@ -37,25 +37,54 @@  #include "pipe/p_compiler.h" -struct os_stream; - -  /** - * Create a stream - * @param filename relative or absolute path (necessary for windows)   - * @param optional maximum file size (0 for a growable size). + * OS stream (FILE, socket, etc) abstraction.   */ +struct os_stream +{ +   void +   (*close)(struct os_stream *stream); + +   boolean +   (*write)(struct os_stream *stream, const void *data, size_t size); + +   void +   (*flush)(struct os_stream *stream); +}; + + +static INLINE void +os_stream_close(struct os_stream *stream) +{ +   stream->close(stream); +} + + +static INLINE boolean +os_stream_write(struct os_stream *stream, const void *data, size_t size) +{ +   return stream->write(stream, data, size); +} + + +static INLINE void +os_stream_flush(struct os_stream *stream) +{ +   stream->flush(stream); +} + +  struct os_stream * -os_stream_create(const char *filename, size_t max_size); +os_file_stream_create(const char *filename); + -boolean -os_stream_write(struct os_stream *stream, const void *data, size_t size); +struct os_stream * +os_null_stream_create(void); -void -os_stream_flush(struct os_stream *stream); -void -os_stream_close(struct os_stream *stream); +#if defined(PIPE_SUBSYSTEM_WINDOWS_DISPLAY) +#define os_file_stream_create(_filename) os_null_stream_create() +#endif  #endif /* _OS_STREAM_H_ */ diff --git a/src/gallium/auxiliary/os/os_stream_null.c b/src/gallium/auxiliary/os/os_stream_null.c new file mode 100644 index 0000000000..b55ce9c926 --- /dev/null +++ b/src/gallium/auxiliary/os/os_stream_null.c @@ -0,0 +1,72 @@ +/************************************************************************** + * + * Copyright 2008-2010 VMware, Inc. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + **************************************************************************/ + +/** + * @file + * Stream implementation for the Windows Display driver. + */ + +#include "os_memory.h" +#include "os_stream.h" + + +static void +os_null_stream_close(struct os_stream *stream) +{ +   (void)stream; +} + + +static boolean +os_null_stream_write(struct os_stream *stream, const void *data, size_t size) +{ +   (void)data; +   (void)size; +   return TRUE; +} + + +static void +os_null_stream_flush(struct os_stream *stream) +{ +   (void)stream; +} + + +static struct os_stream +os_null_stream = { +   &os_null_stream_close, +   &os_null_stream_write, +   &os_null_stream_flush +}; + + +struct os_stream * +os_null_stream_create() +{ +   return &os_null_stream; +} diff --git a/src/gallium/auxiliary/os/os_stream_stdc.c b/src/gallium/auxiliary/os/os_stream_stdc.c index caa60c0b50..9a62799c0f 100644 --- a/src/gallium/auxiliary/os/os_stream_stdc.c +++ b/src/gallium/auxiliary/os/os_stream_stdc.c @@ -40,39 +40,40 @@  #include "os_stream.h" -struct os_stream  +struct os_stdc_stream  { +   struct os_stream base; +     FILE *file;  }; -struct os_stream * -os_stream_create(const char *filename, size_t max_size) +static INLINE struct os_stdc_stream * +os_stdc_stream(struct os_stream *stream)  { -   struct os_stream *stream; -    -   (void)max_size; -    -   stream = (struct os_stream *)calloc(1, sizeof(struct os_stream)); +   return (struct os_stdc_stream *)stream; +} + + +static void +os_stdc_stream_close(struct os_stream *_stream) +{ +   struct os_stdc_stream *stream = os_stdc_stream(_stream); +     if(!stream) -      goto no_stream; -    -   stream->file = fopen(filename, "w"); -   if(!stream->file) -      goto no_file; -    -   return stream; +      return; -no_file: +   fclose(stream->file); +     free(stream); -no_stream: -   return NULL;  } -boolean -os_stream_write(struct os_stream *stream, const void *data, size_t size) +static boolean +os_stdc_stream_write(struct os_stream *_stream, const void *data, size_t size)  { +   struct os_stdc_stream *stream = os_stdc_stream(_stream); +     if(!stream)        return FALSE; @@ -80,9 +81,11 @@ os_stream_write(struct os_stream *stream, const void *data, size_t size)  } -void -os_stream_flush(struct os_stream *stream)  +static void +os_stdc_stream_flush(struct os_stream *_stream)  { +   struct os_stdc_stream *stream = os_stdc_stream(_stream); +     if(!stream)        return; @@ -90,15 +93,29 @@ os_stream_flush(struct os_stream *stream)  } -void -os_stream_close(struct os_stream *stream)  +struct os_stream * +os_file_stream_create(const char *filename)  { +   struct os_stdc_stream *stream; + +   stream = (struct os_stdc_stream *)calloc(1, sizeof(struct os_stream));     if(!stream) -      return; -    -   fclose(stream->file); +      goto no_stream; +   stream->base.close = &os_stdc_stream_close; +   stream->base.write = &os_stdc_stream_write; +   stream->base.flush = &os_stdc_stream_flush; + +   stream->file = fopen(filename, "w"); +   if(!stream->file) +      goto no_file; + +   return &stream->base; + +no_file:     free(stream); +no_stream: +   return NULL;  } diff --git a/src/gallium/auxiliary/os/os_stream_wd.c b/src/gallium/auxiliary/os/os_stream_wd.c deleted file mode 100644 index a64cbcab4c..0000000000 --- a/src/gallium/auxiliary/os/os_stream_wd.c +++ /dev/null @@ -1,222 +0,0 @@ -/************************************************************************** - * - * Copyright 2008-2010 VMware, Inc. - * All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sub license, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial portions - * of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - **************************************************************************/ - -/** - * @file - * Stream implementation for the Windows Display driver. - */ - -#include "pipe/p_config.h" - -#if defined(PIPE_SUBSYSTEM_WINDOWS_DISPLAY) - -#include <windows.h> -#include <winddi.h> - -#include "os_memory.h" -#include "os_stream.h" - - -#define MAP_FILE_SIZE (4*1024*1024) - - -struct os_stream  -{ -   char filename[MAX_PATH + 1]; -   WCHAR wFileName[MAX_PATH + 1]; -   boolean growable; -   size_t map_size; -   ULONG_PTR iFile; -   char *pMap; -   size_t written; -   unsigned suffix; -}; - - -static INLINE boolean -os_stream_map(struct os_stream *stream) -{ -   ULONG BytesInUnicodeString; -   static char filename[MAX_PATH + 1]; -   unsigned filename_len; - -   if(stream->growable) -      filename_len = snprintf(filename, -                              sizeof(filename), -                              "%s.%04x", -                              stream->filename, -                              stream->suffix++); -   else -      filename_len = snprintf(filename, -                              sizeof(filename), -                              "%s", -                              stream->filename); - -   EngMultiByteToUnicodeN( -         stream->wFileName, -         sizeof(stream->wFileName), -         &BytesInUnicodeString, -         filename, -         filename_len); -    -   stream->pMap = EngMapFile(stream->wFileName, stream->map_size, &stream->iFile); -   if(!stream->pMap) -      return FALSE; -    -   memset(stream->pMap, 0, stream->map_size); -   stream->written = 0; -    -   return TRUE; -} - - -static INLINE void -os_stream_unmap(struct os_stream *stream) -{ -   EngUnmapFile(stream->iFile); -   if(stream->written < stream->map_size) { -      /* Truncate file size */ -      stream->pMap = EngMapFile(stream->wFileName, stream->written, &stream->iFile); -      if(stream->pMap) -         EngUnmapFile(stream->iFile); -   } -    -   stream->pMap = NULL; -} - - -static INLINE void -os_stream_full_qualified_filename(char *dst, size_t size, const char *src) -{ -   boolean need_drive, need_root; -    -   if((('A' <= src[0] && src[0] <= 'Z') || ('a' <= src[0] && src[0] <= 'z')) && src[1] == ':') { -      need_drive = FALSE; -      need_root = src[2] == '\\' ? FALSE : TRUE; -   } -   else { -      need_drive = TRUE; -      need_root = src[0] == '\\' ? FALSE : TRUE; -   } -    -   snprintf(dst, size, -            "\\??\\%s%s%s", -            need_drive ? "C:" : "", -            need_root ? "\\" : "", -            src); -} - - -struct os_stream * -os_stream_create(const char *filename, size_t max_size) -{ -   struct os_stream *stream; -    -   stream = CALLOC_STRUCT(os_stream); -   if(!stream) -      goto error1; -    -   os_stream_full_qualified_filename(stream->filename, -                                       sizeof(stream->filename), -                                       filename); -    -   if(max_size) { -      stream->growable = FALSE; -      stream->map_size = max_size; -   } -   else { -      stream->growable = TRUE; -      stream->map_size = MAP_FILE_SIZE; -   } -    -   if(!os_stream_map(stream)) -      goto error2; -    -   return stream; -    -error2: -   FREE(stream); -error1: -   return NULL; -} - - -static INLINE void -os_stream_copy(struct os_stream *stream, const char *data, size_t size) -{ -   assert(stream->written + size <= stream->map_size); -   memcpy(stream->pMap + stream->written, data, size); -   stream->written += size; -} - - -boolean -os_stream_write(struct os_stream *stream, const void *data, size_t size) -{ -   if(!stream) -      return FALSE; -    -   if(!stream->pMap) -      return FALSE; -    -   while(stream->written + size > stream->map_size) { -      size_t step = stream->map_size - stream->written; -      os_stream_copy(stream, data, step); -      data = (const char *)data + step; -      size -= step; -       -      os_stream_unmap(stream); -      if(!stream->growable || !os_stream_map(stream)) -         return FALSE; -   } - -   os_stream_copy(stream, data, size); -    -   return TRUE; -} - - -void -os_stream_flush(struct os_stream *stream)  -{ -   (void)stream; -} - - -void -os_stream_close(struct os_stream *stream)  -{ -   if(!stream) -      return; -    -   os_stream_unmap(stream); - -   FREE(stream); -} - - -#endif  | 
