Index: base/threading/platform_thread_mac.mm |
diff --git a/base/threading/platform_thread_mac.mm b/base/threading/platform_thread_mac.mm |
index 48041a06a4f0ba8b3e44b1fc3e19ff748a46942c..d81a286cb2cba25dec3be9be80d16eb6ac54b7e7 100644 |
--- a/base/threading/platform_thread_mac.mm |
+++ b/base/threading/platform_thread_mac.mm |
@@ -5,10 +5,12 @@ |
#include "base/threading/platform_thread.h" |
#import <Foundation/Foundation.h> |
+#include <algorithm> |
#include <dlfcn.h> |
#include <mach/mach.h> |
#include <mach/mach_time.h> |
#include <mach/thread_policy.h> |
+#include <sys/resource.h> |
#include "base/lazy_instance.h" |
#include "base/logging.h" |
@@ -163,7 +165,7 @@ void SetPriorityRealtimeAudio(mach_port_t mach_thread_id) { |
void PlatformThread::SetThreadPriority(PlatformThreadHandle handle, |
ThreadPriority priority) { |
// Convert from pthread_t to mach thread identifier. |
- mach_port_t mach_thread_id = pthread_mach_thread_np(handle); |
+ mach_port_t mach_thread_id = pthread_mach_thread_np(handle.handle_); |
switch (priority) { |
case kThreadPriority_Normal: |
@@ -172,7 +174,51 @@ void PlatformThread::SetThreadPriority(PlatformThreadHandle handle, |
case kThreadPriority_RealtimeAudio: |
SetPriorityRealtimeAudio(mach_thread_id); |
break; |
+ default: |
+ NOTREACHED() << "Unknown priority."; |
+ break; |
+ } |
+} |
+ |
+size_t GetDefaultThreadStackSize(const pthread_attr_t& attributes) { |
+#if defined(OS_IOS) |
+ return 0; |
+#else |
+ // The Mac OS X default for a pthread stack size is 512kB. |
+ // Libc-594.1.4/pthreads/pthread.c's pthread_attr_init uses |
+ // DEFAULT_STACK_SIZE for this purpose. |
+ // |
+ // 512kB isn't quite generous enough for some deeply recursive threads that |
+ // otherwise request the default stack size by specifying 0. Here, adopt |
+ // glibc's behavior as on Linux, which is to use the current stack size |
+ // limit (ulimit -s) as the default stack size. See |
+ // glibc-2.11.1/nptl/nptl-init.c's __pthread_initialize_minimal_internal. To |
+ // avoid setting the limit below the Mac OS X default or the minimum usable |
+ // stack size, these values are also considered. If any of these values |
+ // can't be determined, or if stack size is unlimited (ulimit -s unlimited), |
+ // stack_size is left at 0 to get the system default. |
+ // |
+ // Mac OS X normally only applies ulimit -s to the main thread stack. On |
+ // contemporary OS X and Linux systems alike, this value is generally 8MB |
+ // or in that neighborhood. |
+ size_t default_stack_size = 0; |
+ struct rlimit stack_rlimit; |
+ if (pthread_attr_getstacksize(&attributes, &default_stack_size) == 0 && |
+ getrlimit(RLIMIT_STACK, &stack_rlimit) == 0 && |
+ stack_rlimit.rlim_cur != RLIM_INFINITY) { |
+ default_stack_size = |
+ std::max(std::max(default_stack_size, |
+ static_cast<size_t>(PTHREAD_STACK_MIN)), |
+ static_cast<size_t>(stack_rlimit.rlim_cur)); |
} |
+ return default_stack_size; |
+#endif |
+} |
+ |
+void InitOnThread() { |
+} |
+ |
+void TerminateOnThread() { |
} |
} // namespace base |