SDL_systhread.cpp
上传用户: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. /*
  19.     SDL_systhread.cpp
  20.     Epoc thread management routines for SDL
  21.     Epoc version by Markus Mertama  (w@iki.fi)
  22. */
  23. //#include <stdlib.h>
  24. //#include <stdio.h>
  25. extern "C" {
  26. #undef NULL
  27. #include "SDL_error.h"
  28. #include "SDL_thread.h"
  29. #include "SDL_systhread.h"
  30.     };
  31. #include <e32std.h>
  32. static int object_count;
  33. int RunThread(TAny* data)
  34. {
  35. SDL_RunThread(data);
  36. return(0);
  37. }
  38. TInt NewThread(const TDesC& aName, TAny* aPtr1, TAny* aPtr2)
  39.     {
  40.     return ((RThread*)(aPtr1))->Create(aName,
  41.             RunThread,
  42.             KDefaultStackSize,
  43.             NULL,
  44.             aPtr2);
  45.     }
  46. int CreateUnique(TInt (*aFunc)(const TDesC& aName, TAny*, TAny*), TAny* aPtr1, TAny* aPtr2)
  47.     {
  48.     TBuf<16> name;
  49.     TInt status = KErrNone;
  50.     do
  51.         {
  52.         object_count++;
  53.         name.Format(_L("SDL_%x"), object_count);
  54.         status = aFunc(name, aPtr1, aPtr2);
  55.         }
  56.         while(status == KErrAlreadyExists);
  57.     return status;
  58.     }
  59. int SDL_SYS_CreateThread(SDL_Thread *thread, void *args)
  60. {
  61.     RThread rthread;
  62.    
  63.     TInt status = CreateUnique(NewThread, &rthread, args);
  64.     if (status != KErrNone) 
  65.     {
  66.         delete(((RThread*)(thread->handle)));
  67.         thread->handle = NULL;
  68. SDL_SetError("Not enough resources to create thread");
  69. return(-1);
  70. }
  71. rthread.Resume();
  72.     thread->handle = rthread.Handle();
  73. return(0);
  74. }
  75. void SDL_SYS_SetupThread(void)
  76. {
  77. return;
  78. }
  79. Uint32 SDL_ThreadID(void)
  80. {
  81.     RThread current;
  82.     TThreadId id = current.Id();
  83. return id;
  84. }
  85. void SDL_SYS_WaitThread(SDL_Thread *thread)
  86. {
  87.     RUndertaker taker;
  88.     taker.Create();
  89.     TRequestStatus status;
  90.     taker.Logon(status, thread->handle);
  91.     User::WaitForRequest(status);
  92.     taker.Close();
  93. }
  94. /* WARNING: This function is really a last resort.
  95.  * Threads should be signaled and then exit by themselves.
  96.  * TerminateThread() doesn't perform stack and DLL cleanup.
  97.  */
  98. void SDL_SYS_KillThread(SDL_Thread *thread)
  99. {
  100.     RThread rthread;
  101.     rthread.SetHandle(thread->handle);
  102. rthread.Kill(0);
  103. rthread.Close();
  104. }