src/thread/beos/SDL_syssem.c

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

FUNCTIONS

This source file includes following functions.
  1. SDL_CreateSemaphore
  2. SDL_DestroySemaphore
  3. SDL_SemWaitTimeout
  4. SDL_SemTryWait
  5. SDL_SemWait
  6. SDL_SemValue
  7. SDL_SemPost

   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_syssem.c,v 1.1.2.3 2001/02/10 07:20:04 hercules Exp $";
  26 #endif
  27 
  28 /* Semaphores in the BeOS environment */
  29 
  30 #include <be/kernel/OS.h>
  31 
  32 #include "SDL_error.h"
  33 #include "SDL_thread.h"
  34 
  35 
  36 struct SDL_semaphore {
  37         sem_id id;
  38 };
  39 
  40 /* Create a counting semaphore */
  41 SDL_sem *SDL_CreateSemaphore(Uint32 initial_value)
     /* [<][>][^][v][top][bottom][index][help] */
  42 {
  43         SDL_sem *sem;
  44 
  45         sem = (SDL_sem *)malloc(sizeof(*sem));
  46         if ( sem ) {
  47                 sem->id = create_sem(initial_value, "SDL semaphore");
  48                 if ( sem->id < B_NO_ERROR ) {
  49                         SDL_SetError("create_sem() failed");
  50                         free(sem);
  51                         sem = NULL;
  52                 }
  53         } else {
  54                 SDL_OutOfMemory();
  55         }
  56         return(sem);
  57 }
  58 
  59 /* Free the semaphore */
  60 void SDL_DestroySemaphore(SDL_sem *sem)
     /* [<][>][^][v][top][bottom][index][help] */
  61 {
  62         if ( sem ) {
  63                 if ( sem->id >= B_NO_ERROR ) {
  64                         delete_sem(sem->id);
  65                 }
  66                 free(sem);
  67         }
  68 }
  69 
  70 int SDL_SemWaitTimeout(SDL_sem *sem, Uint32 timeout)
     /* [<][>][^][v][top][bottom][index][help] */
  71 {
  72         int32 val;
  73         int retval;
  74 
  75         if ( ! sem ) {
  76                 SDL_SetError("Passed a NULL semaphore");
  77                 return -1;
  78         }
  79 
  80   tryagain:
  81         if ( timeout == SDL_MUTEX_MAXWAIT ) {
  82                 val = acquire_sem(sem->id);
  83         } else {
  84                 timeout *= 1000; /* BeOS uses a timeout in microseconds */
  85                 val = acquire_sem_etc(sem->id, 1, B_RELATIVE_TIMEOUT, timeout);
  86         }
  87         switch (val) {
  88             case B_INTERRUPTED:
  89                 goto tryagain;
  90             case B_NO_ERROR:
  91                 retval = 0;
  92                 break;
  93             default:
  94                 SDL_SetError("acquire_sem() failed");
  95                 retval = -1;
  96                 break;
  97         }
  98 
  99         return retval;
 100 }
 101 
 102 int SDL_SemTryWait(SDL_sem *sem)
     /* [<][>][^][v][top][bottom][index][help] */
 103 {
 104         return SDL_SemWaitTimeout(sem, 0);
 105 }
 106 
 107 int SDL_SemWait(SDL_sem *sem)
     /* [<][>][^][v][top][bottom][index][help] */
 108 {
 109         return SDL_SemWaitTimeout(sem, SDL_MUTEX_MAXWAIT);
 110 }
 111 
 112 /* Returns the current count of the semaphore */
 113 Uint32 SDL_SemValue(SDL_sem *sem)
     /* [<][>][^][v][top][bottom][index][help] */
 114 {
 115         int32 count;
 116         Uint32 value;
 117 
 118         value = 0;
 119         if ( sem ) {
 120                 get_sem_count(sem->id, &count);
 121                 if ( count > 0 ) {
 122                         value = (Uint32)count;
 123                 }
 124         }
 125         return value;
 126 }
 127 
 128 /* Atomically increases the semaphore's count (not blocking) */
 129 int SDL_SemPost(SDL_sem *sem)
     /* [<][>][^][v][top][bottom][index][help] */
 130 {
 131         if ( ! sem ) {
 132                 SDL_SetError("Passed a NULL semaphore");
 133                 return -1;
 134         }
 135 
 136         if ( release_sem(sem->id) != B_NO_ERROR ) {
 137                 SDL_SetError("release_sem() failed");
 138                 return -1;
 139         }
 140         return 0;
 141 }

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