src/thread/riscos/SDL_syssem.c
author Sam Lantinga <slouken@libsdl.org>
Mon, 29 May 2006 04:04:35 +0000
branchSDL-1.3
changeset 1668 4da1ee79c9af
parent 1662 782fd950bd46
permissions -rw-r--r--
more tweaking indent options
     1 /*
     2     SDL - Simple DirectMedia Layer
     3     Copyright (C) 1997-2006 Sam Lantinga
     4 
     5     This library is free software; you can redistribute it and/or
     6     modify it under the terms of the GNU Lesser General Public
     7     License as published by the Free Software Foundation; either
     8     version 2.1 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     Lesser General Public License for more details.
    14 
    15     You should have received a copy of the GNU Lesser General Public
    16     License along with this library; if not, write to the Free Software
    17     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    18 
    19     Sam Lantinga
    20     slouken@libsdl.org
    21 */
    22 #include "SDL_config.h"
    23 
    24 /* RISC OS semiphores based on linux code */
    25 
    26 
    27 #include "SDL_timer.h"
    28 #include "SDL_thread.h"
    29 #include "SDL_systhread_c.h"
    30 
    31 #if !SDL_THREADS_DISABLED
    32 
    33 SDL_sem *
    34 SDL_CreateSemaphore(Uint32 initial_value)
    35 {
    36     SDL_SetError("SDL not configured with thread support");
    37     return (SDL_sem *) 0;
    38 }
    39 
    40 void
    41 SDL_DestroySemaphore(SDL_sem * sem)
    42 {
    43     return;
    44 }
    45 
    46 int
    47 SDL_SemTryWait(SDL_sem * sem)
    48 {
    49     SDL_SetError("SDL not configured with thread support");
    50     return -1;
    51 }
    52 
    53 int
    54 SDL_SemWaitTimeout(SDL_sem * sem, Uint32 timeout)
    55 {
    56     SDL_SetError("SDL not configured with thread support");
    57     return -1;
    58 }
    59 
    60 int
    61 SDL_SemWait(SDL_sem * sem)
    62 {
    63     SDL_SetError("SDL not configured with thread support");
    64     return -1;
    65 }
    66 
    67 Uint32
    68 SDL_SemValue(SDL_sem * sem)
    69 {
    70     return 0;
    71 }
    72 
    73 int
    74 SDL_SemPost(SDL_sem * sem)
    75 {
    76     SDL_SetError("SDL not configured with thread support");
    77     return -1;
    78 }
    79 
    80 #else
    81 
    82 
    83 #include <unistd.h>             /* For getpid() */
    84 #include <pthread.h>
    85 #include <semaphore.h>
    86 
    87 struct SDL_semaphore
    88 {
    89     sem_t *sem;
    90     sem_t sem_data;
    91 };
    92 
    93 /* Create a semaphore, initialized with value */
    94 SDL_sem *
    95 SDL_CreateSemaphore(Uint32 initial_value)
    96 {
    97     SDL_sem *sem = (SDL_sem *) SDL_malloc(sizeof(SDL_sem));
    98     if (sem) {
    99         if (sem_init(&sem->sem_data, 0, initial_value) < 0) {
   100             SDL_SetError("sem_init() failed");
   101             SDL_free(sem);
   102             sem = NULL;
   103         } else {
   104             sem->sem = &sem->sem_data;
   105         }
   106     } else {
   107         SDL_OutOfMemory();
   108     }
   109     return sem;
   110 }
   111 
   112 void
   113 SDL_DestroySemaphore(SDL_sem * sem)
   114 {
   115     if (sem) {
   116         sem_destroy(sem->sem);
   117         SDL_free(sem);
   118     }
   119 }
   120 
   121 int
   122 SDL_SemTryWait(SDL_sem * sem)
   123 {
   124     int retval;
   125 
   126     if (!sem) {
   127         SDL_SetError("Passed a NULL semaphore");
   128         return -1;
   129     }
   130     retval = SDL_MUTEX_TIMEDOUT;
   131     if (sem_trywait(sem->sem) == 0) {
   132         retval = 0;
   133     }
   134     return retval;
   135 }
   136 
   137 int
   138 SDL_SemWait(SDL_sem * sem)
   139 {
   140     int retval;
   141 
   142     if (!sem) {
   143         SDL_SetError("Passed a NULL semaphore");
   144         return -1;
   145     }
   146 
   147     retval = sem_wait(sem->sem);
   148     if (retval < 0) {
   149         SDL_SetError("sem_wait() failed");
   150     }
   151     return retval;
   152 }
   153 
   154 int
   155 SDL_SemWaitTimeout(SDL_sem * sem, Uint32 timeout)
   156 {
   157     int retval;
   158 
   159     if (!sem) {
   160         SDL_SetError("Passed a NULL semaphore");
   161         return -1;
   162     }
   163 
   164     /* Try the easy cases first */
   165     if (timeout == 0) {
   166         return SDL_SemTryWait(sem);
   167     }
   168     if (timeout == SDL_MUTEX_MAXWAIT) {
   169         return SDL_SemWait(sem);
   170     }
   171 
   172     /* Ack!  We have to busy wait... */
   173     timeout += SDL_GetTicks();
   174     do {
   175         retval = SDL_SemTryWait(sem);
   176         if (retval == 0) {
   177             break;
   178         }
   179         SDL_Delay(1);
   180     }
   181     while (SDL_GetTicks() < timeout);
   182 
   183     return retval;
   184 }
   185 
   186 Uint32
   187 SDL_SemValue(SDL_sem * sem)
   188 {
   189     int ret = 0;
   190     if (sem) {
   191         sem_getvalue(sem->sem, &ret);
   192         if (ret < 0) {
   193             ret = 0;
   194         }
   195     }
   196     return (Uint32) ret;
   197 }
   198 
   199 int
   200 SDL_SemPost(SDL_sem * sem)
   201 {
   202     int retval;
   203 
   204     if (!sem) {
   205         SDL_SetError("Passed a NULL semaphore");
   206         return -1;
   207     }
   208 
   209     retval = sem_post(sem->sem);
   210     if (retval < 0) {
   211         SDL_SetError("sem_post() failed");
   212     }
   213     return retval;
   214 }
   215 
   216 #endif /* !SDL_THREADS_DISABLED */
   217 /* vi: set ts=4 sw=4 expandtab: */