4682 jio_fprintf(stderr, |
4682 jio_fprintf(stderr, |
4683 "Could not open pause file '%s', continuing immediately.\n", filename); |
4683 "Could not open pause file '%s', continuing immediately.\n", filename); |
4684 } |
4684 } |
4685 } |
4685 } |
4686 |
4686 |
|
4687 os::WatcherThreadCrashProtection::WatcherThreadCrashProtection() { |
|
4688 assert(Thread::current()->is_Watcher_thread(), "Must be WatcherThread"); |
|
4689 } |
|
4690 |
|
4691 /* |
|
4692 * See the caveats for this class in os_windows.hpp |
|
4693 * Protects the callback call so that raised OS EXCEPTIONS causes a jump back |
|
4694 * into this method and returns false. If no OS EXCEPTION was raised, returns |
|
4695 * true. |
|
4696 * The callback is supposed to provide the method that should be protected. |
|
4697 */ |
|
4698 bool os::WatcherThreadCrashProtection::call(os::CrashProtectionCallback& cb) { |
|
4699 assert(Thread::current()->is_Watcher_thread(), "Only for WatcherThread"); |
|
4700 assert(!WatcherThread::watcher_thread()->has_crash_protection(), |
|
4701 "crash_protection already set?"); |
|
4702 |
|
4703 bool success = true; |
|
4704 __try { |
|
4705 WatcherThread::watcher_thread()->set_crash_protection(this); |
|
4706 cb.call(); |
|
4707 } __except(EXCEPTION_EXECUTE_HANDLER) { |
|
4708 // only for protection, nothing to do |
|
4709 success = false; |
|
4710 } |
|
4711 WatcherThread::watcher_thread()->set_crash_protection(NULL); |
|
4712 return success; |
|
4713 } |
|
4714 |
4687 // An Event wraps a win32 "CreateEvent" kernel handle. |
4715 // An Event wraps a win32 "CreateEvent" kernel handle. |
4688 // |
4716 // |
4689 // We have a number of choices regarding "CreateEvent" win32 handle leakage: |
4717 // We have a number of choices regarding "CreateEvent" win32 handle leakage: |
4690 // |
4718 // |
4691 // 1: When a thread dies return the Event to the EventFreeList, clear the ParkHandle |
4719 // 1: When a thread dies return the Event to the EventFreeList, clear the ParkHandle |