mirror of
https://github.com/chromium/crashpad.git
synced 2025-03-10 06:36:02 +00:00
Previously, crashpad_handler made its own receive right, and transferred a corresponding send right to its client. There are two advantages to making the receive right in the client: - It is possible to monitor the receive right for a port-destroyed notificaiton in the client, allowing the handler to be restarted if it dies. - For the future run-from-launchd mode (bug crashpad:25), the handler will obtain its receive right from the bootstrap server instead of making its own. Having the handler get its receive right from different sources allows more code to be shared than if it were to sometimes get a receive right and sometimes make a receive right and transfer a send right. This includes a restructuring in crashpad_client_mac.cc that will make it easier to give it an option to restart crashpad_handler if it dies. The handler starting logic should all behave the same as before. BUG=crashpad:68 R=rsesek@chromium.org Review URL: https://codereview.chromium.org/1409073013 .
69 lines
2.6 KiB
C++
69 lines
2.6 KiB
C++
// Copyright 2014 The Crashpad Authors. All rights reserved.
|
||
//
|
||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||
// you may not use this file except in compliance with the License.
|
||
// You may obtain a copy of the License at
|
||
//
|
||
// http://www.apache.org/licenses/LICENSE-2.0
|
||
//
|
||
// Unless required by applicable law or agreed to in writing, software
|
||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
// See the License for the specific language governing permissions and
|
||
// limitations under the License.
|
||
|
||
#ifndef CRASHPAD_HANDLER_MAC_EXCEPTION_HANDLER_SERVER_H_
|
||
#define CRASHPAD_HANDLER_MAC_EXCEPTION_HANDLER_SERVER_H_
|
||
|
||
#include "base/basictypes.h"
|
||
|
||
#include <mach/mach.h>
|
||
|
||
#include "base/mac/scoped_mach_port.h"
|
||
#include "util/mach/exc_server_variants.h"
|
||
|
||
namespace crashpad {
|
||
|
||
//! \brief Runs the main exception-handling server in Crashpad’s handler
|
||
//! process.
|
||
class ExceptionHandlerServer {
|
||
public:
|
||
//! \brief Constructs an ExceptionHandlerServer object.
|
||
//!
|
||
//! \param[in] receive_port The port that exception messages and no-senders
|
||
//! notifications will be received on.
|
||
explicit ExceptionHandlerServer(
|
||
base::mac::ScopedMachReceiveRight receive_port);
|
||
~ExceptionHandlerServer();
|
||
|
||
//! \brief Runs the exception-handling server.
|
||
//!
|
||
//! \param[in] exception_interface An object to send exception messages to.
|
||
//!
|
||
//! This method monitors the receive port for exception messages and
|
||
//! no-senders notifications. It continues running until it has no more
|
||
//! clients, indicated by the receipt of a no-senders notification. It is
|
||
//! important to assure that a send right exists in a client (or has been
|
||
//! queued by `mach_msg()` to be sent to a client) prior to calling this
|
||
//! method, or it will detect that it is sender-less and return immediately.
|
||
//!
|
||
//! All exception messages will be passed to \a exception_interface.
|
||
//!
|
||
//! This method must only be called once on an ExceptionHandlerServer object.
|
||
//!
|
||
//! If an unexpected condition that prevents this method from functioning is
|
||
//! encountered, it will log a message and terminate execution. Receipt of an
|
||
//! invalid message on the receive port will cause a message to be logged, but
|
||
//! this method will continue running normally.
|
||
void Run(UniversalMachExcServer::Interface* exception_interface);
|
||
|
||
private:
|
||
base::mac::ScopedMachReceiveRight receive_port_;
|
||
|
||
DISALLOW_COPY_AND_ASSIGN(ExceptionHandlerServer);
|
||
};
|
||
|
||
} // namespace crashpad
|
||
|
||
#endif // CRASHPAD_HANDLER_MAC_EXCEPTION_HANDLER_SERVER_H_
|