eathread_callstack_null.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // Copyright (c) Electronic Arts Inc. All rights reserved.
  3. ///////////////////////////////////////////////////////////////////////////////
  4. #include <eathread/eathread_callstack.h>
  5. #include <eathread/eathread_callstack_context.h>
  6. #include <eathread/eathread_storage.h>
  7. #include <string.h>
  8. EA_DISABLE_VC_WARNING(4172) // returning address of local variable or temporary
  9. namespace EA
  10. {
  11. namespace Thread
  12. {
  13. EATHREADLIB_API void InitCallstack()
  14. {
  15. }
  16. EATHREADLIB_API void ShutdownCallstack()
  17. {
  18. }
  19. EATHREADLIB_API size_t GetCallstack(void* /*callstack*/[], size_t /*maxDepth*/, const CallstackContext* /*pContext*/)
  20. {
  21. return 0;
  22. }
  23. EATHREADLIB_API bool GetCallstackContext(CallstackContext& /*context*/, intptr_t /*threadId*/)
  24. {
  25. return false;
  26. }
  27. EATHREADLIB_API bool GetCallstackContextSysThreadId(CallstackContext& /*context*/, intptr_t /*sysThreadId*/)
  28. {
  29. return false;
  30. }
  31. EATHREADLIB_API void GetCallstackContext(CallstackContext& context, const Context* /*pContext*/)
  32. {
  33. memset(&context, 0, sizeof(context));
  34. }
  35. EATHREADLIB_API size_t GetModuleFromAddress(const void* /*pAddress*/, char* /*pModuleFileName*/, size_t /*moduleNameCapacity*/)
  36. {
  37. return 0;
  38. }
  39. EATHREADLIB_API ModuleHandle GetModuleHandleFromAddress(const void* /*pAddress*/)
  40. {
  41. return (ModuleHandle)0;
  42. }
  43. #if EA_THREADS_AVAILABLE
  44. static EA::Thread::ThreadLocalStorage sStackBase;
  45. #else
  46. static void* sStackBase;
  47. #endif
  48. ///////////////////////////////////////////////////////////////////////////////
  49. // SetStackBase
  50. //
  51. EATHREADLIB_API void SetStackBase(void* pStackBase)
  52. {
  53. if(pStackBase)
  54. {
  55. #if EA_THREADS_AVAILABLE
  56. sStackBase.SetValue(pStackBase);
  57. #else
  58. sStackBase = pStackBase;
  59. #endif
  60. }
  61. else
  62. {
  63. pStackBase = GetStackBase();
  64. SetStackBase(pStackBase);
  65. }
  66. }
  67. ///////////////////////////////////////////////////////////////////////////////
  68. // GetStackBase
  69. //
  70. EATHREADLIB_API void* GetStackBase()
  71. {
  72. #if EA_THREADS_AVAILABLE
  73. void* pStackBase = sStackBase.GetValue();
  74. #else
  75. void* pStackBase = sStackBase;
  76. #endif
  77. if(!pStackBase)
  78. pStackBase = (void*)(((uintptr_t)GetStackLimit() + 4095) & ~4095); // Align up to nearest page, as the stack grows downward.
  79. return pStackBase;
  80. }
  81. ///////////////////////////////////////////////////////////////////////////////
  82. // GetStackLimit
  83. //
  84. EATHREADLIB_API void* GetStackLimit()
  85. {
  86. void* pStack = NULL;
  87. pStack = &pStack;
  88. return (void*)((uintptr_t)pStack & ~4095); // Round down to nearest page, as the stack grows downward.
  89. }
  90. } // namespace Thread
  91. } // namespace EA
  92. EA_RESTORE_VC_WARNING()