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

流媒体/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:03 wmay Exp $";
  21. #endif
  22. /* Semaphore functions using the Win32 API */
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25. #include <windows.h>
  26. #include "SDL_error.h"
  27. #include "SDL_thread.h"
  28. #if defined(_WIN32_WCE) && (_WIN32_WCE < 300)
  29. #include "win_ce_semaphore.h"
  30. #endif
  31. struct SDL_semaphore {
  32. #if defined(_WIN32_WCE) && (_WIN32_WCE < 300)
  33. SYNCHHANDLE id;
  34. #else
  35. HANDLE id;
  36. #endif
  37. Uint32 volatile count;
  38. };
  39. /* Create a semaphore */
  40. SDL_sem *SDL_CreateSemaphore(Uint32 initial_value)
  41. {
  42. SDL_sem *sem;
  43. /* Allocate sem memory */
  44. sem = (SDL_sem *)malloc(sizeof(*sem));
  45. if ( sem ) {
  46. /* Create the semaphore, with max value 32K */
  47. #if defined(_WIN32_WCE) && (_WIN32_WCE < 300)
  48. sem->id = CreateSemaphoreCE(NULL, initial_value, 32*1024, NULL);
  49. #else
  50. sem->id = CreateSemaphore(NULL, initial_value, 32*1024, NULL);
  51. #endif
  52. sem->count = initial_value;
  53. if ( ! sem->id ) {
  54. SDL_SetError("Couldn't create semaphore");
  55. free(sem);
  56. sem = NULL;
  57. }
  58. } else {
  59. SDL_OutOfMemory();
  60. }
  61. return(sem);
  62. }
  63. /* Free the semaphore */
  64. void SDL_DestroySemaphore(SDL_sem *sem)
  65. {
  66. if ( sem ) {
  67. if ( sem->id ) {
  68. #if defined(_WIN32_WCE) && (_WIN32_WCE < 300)
  69. CloseSynchHandle(sem->id);
  70. #else
  71. CloseHandle(sem->id);
  72. #endif
  73. sem->id = 0;
  74. }
  75. free(sem);
  76. }
  77. }
  78. int SDL_SemWaitTimeout(SDL_sem *sem, Uint32 timeout)
  79. {
  80. int retval;
  81. DWORD dwMilliseconds;
  82. if ( ! sem ) {
  83. SDL_SetError("Passed a NULL sem");
  84. return -1;
  85. }
  86. if ( timeout == SDL_MUTEX_MAXWAIT ) {
  87. dwMilliseconds = INFINITE;
  88. } else {
  89. dwMilliseconds = (DWORD)timeout;
  90. }
  91. #if defined(_WIN32_WCE) && (_WIN32_WCE < 300)
  92. switch (WaitForSemaphoreCE(sem->id, dwMilliseconds)) {
  93. #else
  94. switch (WaitForSingleObject(sem->id, dwMilliseconds)) {
  95. #endif
  96.     case WAIT_OBJECT_0:
  97. --sem->count;
  98. retval = 0;
  99. break;
  100.     case WAIT_TIMEOUT:
  101. retval = SDL_MUTEX_TIMEDOUT;
  102. break;
  103.     default:
  104. SDL_SetError("WaitForSingleObject() failed");
  105. retval = -1;
  106. break;
  107. }
  108. return retval;
  109. }
  110. int SDL_SemTryWait(SDL_sem *sem)
  111. {
  112. return SDL_SemWaitTimeout(sem, 0);
  113. }
  114. int SDL_SemWait(SDL_sem *sem)
  115. {
  116. return SDL_SemWaitTimeout(sem, SDL_MUTEX_MAXWAIT);
  117. }
  118. /* Returns the current count of the semaphore */
  119. Uint32 SDL_SemValue(SDL_sem *sem)
  120. {
  121. if ( ! sem ) {
  122. SDL_SetError("Passed a NULL sem");
  123. return 0;
  124. }
  125. return sem->count;
  126. }
  127. int SDL_SemPost(SDL_sem *sem)
  128. {
  129. if ( ! sem ) {
  130. SDL_SetError("Passed a NULL sem");
  131. return -1;
  132. }
  133. /* Increase the counter in the first place, because
  134.  * after a successful release the semaphore may
  135.  * immediately get destroyed by another thread which
  136.  * is waiting for this semaphore.
  137.  */
  138. ++sem->count;
  139. #if defined(_WIN32_WCE) && (_WIN32_WCE < 300)
  140. if ( ReleaseSemaphoreCE(sem->id, 1, NULL) == FALSE ) {
  141. #else
  142. if ( ReleaseSemaphore(sem->id, 1, NULL) == FALSE ) {
  143. #endif
  144. --sem->count; /* restore */
  145. SDL_SetError("ReleaseSemaphore() failed");
  146. return -1;
  147. }
  148. return 0;
  149. }