src/thread/win32/SDL_sysmutex.c

/* [<][>]
[^][v][top][bottom][index][help] */

FUNCTIONS

This source file includes following functions.
  1. SDL_CreateMutex
  2. SDL_DestroyMutex
  3. SDL_mutexP
  4. SDL_mutexV

   1 /*
   2     SDL - Simple DirectMedia Layer
   3     Copyright (C) 1997, 1998, 1999, 2000, 2001  Sam Lantinga
   4 
   5     This library is free software; you can redistribute it and/or
   6     modify it under the terms of the GNU Library General Public
   7     License as published by the Free Software Foundation; either
   8     version 2 of the License, or (at your option) any later version.
   9 
  10     This library is distributed in the hope that it will be useful,
  11     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13     Library General Public License for more details.
  14 
  15     You should have received a copy of the GNU Library General Public
  16     License along with this library; if not, write to the Free
  17     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18 
  19     Sam Lantinga
  20     slouken@devolution.com
  21 */
  22 
  23 #ifdef SAVE_RCSID
  24 static char rcsid =
  25  "@(#) $Id: SDL_sysmutex.c,v 1.1.2.4 2001/02/10 07:20:04 hercules Exp $";
  26 #endif
  27 
  28 /* Mutex functions using the Win32 API */
  29 
  30 #include <stdio.h>
  31 #include <stdlib.h>
  32 #include <windows.h>
  33 
  34 #include "SDL_error.h"
  35 #include "SDL_mutex.h"
  36 
  37 
  38 struct SDL_mutex {
  39         HANDLE id;
  40 };
  41 
  42 /* Create a mutex */
  43 SDL_mutex *SDL_CreateMutex(void)
     /* [<][>][^][v][top][bottom][index][help] */
  44 {
  45         SDL_mutex *mutex;
  46 
  47         /* Allocate mutex memory */
  48         mutex = (SDL_mutex *)malloc(sizeof(*mutex));
  49         if ( mutex ) {
  50                 /* Create the mutex, with initial value signaled */
  51                 mutex->id = CreateMutex(NULL, FALSE, NULL);
  52                 if ( ! mutex->id ) {
  53                         SDL_SetError("Couldn't create mutex");
  54                         free(mutex);
  55                         mutex = NULL;
  56                 }
  57         } else {
  58                 SDL_OutOfMemory();
  59         }
  60         return(mutex);
  61 }
  62 
  63 /* Free the mutex */
  64 void SDL_DestroyMutex(SDL_mutex *mutex)
     /* [<][>][^][v][top][bottom][index][help] */
  65 {
  66         if ( mutex ) {
  67                 if ( mutex->id ) {
  68                         CloseHandle(mutex->id);
  69                         mutex->id = 0;
  70                 }
  71                 free(mutex);
  72         }
  73 }
  74 
  75 /* Lock the mutex */
  76 int SDL_mutexP(SDL_mutex *mutex)
     /* [<][>][^][v][top][bottom][index][help] */
  77 {
  78         if ( mutex == NULL ) {
  79                 SDL_SetError("Passed a NULL mutex");
  80                 return -1;
  81         }
  82         if ( WaitForSingleObject(mutex->id, INFINITE) == WAIT_FAILED ) {
  83                 SDL_SetError("Couldn't wait on mutex");
  84                 return -1;
  85         }
  86         return(0);
  87 }
  88 
  89 /* Unlock the mutex */
  90 int SDL_mutexV(SDL_mutex *mutex)
     /* [<][>][^][v][top][bottom][index][help] */
  91 {
  92         if ( mutex == NULL ) {
  93                 SDL_SetError("Passed a NULL mutex");
  94                 return -1;
  95         }
  96         if ( ReleaseMutex(mutex->id) == FALSE ) {
  97                 SDL_SetError("Couldn't release mutex");
  98                 return -1;
  99         }
 100         return(0);
 101 }

/* [<][>][^][v][top][bottom][index][help] */