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:02 wmay Exp $";
  21. #endif
  22. /* An implementation of semaphores using mutexes and condition variables */
  23. #include "SDL_error.h"
  24. #include "SDL_thread.h"
  25. #include "SDL_systhread_c.h"
  26. struct SDL_semaphore
  27. {
  28. struct SignalSemaphore Sem;
  29. Uint32 count;
  30. Uint32 waiters_count;
  31. SDL_mutex *count_lock;
  32. SDL_cond *count_nonzero;
  33. };
  34. #undef D
  35. #define D(x)
  36. SDL_sem *SDL_CreateSemaphore(Uint32 initial_value)
  37. {
  38. SDL_sem *sem;
  39. sem = (SDL_sem *)malloc(sizeof(*sem));
  40. if ( ! sem ) {
  41. SDL_OutOfMemory();
  42. return(0);
  43. }
  44. D(bug("Creating semaphore %lx...n",sem));
  45. memset(sem,0,sizeof(*sem));
  46. InitSemaphore(&sem->Sem);
  47. return(sem);
  48. }
  49. void SDL_DestroySemaphore(SDL_sem *sem)
  50. {
  51. D(bug("Destroying semaphore %lx...n",sem));
  52. if ( sem ) {
  53. // Condizioni per liberare i task in attesa?
  54. free(sem);
  55. }
  56. }
  57. int SDL_SemTryWait(SDL_sem *sem)
  58. {
  59. if ( ! sem ) {
  60. SDL_SetError("Passed a NULL semaphore");
  61. return -1;
  62. }
  63. D(bug("TryWait semaphore...%lxn",sem));
  64. ObtainSemaphore(&sem->Sem);
  65. // ReleaseSemaphore(&sem->Sem);
  66. return 1;
  67. }
  68. int SDL_SemWaitTimeout(SDL_sem *sem, Uint32 timeout)
  69. {
  70. int retval;
  71. if ( ! sem ) {
  72. SDL_SetError("Passed a NULL semaphore");
  73. return -1;
  74. }
  75. D(bug("WaitTimeout (%ld) semaphore...%lxn",timeout,sem));
  76. /* A timeout of 0 is an easy case */
  77. if ( timeout == 0 ) {
  78. return SDL_SemTryWait(sem);
  79. }
  80. /*
  81. SDL_LockMutex(sem->count_lock);
  82. ++sem->waiters_count;
  83. retval = 0;
  84. while ( (sem->count == 0) && (retval != SDL_MUTEX_TIMEDOUT) ) {
  85. retval = SDL_CondWaitTimeout(sem->count_nonzero,
  86.                              sem->count_lock, timeout);
  87. }
  88. --sem->waiters_count;
  89. --sem->count;
  90. SDL_UnlockMutex(sem->count_lock);
  91. */
  92. if(!(retval=AttemptSemaphore(&sem->Sem)))
  93. {
  94. SDL_Delay(timeout);
  95. retval=AttemptSemaphore(&sem->Sem);
  96. }
  97. if(retval==TRUE)
  98. {
  99. // ReleaseSemaphore(&sem->Sem);
  100. retval=1;
  101. }
  102. return retval;
  103. }
  104. int SDL_SemWait(SDL_sem *sem)
  105. {
  106. ObtainSemaphore(&sem->Sem);
  107. return 0;
  108. // return SDL_SemWaitTimeout(sem, SDL_MUTEX_MAXWAIT);
  109. }
  110. Uint32 SDL_SemValue(SDL_sem *sem)
  111. {
  112. Uint32 value;
  113. value = 0;
  114. if ( sem ) {
  115. #ifdef STORMC4_WOS
  116. value = sem->Sem.ssppc_SS.ss_NestCount;
  117. #else
  118. value = sem->Sem.ss_NestCount;
  119. #endif
  120. // SDL_UnlockMutex(sem->count_lock);
  121. }
  122. return value;
  123. }
  124. int SDL_SemPost(SDL_sem *sem)
  125. {
  126. if ( ! sem ) {
  127. SDL_SetError("Passed a NULL semaphore");
  128. return -1;
  129. }
  130. D(bug("SemPost semaphore...%lxn",sem));
  131. ReleaseSemaphore(&sem->Sem);
  132. #if 0
  133. SDL_LockMutex(sem->count_lock);
  134. if ( sem->waiters_count > 0 ) {
  135. SDL_CondSignal(sem->count_nonzero);
  136. }
  137. ++sem->count;
  138. SDL_UnlockMutex(sem->count_lock);
  139. #endif
  140. return 0;
  141. }