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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000  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. /*
  19.     SDL_sysmutex.cpp
  20.     Epoc version by Markus Mertama (w@iki.fi)
  21. */
  22. #ifdef SAVE_RCSID
  23. static char rcsid =
  24.  "@(#) $Id: SDL_sysmutex.cpp,v 1.2 2002/04/22 21:38:02 wmay Exp $";
  25. #endif
  26. /* Mutex functions using the Win32 API */
  27. //#include <stdio.h>
  28. //#include <stdlib.h>
  29. #include<e32std.h>
  30. #include "SDL_error.h"
  31. #include "SDL_mutex.h"
  32. struct SDL_mutex
  33.     {
  34.     TInt handle;
  35.     };
  36. extern TInt CreateUnique(TInt (*aFunc)(const TDesC& aName, TAny*, TAny*), TAny*, TAny*);
  37. TInt NewMutex(const TDesC& aName, TAny* aPtr1, TAny*)
  38.     {
  39.     return ((RMutex*)aPtr1)->CreateGlobal(aName);
  40.     }
  41. /* Create a mutex */
  42. SDL_mutex *SDL_CreateMutex(void)
  43. {
  44.     RMutex rmutex;
  45.     TInt status = CreateUnique(NewMutex, &rmutex, NULL);
  46. if(status != KErrNone)
  47.     {
  48. SDL_SetError("Couldn't create mutex");
  49. }
  50.     SDL_mutex* mutex = new /*(ELeave)*/ SDL_mutex;
  51.     mutex->handle = rmutex.Handle();
  52. return(mutex);
  53. }
  54. /* Free the mutex */
  55. void SDL_DestroyMutex(SDL_mutex *mutex)
  56. {
  57. if ( mutex ) 
  58. {
  59.     RMutex rmutex;
  60.     rmutex.SetHandle(mutex->handle);
  61. rmutex.Signal();
  62. rmutex.Close();
  63. delete(mutex);
  64.     mutex = NULL;
  65. }
  66. }
  67. /* Lock the mutex */
  68. int SDL_mutexP(SDL_mutex *mutex)
  69. {
  70. if ( mutex == NULL ) {
  71. SDL_SetError("Passed a NULL mutex");
  72. return -1;
  73. }
  74.     RMutex rmutex;
  75.     rmutex.SetHandle(mutex->handle);
  76. rmutex.Wait(); 
  77. return(0);
  78. }
  79. /* Unlock the mutex */
  80. int SDL_mutexV(SDL_mutex *mutex)
  81. {
  82. if ( mutex == NULL ) {
  83. SDL_SetError("Passed a NULL mutex");
  84. return -1;
  85. }
  86. RMutex rmutex;
  87.     rmutex.SetHandle(mutex->handle);
  88. rmutex.Signal();
  89. return(0);
  90. }