| Index: chrome_frame/exception_barrier.h
|
| ===================================================================
|
| --- chrome_frame/exception_barrier.h (revision 0)
|
| +++ chrome_frame/exception_barrier.h (revision 0)
|
| @@ -0,0 +1,96 @@
|
| +// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +// A class to make it easy to tag exception propagation boundaries and
|
| +// get crash reports of exceptions that pass over same.
|
| +#ifndef CHROME_FRAME_EXCEPTION_BARRIER_H_
|
| +#define CHROME_FRAME_EXCEPTION_BARRIER_H_
|
| +
|
| +#include <windows.h>
|
| +
|
| +/// This is the type dictated for an exception handler by the platform ABI
|
| +/// @see _except_handler in excpt.h
|
| +typedef EXCEPTION_DISPOSITION (__cdecl *ExceptionHandlerFunc)(
|
| + struct _EXCEPTION_RECORD *exception_record,
|
| + void * establisher_frame,
|
| + struct _CONTEXT *context,
|
| + void * reserved);
|
| +
|
| +/// The type of an exception record in the exception handler chain
|
| +struct EXCEPTION_REGISTRATION {
|
| + EXCEPTION_REGISTRATION *prev;
|
| + ExceptionHandlerFunc handler;
|
| +};
|
| +
|
| +/// This is our raw exception handler, it must be declared extern "C" to
|
| +/// match up with the SAFESEH declaration in our corresponding ASM file
|
| +extern "C" EXCEPTION_DISPOSITION __cdecl
|
| +ExceptionBarrierHandler(struct _EXCEPTION_RECORD *exception_record,
|
| + void * establisher_frame,
|
| + struct _CONTEXT *context,
|
| + void * reserved);
|
| +
|
| +/// An exception barrier is used to report exceptions that pass through
|
| +/// a boundary where exceptions shouldn't pass, such as e.g. COM interface
|
| +/// boundaries.
|
| +/// This is handy for any kind of plugin code, where if the exception passes
|
| +/// through unhindered, it'll either be swallowed by an SEH exception handler
|
| +/// above us on the stack, or be reported as an unhandled exception for
|
| +/// the application hosting the plugin code.
|
| +///
|
| +/// To use this class, simply instantiate an ExceptionBarrier just inside
|
| +/// the code boundary, like this:
|
| +/// @code
|
| +/// HRESULT SomeObject::SomeCOMMethod(...) {
|
| +/// ExceptionBarrier report_crashes;
|
| +///
|
| +/// ... other code here ...
|
| +/// }
|
| +/// @endcode
|
| +class ExceptionBarrier {
|
| + public:
|
| + /// Register the barrier in the SEH chain
|
| + ExceptionBarrier();
|
| +
|
| + /// And unregister on destruction
|
| + ~ExceptionBarrier();
|
| +
|
| + /// Signature of the handler function which gets notified when
|
| + /// an exception propagates through a barrier.
|
| + typedef void (CALLBACK *ExceptionHandler)(EXCEPTION_POINTERS *ptrs);
|
| +
|
| + /// @name Accessors
|
| + /// @{
|
| + static void set_handler(ExceptionHandler handler) { s_handler_ = handler; }
|
| + static ExceptionHandler handler() { return s_handler_; }
|
| + /// @}
|
| +
|
| + private:
|
| + /// Our SEH frame
|
| + EXCEPTION_REGISTRATION registration_;
|
| +
|
| + /// The function that gets invoked if an exception
|
| + /// propagates through a barrier
|
| + static ExceptionHandler s_handler_;
|
| +};
|
| +
|
| +/// @name These are implemented in the associated .asm file
|
| +/// @{
|
| +extern "C" void WINAPI RegisterExceptionRecord(
|
| + EXCEPTION_REGISTRATION *registration,
|
| + ExceptionHandlerFunc func);
|
| +extern "C" void WINAPI UnregisterExceptionRecord(
|
| + EXCEPTION_REGISTRATION *registration);
|
| +/// @}
|
| +
|
| +
|
| +inline ExceptionBarrier::ExceptionBarrier() {
|
| + RegisterExceptionRecord(®istration_, ExceptionBarrierHandler);
|
| +}
|
| +
|
| +inline ExceptionBarrier::~ExceptionBarrier() {
|
| + UnregisterExceptionRecord(®istration_);
|
| +}
|
| +
|
| +#endif // CHROME_FRAME_EXCEPTION_BARRIER_H_
|
|
|
| Property changes on: chrome_frame\exception_barrier.h
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|