SDL_syssem.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:3k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     Sam Lantinga
  16.     slouken@libsdl.org
  17. */
  18. #ifdef SAVE_RCSID
  19. static char rcsid =
  20.  "@(#) $Id: SDL_syssem.c,v 1.4 2002/04/22 21:38:02 wmay Exp $";
  21. #endif
  22. /* Semaphores in the BeOS environment */
  23. #include <be/kernel/OS.h>
  24. #include "SDL_error.h"
  25. #include "SDL_thread.h"
  26. struct SDL_semaphore {
  27. sem_id id;
  28. };
  29. /* Create a counting semaphore */
  30. SDL_sem *SDL_CreateSemaphore(Uint32 initial_value)
  31. {
  32. SDL_sem *sem;
  33. sem = (SDL_sem *)malloc(sizeof(*sem));
  34. if ( sem ) {
  35. sem->id = create_sem(initial_value, "SDL semaphore");
  36. if ( sem->id < B_NO_ERROR ) {
  37. SDL_SetError("create_sem() failed");
  38. free(sem);
  39. sem = NULL;
  40. }
  41. } else {
  42. SDL_OutOfMemory();
  43. }
  44. return(sem);
  45. }
  46. /* Free the semaphore */
  47. void SDL_DestroySemaphore(SDL_sem *sem)
  48. {
  49. if ( sem ) {
  50. if ( sem->id >= B_NO_ERROR ) {
  51. delete_sem(sem->id);
  52. }
  53. free(sem);
  54. }
  55. }
  56. int SDL_SemWaitTimeout(SDL_sem *sem, Uint32 timeout)
  57. {
  58. int32 val;
  59. int retval;
  60. if ( ! sem ) {
  61. SDL_SetError("Passed a NULL semaphore");
  62. return -1;
  63. }
  64.   tryagain:
  65. if ( timeout == SDL_MUTEX_MAXWAIT ) {
  66. val = acquire_sem(sem->id);
  67. } else {
  68. timeout *= 1000; /* BeOS uses a timeout in microseconds */
  69. val = acquire_sem_etc(sem->id, 1, B_RELATIVE_TIMEOUT, timeout);
  70. }
  71. switch (val) {
  72.     case B_INTERRUPTED:
  73. goto tryagain;
  74.     case B_NO_ERROR:
  75. retval = 0;
  76. break;
  77.     default:
  78. SDL_SetError("acquire_sem() failed");
  79. retval = -1;
  80. break;
  81. }
  82. return retval;
  83. }
  84. int SDL_SemTryWait(SDL_sem *sem)
  85. {
  86. return SDL_SemWaitTimeout(sem, 0);
  87. }
  88. int SDL_SemWait(SDL_sem *sem)
  89. {
  90. return SDL_SemWaitTimeout(sem, SDL_MUTEX_MAXWAIT);
  91. }
  92. /* Returns the current count of the semaphore */
  93. Uint32 SDL_SemValue(SDL_sem *sem)
  94. {
  95. int32 count;
  96. Uint32 value;
  97. value = 0;
  98. if ( sem ) {
  99. get_sem_count(sem->id, &count);
  100. if ( count > 0 ) {
  101. value = (Uint32)count;
  102. }
  103. }
  104. return value;
  105. }
  106. /* Atomically increases the semaphore's count (not blocking) */
  107. int SDL_SemPost(SDL_sem *sem)
  108. {
  109. if ( ! sem ) {
  110. SDL_SetError("Passed a NULL semaphore");
  111. return -1;
  112. }
  113. if ( release_sem(sem->id) != B_NO_ERROR ) {
  114. SDL_SetError("release_sem() failed");
  115. return -1;
  116. }
  117. return 0;
  118. }