SDL_systhread.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_systhread.c,v 1.4 2002/04/22 21:38:02 wmay Exp $";
  21. #endif
  22. /* BeOS thread management routines for SDL */
  23. #include "SDL_error.h"
  24. #include "SDL_mutex.h"
  25. #include "SDL_thread.h"
  26. #include "SDL_thread_c.h"
  27. #include "SDL_systhread.h"
  28. #include "mydebug.h"
  29. typedef struct {
  30. int (*func)(void *);
  31. void *data;
  32. SDL_Thread *info;
  33. struct Task *wait;
  34. } thread_args;
  35. #ifndef MORPHOS
  36. #if defined(__SASC) && !defined(__PPC__) 
  37. __saveds __asm Uint32 RunThread(register __a0 char *args )
  38. #elif defined(__PPC__)
  39. Uint32 RunThread(char *args)
  40. #else
  41. Uint32 __saveds RunThread(char *args __asm("a0") )
  42. #endif
  43. {
  44. #ifdef STORMC4_WOS
  45. thread_args *data=(thread_args *)args;
  46. #else
  47. thread_args *data=(thread_args *)atol(args);
  48. #endif
  49. struct Task *Father;
  50. D(bug("Received data: %lxn",data));
  51. Father=data->wait;
  52. SDL_RunThread(data);
  53. Signal(Father,SIGBREAKF_CTRL_F);
  54. D(bug("Thread with data %lx endedn",data));
  55. return(0);
  56. }
  57. #else
  58. #include <emul/emulinterface.h>
  59. Uint32 RunTheThread(void)
  60. {
  61. thread_args *data=(thread_args *)atol((char *)REG_A0);
  62. struct Task *Father;
  63. D(bug("Received data: %lxn",data));
  64. Father=data->wait;
  65. SDL_RunThread(data);
  66. Signal(Father,SIGBREAKF_CTRL_F);
  67. D(bug("Thread with data %lx endedn",data));
  68. return(0);
  69. }
  70. struct EmulLibEntry RunThreadStruct=
  71. {
  72. TRAP_LIB,
  73. 0,
  74. (ULONG)RunTheThread
  75. };
  76. void *RunThread=&RunThreadStruct;
  77. #endif
  78. int SDL_SYS_CreateThread(SDL_Thread *thread, void *args)
  79. {
  80. /* Create the thread and go! */
  81. char buffer[20];
  82. D(bug("Sending %lx to the new thread...n",args));
  83. if(args)
  84. sprintf(buffer,"%ld",args);
  85. #ifdef STORMC4_WOS
  86. thread->handle=CreateTaskPPCTags(TASKATTR_CODE, RunThread,
  87. TASKATTR_NAME, "SDL subtask",
  88. TASKATTR_STACKSIZE, 100000,
  89. (args ? TASKATTR_R3 : TAG_IGNORE), args,
  90. TASKATTR_INHERITR2, TRUE,
  91. TAG_DONE);
  92. #else
  93. thread->handle=(struct Task *)CreateNewProcTags(NP_Output,Output(),
  94. NP_Name,(ULONG)"SDL subtask",
  95. NP_CloseOutput, FALSE,
  96. NP_StackSize,20000,
  97. NP_Entry,(ULONG)RunThread,
  98. args ? NP_Arguments : TAG_IGNORE,(ULONG)buffer,
  99. TAG_DONE);
  100. #endif
  101. if(!thread->handle)
  102. {
  103. SDL_SetError("Not enough resources to create thread");
  104. return(-1);
  105. }
  106. return(0);
  107. }
  108. void SDL_SYS_SetupThread(void)
  109. {
  110. }
  111. Uint32 SDL_ThreadID(void)
  112. {
  113. return((Uint32)FindTask(NULL));
  114. }
  115. void SDL_SYS_WaitThread(SDL_Thread *thread)
  116. {
  117. SetSignal(0L,SIGBREAKF_CTRL_F|SIGBREAKF_CTRL_C);
  118. Wait(SIGBREAKF_CTRL_F|SIGBREAKF_CTRL_C);
  119. }
  120. void SDL_SYS_KillThread(SDL_Thread *thread)
  121. {
  122. Signal((struct Task *)thread->handle,SIGBREAKF_CTRL_C);
  123. }