Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 31b5be69 authored by Josh Gao's avatar Josh Gao
Browse files

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
parent 5791e216
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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);
+3 −2
Original line number Diff line number Diff line
@@ -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();
+2 −2
Original line number Diff line number Diff line
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -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();

adb/sysdeps/memory.h

0 → 100644
+36 −0
Original line number Diff line number Diff line
#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
Loading