hxcrt.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:10k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include <stdio.h>
  36. #include <string.h> // for memset
  37. #include "hxtypes.h"
  38. #ifndef _MAC_MACHO
  39. void* __nwa(size_t size, char* file, int line);
  40. //void* __nw(size_t size, char* file, int line);
  41. extern "C" void* __nwa__FUlPcl(size_t size, char*, int);
  42. //extern "C" void* __nw__FUlPcl(size_t size, char* file, int line);
  43. //extern "C" void* operator new(unsigned long, char*, long);
  44. #endif
  45. extern "C" short HXCRT_ASSERT(char* message);
  46. extern "C" {
  47. void* HXMM_NEWDEBUG(unsigned long size, char* file, unsigned long line);
  48. void* HXMM_NEW(unsigned long size);
  49. void HXMM_DELETE(void* ptr);
  50. void HXMM_INTERRUPTON(void);
  51. void HXMM_INTERRUPTOFF(void);
  52. BOOL HXMM_ATINTERRUPT(void);
  53. void HXMM_COMPACT(void);
  54. #ifndef _MAC_MACHO
  55. void* malloc(size_t size);
  56. void* calloc(size_t nmemb, size_t size);
  57. void* realloc(void* ptr, size_t size);
  58. void free(void* ptr);
  59. char *__ttyname(long);
  60. #endif
  61. }
  62. extern "C" short InstallConsole(short);
  63. extern "C" void RemoveConsole(void);
  64. extern "C" long WriteCharsToConsole(char*, long);
  65. extern "C" long ReadCharsFromConsole(char*, long);
  66. #ifndef _MAC_MACHO
  67. void* operator new(unsigned long size, char*, long);
  68. void* operator new(unsigned long size, char*, long)
  69. {
  70. return operator new(size);
  71. }
  72. //void* operator new[](size_t size, char* file, int line)
  73. void* __nwa(size_t size, char* file, int line)
  74. {
  75. void* retval = HXMM_NEWDEBUG(size, file, line);
  76. return retval;
  77. }
  78. void* __nw(size_t size, char* file, int line);
  79. void* __nw(size_t size, char* file, int line)
  80. {
  81. void* retval = HXMM_NEWDEBUG(size, file, line);
  82. return retval;
  83. }
  84. void* __nwa(size_t size)
  85. {
  86. void* retval = HXMM_NEW(size);
  87. return retval;
  88. }
  89. void* __nw(size_t size)
  90. {
  91. void* retval = HXMM_NEW(size);
  92. return retval;
  93. }
  94. void __dl(void* ptr)
  95. {
  96. HXMM_DELETE(ptr);
  97. }
  98. void __dla(void* ptr)
  99. {
  100. HXMM_DELETE(ptr);
  101. }
  102. void* __nwa__FUlPcl(size_t size, char*, int)
  103. {
  104. void* retval = HXMM_NEW(size);
  105. return retval;
  106. }
  107. #endif
  108. #pragma mark -
  109. CFBundleRef systemBundle = NULL;
  110. typedef void* (*MallocProcPtr) (size_t size);
  111. typedef void* (*ReallocProcPtr) (void* oldPtr, size_t size);
  112. typedef void* (*CallocProcPtr) (size_t nmemb, size_t size);
  113. typedef void* (*FreeProcPtr) (void* ptr);
  114. MallocProcPtr fpMalloc = NULL;
  115. ReallocProcPtr fpRealloc = NULL;
  116. CallocProcPtr fpCalloc = NULL;
  117. FreeProcPtr fpFree = NULL;
  118. static void LoadBundleIfNecessary()
  119. {
  120. if (!systemBundle)
  121. {
  122. systemBundle = CFBundleGetBundleWithIdentifier(CFSTR("com.apple.Carbon"));
  123. fpMalloc = (MallocProcPtr) CFBundleGetFunctionPointerForName(systemBundle, CFSTR("malloc"));
  124. fpRealloc = (ReallocProcPtr) CFBundleGetFunctionPointerForName(systemBundle, CFSTR("realloc"));
  125. fpCalloc = (CallocProcPtr) CFBundleGetFunctionPointerForName(systemBundle, CFSTR("calloc"));
  126. fpFree = (FreeProcPtr) CFBundleGetFunctionPointerForName(systemBundle, CFSTR("free"));
  127. }
  128. }
  129. #pragma mark -
  130. #define USE_NEW_POINTER_FOR_MALLOC 1
  131. #ifndef _MAC_MACHO
  132. void* malloc(size_t size)
  133. {
  134. LoadBundleIfNecessary();
  135. if (fpMalloc)
  136. {
  137. return fpMalloc(size);
  138. }
  139. HXCRT_ASSERT("malloc function pointer not found");
  140. return NULL;
  141. }
  142. void* calloc(size_t nmemb, size_t size)
  143. {
  144. if (fpCalloc)
  145. {
  146. return fpCalloc(nmemb, size);
  147. }
  148. HXCRT_ASSERT("calloc function pointer not found");
  149. return NULL;
  150. }
  151. void* realloc(void* ptr, size_t size)
  152. {
  153. if (fpRealloc)
  154. {
  155. return fpRealloc(ptr, size);
  156. }
  157. HXCRT_ASSERT("realloc function pointer not found");
  158. return NULL;
  159. }
  160. void free(void* ptr)
  161. {
  162. if (fpFree)
  163. {
  164. fpFree(ptr);
  165. return;
  166. }
  167. HXCRT_ASSERT("free function pointer not found");
  168. return;
  169. }
  170. #endif
  171. #pragma mark -
  172. short HXCRT_ASSERT(char* message)
  173. {
  174. printf("ASSERTION: %sn", message);
  175. return 0;
  176. }
  177. // Console stubs so stio.h stuff works
  178. #ifndef _MAC_MACHO
  179. short InstallConsole(short fd)
  180. {
  181. #pragma unused (fd)
  182. return 0;
  183. }
  184. /*
  185.  * extern void RemoveConsole(void);
  186.  *
  187.  * Removes the console package.  It is called after all other streams
  188.  * are closed and exit functions (installed by either atexit or _atexit)
  189.  * have been called.  Since there is no way to recover from an error,
  190.  * this function doesn't need to return any.
  191.  */
  192. void RemoveConsole(void)
  193. {
  194. }
  195. /*
  196.  * extern long WriteCharsToConsole(char *buffer, long n);
  197.  *
  198.  * Writes a stream of output to the Console window.  This function is
  199.  * called by write.
  200.  *
  201.  * char *buffer: Pointer to the buffer to be written.
  202.  * long n: The length of the buffer to be written.
  203.  * returns short: Actual number of characters written to the stream,
  204.  * -1 if an error occurred.
  205.  */
  206. long WriteCharsToConsole(char *buffer, long n)
  207. {
  208.     while (n > 0)
  209.     {
  210.     
  211.      // try to break the string on carriage returns
  212.      // (some consoles honor the r causing lines overwriting themselves)
  213. int lineLen = n;
  214. bool skipReturn = false;
  215.      for(int i=0;i<n;i++)
  216.      {
  217.      if (buffer[i] == 'r')
  218.      {
  219.      // found a CR -- print up to this point only 
  220.      lineLen = i;
  221.      skipReturn = true; // otherwise some consoles will print two CR's for a line
  222.      break;
  223.      }
  224.      }
  225.     
  226.      // and for sure break the line into blocks <= 200 bytes.
  227. Str255 a;
  228. long len = lineLen;
  229. if (len > 200) len = 200;
  230. a[0] = len;
  231. BlockMoveData(buffer, &a[1], len);
  232. DebugStr(a);
  233. if (skipReturn)
  234. len++;
  235. n -= len;
  236. buffer += len;
  237.     }
  238. return 0;
  239. }
  240. /*
  241.  * extern long ReadCharsFromConsole(char *buffer, long n);
  242.  *
  243.  * Reads from the Console into a buffer.  This function is called by
  244.  * read.
  245.  *
  246.  * char *buffer: Pointer to the buffer which will recieve the input.
  247.  * long n: The maximum amount of characters to be read (size of
  248.  * buffer).
  249.  * returns short: Actual number of characters read from the stream,
  250.  * -1 if an error occurred.
  251.  */
  252. long ReadCharsFromConsole(char *buffer, long n)
  253. {
  254. #pragma unused (buffer, n)
  255. return 0;
  256. }
  257. char *__ttyname(long)
  258. {
  259. return (NULL);
  260. }
  261. #endif
  262. void* HXMM_NEW(unsigned long size)
  263. {
  264. LoadBundleIfNecessary();
  265. if (fpMalloc)
  266. {
  267. return fpMalloc(size);
  268. }
  269. HXCRT_ASSERT("HXMM_NEW: malloc function pointer not found");
  270. return NULL;
  271. }
  272. void* HXMM_NEWDEBUG(unsigned long size, char* file, unsigned long line)
  273. {
  274.         return HXMM_NEW(size);
  275. }
  276. void HXMM_DELETE(void* ptr)
  277. {
  278. if (fpFree)
  279. {
  280. fpFree(ptr);
  281. return;
  282. }
  283. HXCRT_ASSERT("HXMM_DELETE: free function pointer not found");
  284. }
  285. #define kMaxInterruptEquivalentTaskIDs 20
  286. MPTaskID gInterruptEquivalentTaskIDs[kMaxInterruptEquivalentTaskIDs];
  287. long gCurrentInterruptEquivalentTaskID = 0;
  288. void HXMM_INTERRUPTON(void)
  289. {
  290. long whichTask;
  291. MPTaskID curID = MPCurrentTaskID();
  292. bool needToAdd = true;
  293. for ( whichTask = 0; whichTask < gCurrentInterruptEquivalentTaskID; whichTask++ )
  294. {
  295. if ( !gInterruptEquivalentTaskIDs[whichTask] )
  296. {
  297. needToAdd = false;
  298. gInterruptEquivalentTaskIDs[whichTask] = curID;
  299. break;
  300. }
  301. else if ( gInterruptEquivalentTaskIDs[whichTask] == curID )
  302. {
  303. needToAdd = false;
  304. }
  305. }
  306. if (needToAdd)
  307. {
  308. // HX_ASSERT(gCurrentInterruptEquivalentTaskID < kMaxInterruptEquivalentTaskIDs);
  309. if (gCurrentInterruptEquivalentTaskID < kMaxInterruptEquivalentTaskIDs)
  310. {
  311. gInterruptEquivalentTaskIDs[gCurrentInterruptEquivalentTaskID] = curID;
  312. gCurrentInterruptEquivalentTaskID++;
  313. }
  314. }
  315. }
  316. void HXMM_INTERRUPTOFF(void)
  317. {
  318. long whichTask;
  319. MPTaskID curID = MPCurrentTaskID();
  320. bool needToAdd = true;
  321. for ( whichTask = 0; whichTask < gCurrentInterruptEquivalentTaskID; whichTask++ )
  322. {
  323. if ( gInterruptEquivalentTaskIDs[whichTask] == curID )
  324. {
  325. // xxxbobclark if we knew for sure that HXMM_INTERRUPTON()
  326. // would only be called at actual interrupt time (and not
  327. // occasionally at system time) then we wouldn't need to do
  328. // this. But since it's sometimes incorrectly called at system
  329. // time, we don't want to hold an array that thinks that
  330. // system time is interrupt time. Also since the embedded
  331. // player has "system time" on different threads we can't
  332. // just watch for the bad case of HXMM_INTERRUPTON() at
  333. // system time...
  334. gInterruptEquivalentTaskIDs[whichTask] = 0; // so it doesn't match later
  335. }
  336. }
  337. }
  338. BOOL HXMM_ATINTERRUPT(void)
  339. {
  340. long whichTask;
  341. MPTaskID curID = MPCurrentTaskID();
  342. for ( whichTask = 0; whichTask < gCurrentInterruptEquivalentTaskID; whichTask++ )
  343. {
  344. if ( gInterruptEquivalentTaskIDs[whichTask] == curID )
  345. {
  346. return TRUE;
  347. }
  348. }
  349. return FALSE;
  350. }
  351. void HXMM_COMPACT(void)
  352. {
  353. // do nothing
  354. }