Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(504)

Unified Diff: util/mach/exc_server_variants.h

Issue 775943005: UniversalMachExcServer: eliminate multiple implementation inheritance (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « util/mach/exc_client_variants_test.cc ('k') | util/mach/exc_server_variants.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: util/mach/exc_server_variants.h
diff --git a/util/mach/exc_server_variants.h b/util/mach/exc_server_variants.h
index 96a95bf9109fa13bdba06654e5e1cbbd8eb2a20f..80fb659c080f7264b6ae0c3324a1d37556950812 100644
--- a/util/mach/exc_server_variants.h
+++ b/util/mach/exc_server_variants.h
@@ -329,10 +329,6 @@ class SimplifiedMachExcServer : public MachExcServer,
//! `mach_exception_raise_state()`, and
//! `mach_exception_raise_state_identity()`.
//!
- //! When used with UniversalMachExcServer, this also handles exceptions
- //! raised by `exception_raise()`, `exception_raise_state()`, and
- //! `exception_raise_state_identity()`.
- //!
//! For convenience in implementation, these different “behaviors” of
//! exception messages are all mapped to a single interface method. The
//! exception’s original “behavior” is specified in the \a behavior
@@ -346,9 +342,7 @@ class SimplifiedMachExcServer : public MachExcServer,
//! `MACH_EXCEPTION_CODES | EXCEPTION_STATE`, or
//! `MACH_EXCEPTION_CODES | EXCEPTION_STATE_IDENTITY`, identifying which
//! exception request message was processed and thus which other
- //! parameters are valid. When used with UniversalMachExcServer, \a
- //! behavior can also be `EXCEPTION_DEFAULT`, `EXCEPTION_STATE`, or
- //! `EXCEPTION_STATE_IDENTITY`.
+ //! parameters are valid.
virtual kern_return_t CatchMachException(
exception_behavior_t behavior,
exception_handler_t exception_port,
@@ -436,8 +430,52 @@ class UniversalMachExcServer
public internal::SimplifiedExcServer::Interface,
public internal::SimplifiedMachExcServer::Interface {
public:
+ //! \brief An interface that the different request messages that are a part of
+ //! the `exc` and `mach_exc` Mach subsystems can be dispatched to.
+ class Interface {
+ public:
+ //! \brief Handles exceptions raised by `exception_raise()`,
+ //! `exception_raise_state()`, `exception_raise_state_identity()`,
+ //! `mach_exception_raise()`, `mach_exception_raise_state()`, and
+ //! `mach_exception_raise_state_identity()`.
+ //!
+ //! For convenience in implementation, these different “behaviors” of
+ //! exception messages are all mapped to a single interface method. The
+ //! exception’s original “behavior” is specified in the \a behavior
+ //! parameter. Only parameters that were supplied in the request message
+ //! are populated, other parameters are set to reasonable default values.
+ //!
+ //! The meanings of most parameters are identical to that of
+ //! MachExcServer::Interface::CatchMachExceptionRaiseStateIdentity().
+ //!
+ //! \param[in] behavior `EXCEPTION_DEFAULT`, `EXCEPTION_STATE`,
+ //! or `EXCEPTION_STATE_IDENTITY`, possibly with `MACH_EXCEPTION_CODES`
+ //! ORed in. This identifies which exception request message was
+ //! processed and thus which other parameters are valid.
+ virtual kern_return_t CatchMachException(
+ exception_behavior_t behavior,
+ exception_handler_t exception_port,
+ thread_t thread,
+ task_t task,
+ exception_type_t exception,
+ const mach_exception_data_type_t* code,
+ mach_msg_type_number_t code_count,
+ thread_state_flavor_t* flavor,
+ const natural_t* old_state,
+ mach_msg_type_number_t old_state_count,
+ thread_state_t new_state,
+ mach_msg_type_number_t* new_state_count,
+ const mach_msg_trailer_t* trailer,
+ bool* destroy_complex_request) = 0;
+
+ protected:
+ ~Interface() {}
+ };
+
//! \brief Constructs an object of this class.
- UniversalMachExcServer();
+ //!
+ //! \param[in] interface The interface to dispatch requests to. Weak.
+ explicit UniversalMachExcServer(Interface* interface);
// MachMessageServer::Interface:
@@ -465,9 +503,27 @@ class UniversalMachExcServer
const mach_msg_trailer_t* trailer,
bool* destroy_complex_request) override;
+ // internal::SimplifiedMachExcServer::Interface:
+
+ kern_return_t CatchMachException(exception_behavior_t behavior,
+ exception_handler_t exception_port,
+ thread_t thread,
+ task_t task,
+ exception_type_t exception,
+ const mach_exception_data_type_t* code,
+ mach_msg_type_number_t code_count,
+ thread_state_flavor_t* flavor,
+ const natural_t* old_state,
+ mach_msg_type_number_t old_state_count,
+ thread_state_t new_state,
+ mach_msg_type_number_t* new_state_count,
+ const mach_msg_trailer_t* trailer,
+ bool* destroy_complex_request) override;
+
private:
internal::SimplifiedExcServer exc_server_;
internal::SimplifiedMachExcServer mach_exc_server_;
+ Interface* interface_; // weak
DISALLOW_COPY_AND_ASSIGN(UniversalMachExcServer);
};
« no previous file with comments | « util/mach/exc_client_variants_test.cc ('k') | util/mach/exc_server_variants.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698