adb: implement std::make_unique, start using it.

Add an implementation of std::make_unique for Windows, where we're
currently stuck with C++11, and switch some uses of new over to it.

Test: treehugger
Change-Id: I99b85f07754adda7c525243480c3e0bce9a25ce7
This commit is contained in:
Josh Gao 2018-03-07 16:51:08 -08:00
parent 5791e21697
commit 31b5be69f4
8 changed files with 55 additions and 14 deletions

View File

@ -29,6 +29,7 @@
#include "socket_spec.h"
#include "sysdeps.h"
#include "sysdeps/memory.h"
#include "transport.h"
// A listener is an entity which binds to a local port and, upon receiving a connection on that
@ -203,7 +204,7 @@ InstallStatus install_listener(const std::string& local_name, const char* connec
}
}
std::unique_ptr<alistener> listener(new alistener(local_name, connect_to));
auto listener = std::make_unique<alistener>(local_name, connect_to);
int resolved = 0;
listener->fd = socket_spec_listen(listener->local_name, error, &resolved);

View File

@ -61,6 +61,7 @@
#include "services.h"
#include "shell_service.h"
#include "sysdeps/chrono.h"
#include "sysdeps/memory.h"
static int install_app(int argc, const char** argv);
static int install_multiple_app(int argc, const char** argv);
@ -263,7 +264,7 @@ int read_and_dump(int fd, bool use_shell_protocol = false,
char raw_buffer[BUFSIZ];
char* buffer_ptr = raw_buffer;
if (use_shell_protocol) {
protocol.reset(new ShellProtocol(fd));
protocol = std::make_unique<ShellProtocol>(fd);
if (!protocol) {
LOG(ERROR) << "failed to allocate memory for ShellProtocol object";
return 1;
@ -630,7 +631,7 @@ static int RemoteShell(bool use_shell_protocol, const std::string& type_arg,
args->raw_stdin = raw_stdin;
args->escape_char = escape_char;
if (use_shell_protocol) {
args->protocol.reset(new ShellProtocol(args->write_fd));
args->protocol = std::make_unique<ShellProtocol>(args->write_fd);
}
if (raw_stdin) stdin_raw_init();

View File

@ -372,8 +372,8 @@ bool Subprocess::ForkAndExec(std::string* error) {
}
D("protocol FD = %d", protocol_sfd_.get());
input_.reset(new ShellProtocol(protocol_sfd_));
output_.reset(new ShellProtocol(protocol_sfd_));
input_ = std::make_unique<ShellProtocol>(protocol_sfd_);
output_ = std::make_unique<ShellProtocol>(protocol_sfd_);
if (!input_ || !output_) {
*error = "failed to allocate shell protocol objects";
kill(pid_, SIGKILL);

View File

@ -99,7 +99,7 @@ static void FdEventThreadFunc(ThreadArg* arg) {
std::vector<std::unique_ptr<FdHandler>> fd_handlers;
for (size_t i = 0; i < read_fds.size(); ++i) {
fd_handlers.push_back(std::unique_ptr<FdHandler>(new FdHandler(read_fds[i], write_fds[i])));
fd_handlers.push_back(std::make_unique<FdHandler>(read_fds[i], write_fds[i]));
}
fdevent_loop();

36
adb/sysdeps/memory.h Normal file
View File

@ -0,0 +1,36 @@
#pragma once
/*
* Copyright (C) 2018 The Android Open Source Project
*
* 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.
*/
#include <memory>
#include <type_traits>
#if defined(_WIN32)
// We don't have C++14 on Windows yet.
// Reimplement std::make_unique ourselves until we do.
namespace std {
template <typename T, typename... Args>
typename std::enable_if<!std::is_array<T>::value, std::unique_ptr<T>>::type make_unique(
Args&&... args) {
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
} // namespace std
#endif

View File

@ -17,6 +17,8 @@
#define TRACE_TAG TRANSPORT
#include "sysdeps.h"
#include "sysdeps/memory.h"
#include "transport.h"
#include <ctype.h>
@ -79,7 +81,7 @@ void BlockingConnectionAdapter::Start() {
read_thread_ = std::thread([this]() {
LOG(INFO) << this->transport_name_ << ": read thread spawning";
while (true) {
std::unique_ptr<apacket> packet(new apacket());
auto packet = std::make_unique<apacket>();
if (!underlying_->Read(packet.get())) {
PLOG(INFO) << this->transport_name_ << ": read failed";
break;

View File

@ -45,6 +45,7 @@
#include "adb_unique_fd.h"
#include "adb_utils.h"
#include "sysdeps/chrono.h"
#include "sysdeps/memory.h"
#if ADB_HOST
@ -450,9 +451,8 @@ int init_socket_transport(atransport* t, int s, int adb_port, int local) {
#if ADB_HOST
// Emulator connection.
if (local) {
std::unique_ptr<BlockingConnection> emulator_connection(
new EmulatorConnection(std::move(fd), adb_port));
t->connection.reset(new BlockingConnectionAdapter(std::move(emulator_connection)));
auto emulator_connection = std::make_unique<EmulatorConnection>(std::move(fd), adb_port);
t->connection = std::make_unique<BlockingConnectionAdapter>(std::move(emulator_connection));
std::lock_guard<std::mutex> lock(local_transports_lock);
atransport* existing_transport = find_emulator_transport_by_adb_port_locked(adb_port);
if (existing_transport != NULL) {
@ -471,7 +471,7 @@ int init_socket_transport(atransport* t, int s, int adb_port, int local) {
#endif
// Regular tcp connection.
std::unique_ptr<BlockingConnection> fd_connection(new FdConnection(std::move(fd)));
t->connection.reset(new BlockingConnectionAdapter(std::move(fd_connection)));
auto fd_connection = std::make_unique<FdConnection>(std::move(fd));
t->connection = std::make_unique<BlockingConnectionAdapter>(std::move(fd_connection));
return fail;
}

View File

@ -17,6 +17,7 @@
#define TRACE_TAG TRANSPORT
#include "sysdeps.h"
#include "sysdeps/memory.h"
#include "transport.h"
#include <stdio.h>
@ -174,8 +175,8 @@ void UsbConnection::Close() {
void init_usb_transport(atransport* t, usb_handle* h) {
D("transport: usb");
std::unique_ptr<BlockingConnection> connection(new UsbConnection(h));
t->connection.reset(new BlockingConnectionAdapter(std::move(connection)));
auto connection = std::make_unique<UsbConnection>(h);
t->connection = std::make_unique<BlockingConnectionAdapter>(std::move(connection));
t->type = kTransportUsb;
}