From 5e7d773d82251d78f1799a62deb0fe76d380fdeb Mon Sep 17 00:00:00 2001 From: Han Pengfei Date: Thu, 1 Feb 2018 14:46:45 +0800 Subject: [PATCH 01/20] Fix missing the release of lock in AdbMessageProcessor when process waiting_for_guest_accept_command. Signed-off-by: Han Pengfei --- src/anbox/qemu/adb_message_processor.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/anbox/qemu/adb_message_processor.cpp b/src/anbox/qemu/adb_message_processor.cpp index 24d3bb7..5652be1 100644 --- a/src/anbox/qemu/adb_message_processor.cpp +++ b/src/anbox/qemu/adb_message_processor.cpp @@ -74,10 +74,11 @@ void AdbMessageProcessor::advance_state() { if (state_ == closed_by_host) { host_connector_.reset(); - return; + } else { + wait_for_host_connection(); } - wait_for_host_connection(); + lock_.unlock(); break; case waiting_for_host_connection: messenger_->send(reinterpret_cast(ok_command.data()), From 083b54cc2d81361ef265b810e7b46048374ccba9 Mon Sep 17 00:00:00 2001 From: Han Pengfei Date: Thu, 1 Feb 2018 15:00:23 +0800 Subject: [PATCH 02/20] Just waiting 3 seconds when stop container. If container manager dies before session manager dying, the session manager cannot exit if it waits for all. This patch fix the above issue. Signed-off-by: Han Pengfei --- src/anbox/container/management_api_stub.cpp | 5 ++++- src/anbox/container/management_api_stub.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/anbox/container/management_api_stub.cpp b/src/anbox/container/management_api_stub.cpp index 1806daf..b810db8 100644 --- a/src/anbox/container/management_api_stub.cpp +++ b/src/anbox/container/management_api_stub.cpp @@ -24,6 +24,9 @@ namespace anbox { namespace container { + +const std::chrono::milliseconds ManagementApiStub::stop_waiting_millis{3000}; + ManagementApiStub::ManagementApiStub( const std::shared_ptr &channel) : channel_(channel) {} @@ -75,7 +78,7 @@ void ManagementApiStub::stop_container() { channel_->call_method("stop_container", &message, c->response.get(), google::protobuf::NewCallback(this, &ManagementApiStub::container_stopped, c.get())); - c->wh.wait_for_all(); + c->wh.wait_for_pending(stop_waiting_millis); if (c->response->has_error()) throw std::runtime_error(c->response->error()); } diff --git a/src/anbox/container/management_api_stub.h b/src/anbox/container/management_api_stub.h index 11ebeeb..a883131 100644 --- a/src/anbox/container/management_api_stub.h +++ b/src/anbox/container/management_api_stub.h @@ -56,6 +56,7 @@ class ManagementApiStub : public DoNotCopyOrMove { mutable std::mutex mutex_; std::shared_ptr channel_; + static const std::chrono::milliseconds stop_waiting_millis; }; } // namespace container } // namespace anbox From 15803e186865217689bbc8a15e611f78b033abc4 Mon Sep 17 00:00:00 2001 From: Han Pengfei Date: Thu, 1 Feb 2018 15:00:23 +0800 Subject: [PATCH 03/20] Just waiting 3 seconds when stop container. If container manager dies before session manager dying, the session manager cannot exit if it waits for all. This patch fix the above issue. Signed-off-by: Han Pengfei --- src/anbox/container/management_api_stub.cpp | 7 ++++++- src/anbox/container/management_api_stub.h | 1 + src/anbox/qemu/adb_message_processor.cpp | 5 ++--- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/anbox/container/management_api_stub.cpp b/src/anbox/container/management_api_stub.cpp index 1806daf..ebe7632 100644 --- a/src/anbox/container/management_api_stub.cpp +++ b/src/anbox/container/management_api_stub.cpp @@ -24,6 +24,9 @@ namespace anbox { namespace container { + +const std::chrono::milliseconds ManagementApiStub::stop_waiting_timeout{3000}; + ManagementApiStub::ManagementApiStub( const std::shared_ptr &channel) : channel_(channel) {} @@ -75,7 +78,9 @@ void ManagementApiStub::stop_container() { channel_->call_method("stop_container", &message, c->response.get(), google::protobuf::NewCallback(this, &ManagementApiStub::container_stopped, c.get())); - c->wh.wait_for_all(); + // If container manager dies before session manager, the session manager + // cannot exit if it waits for all, so just wait for 3 seconds. + c->wh.wait_for_pending(stop_waiting_timeout); if (c->response->has_error()) throw std::runtime_error(c->response->error()); } diff --git a/src/anbox/container/management_api_stub.h b/src/anbox/container/management_api_stub.h index 11ebeeb..e40df94 100644 --- a/src/anbox/container/management_api_stub.h +++ b/src/anbox/container/management_api_stub.h @@ -56,6 +56,7 @@ class ManagementApiStub : public DoNotCopyOrMove { mutable std::mutex mutex_; std::shared_ptr channel_; + static const std::chrono::milliseconds stop_waiting_timeout; }; } // namespace container } // namespace anbox diff --git a/src/anbox/qemu/adb_message_processor.cpp b/src/anbox/qemu/adb_message_processor.cpp index 5652be1..0387088 100644 --- a/src/anbox/qemu/adb_message_processor.cpp +++ b/src/anbox/qemu/adb_message_processor.cpp @@ -72,11 +72,10 @@ void AdbMessageProcessor::advance_state() { // one is established but will not use it until the active one is closed. lock_.lock(); - if (state_ == closed_by_host) { + if (state_ == closed_by_host) host_connector_.reset(); - } else { + else wait_for_host_connection(); - } lock_.unlock(); break; From ffcae32ea92343dea1cf981deb8a4c2a04a09348 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dhiego=20Cassiano=20Foga=C3=A7a=20Barbosa?= Date: Tue, 6 Feb 2018 01:09:45 -0200 Subject: [PATCH 04/20] Fix narrowing conversion inside {} --- src/anbox/runtime.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/anbox/runtime.cpp b/src/anbox/runtime.cpp index cbfefa7..a97b673 100644 --- a/src/anbox/runtime.cpp +++ b/src/anbox/runtime.cpp @@ -53,7 +53,7 @@ std::shared_ptr Runtime::create(std::uint32_t pool_size) { Runtime::Runtime(std::uint32_t pool_size) : pool_size_{pool_size}, - service_{pool_size_}, + service_{static_cast(pool_size_)}, strand_{service_}, keep_alive_{service_} {} From 8b74034a17d44fef61123f3508a6b39ae23e826b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dhiego=20Cassiano=20Foga=C3=A7a=20Barbosa?= Date: Wed, 14 Feb 2018 15:36:58 -0200 Subject: [PATCH 05/20] Fixed build on boost <= 1.65 --- src/anbox/runtime.cpp | 6 ++++++ src/anbox/runtime.h | 1 + 2 files changed, 7 insertions(+) diff --git a/src/anbox/runtime.cpp b/src/anbox/runtime.cpp index a97b673..d7e9706 100644 --- a/src/anbox/runtime.cpp +++ b/src/anbox/runtime.cpp @@ -53,7 +53,13 @@ std::shared_ptr Runtime::create(std::uint32_t pool_size) { Runtime::Runtime(std::uint32_t pool_size) : pool_size_{pool_size}, + + #if BOOST_VERSION == 106600 service_{static_cast(pool_size_)}, + #else + service_{pool_size_}, + #endif + strand_{service_}, keep_alive_{service_} {} diff --git a/src/anbox/runtime.h b/src/anbox/runtime.h index 43065be..ea521e3 100644 --- a/src/anbox/runtime.h +++ b/src/anbox/runtime.h @@ -19,6 +19,7 @@ #define ANBOX_RUNTIME_H_ #include +#include #include #include From a044e70b3a00788f4fbebb28ca728beff7c9459b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dhiego=20Cassiano=20Foga=C3=A7a=20Barbosa?= Date: Fri, 16 Feb 2018 19:52:51 -0200 Subject: [PATCH 06/20] Updated preprocessor condition Without >=, the patch would not work on newer versions of Boost --- src/anbox/runtime.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/anbox/runtime.cpp b/src/anbox/runtime.cpp index d7e9706..90c6768 100644 --- a/src/anbox/runtime.cpp +++ b/src/anbox/runtime.cpp @@ -54,7 +54,7 @@ std::shared_ptr Runtime::create(std::uint32_t pool_size) { Runtime::Runtime(std::uint32_t pool_size) : pool_size_{pool_size}, - #if BOOST_VERSION == 106600 + #if BOOST_VERSION >= 106600 service_{static_cast(pool_size_)}, #else service_{pool_size_}, From 04ceffa6b600c38de6764508e216b8f6c9a1e4e5 Mon Sep 17 00:00:00 2001 From: Han Pengfei Date: Fri, 23 Feb 2018 11:03:34 +0800 Subject: [PATCH 07/20] Reset the unlock. Signed-off-by: Han Pengfei --- src/anbox/qemu/adb_message_processor.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/anbox/qemu/adb_message_processor.cpp b/src/anbox/qemu/adb_message_processor.cpp index 0387088..24d3bb7 100644 --- a/src/anbox/qemu/adb_message_processor.cpp +++ b/src/anbox/qemu/adb_message_processor.cpp @@ -72,12 +72,12 @@ void AdbMessageProcessor::advance_state() { // one is established but will not use it until the active one is closed. lock_.lock(); - if (state_ == closed_by_host) + if (state_ == closed_by_host) { host_connector_.reset(); - else - wait_for_host_connection(); + return; + } - lock_.unlock(); + wait_for_host_connection(); break; case waiting_for_host_connection: messenger_->send(reinterpret_cast(ok_command.data()), From 50671ed9878e125aa7245f42f1b3513caa6c2d38 Mon Sep 17 00:00:00 2001 From: Simon Fels Date: Sun, 4 Mar 2018 17:31:03 +0100 Subject: [PATCH 08/20] scripts: explicitly set linker search path for libpulsecommon-8.0 --- scripts/snap-wrapper.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/scripts/snap-wrapper.sh b/scripts/snap-wrapper.sh index 0ca2d83..b1f1e3b 100755 --- a/scripts/snap-wrapper.sh +++ b/scripts/snap-wrapper.sh @@ -35,6 +35,11 @@ export LD_LIBRARY_PATH="$SNAP_LIBRARY_PATH:$LD_LIBRARY_PATH" # Ref.: https://bugs.launchpad.net/snappy/+bug/1588192 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/var/lib/snapd/lib/gl +# With recent builds on Ubuntu 16.04 the snap does not find the path to +# libpulsecommon-8.0.so anymore so we have to teach the linker manually +# where it can be found +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SNAP/usr/lib/$ARCH/pulseaudio + # We set XDG_DATA_HOME to SNAP_USER_COMMON here as this will be the location we will # create all our application launchers in. The system application launcher will # be configured by our installer to look into this directory for available From 90c91783fd15a72d5410104431bd35027e8bfccc Mon Sep 17 00:00:00 2001 From: unknown <94389147@qq.com> Date: Thu, 29 Mar 2018 15:15:28 +0800 Subject: [PATCH 09/20] Fix nir shaders memory leak on translator host side, this issue is heavily increased the memory usage in application created and compile shader programs frequently --- .../host/tools/emugen/ApiGen.cpp | 79 +++++++++++++++++++ src/anbox/graphics/emugl/RenderThread.cpp | 4 + 2 files changed, 83 insertions(+) diff --git a/external/android-emugl/host/tools/emugen/ApiGen.cpp b/external/android-emugl/host/tools/emugen/ApiGen.cpp index cd3d67b..e368055 100644 --- a/external/android-emugl/host/tools/emugen/ApiGen.cpp +++ b/external/android-emugl/host/tools/emugen/ApiGen.cpp @@ -753,6 +753,10 @@ int ApiGen::genDecoderHeader(const std::string &filename) fprintf(fp, "#include \"IOStream.h\" \n"); fprintf(fp, "#include \"%s_%s_context.h\"\n\n\n", m_basename.c_str(), sideString(SERVER_SIDE)); + if (strcmp(classname.c_str(), "gles2_decoder_context_t") == 0) { + fprintf(fp, "\n#include \n"); + fprintf(fp, "\n#include \n"); + } fprintf(fp, "\n#include \"emugl/common/logging.h\"\n"); for (size_t i = 0; i < m_decoderHeaders.size(); i++) { @@ -763,6 +767,17 @@ int ApiGen::genDecoderHeader(const std::string &filename) fprintf(fp, "struct %s : public %s_%s_context_t {\n\n", classname.c_str(), m_basename.c_str(), sideString(SERVER_SIDE)); fprintf(fp, "\tsize_t decode(void *buf, size_t bufsize, IOStream *stream);\n"); + if (strcmp(classname.c_str(), "gles2_decoder_context_t") == 0){ + fprintf(fp, + "\tvoid freeShader(); \n\ + \tvoid freeProgram(); \n\ + \tstd::map m_programs; \n\ + \tstd::map m_shaders; \n\ + \tstd::mutex m_lock; \n\ + "); + + + } fprintf(fp, "\n};\n\n"); fprintf(fp, "#endif // GUARD_%s\n", classname.c_str()); @@ -835,6 +850,35 @@ int ApiGen::genDecoderImpl(const std::string &filename) // helper templates fprintf(fp, "using namespace emugl;\n\n"); + // glsl shader/program free; + if (strcmp(classname.c_str(), "gles2_decoder_context_t") == 0) { + fprintf(fp, "void %s::freeShader(){\n", classname.c_str()); + fprintf(fp, + " \n\ +\tauto it = m_shaders.begin();\n\ +\tm_lock.lock();\n\ +\twhile(it != m_shaders.end()) \n\ +\t{\n\ +\t\tthis->glDeleteShader(it->first);\n\ +\t\tit++;\n\ +\t}\n\ +\tm_lock.unlock();\n\ +}\n\n"); + + fprintf(fp, "void %s::freeProgram(){\n", classname.c_str()); + fprintf(fp, + " \n\ +\tauto it = m_programs.begin(); \n\ +\tm_lock.lock();\n\ +\twhile(it != m_programs.end()) \n\ +\t{\n\ +\t\tthis->glDeleteProgram(it->first);\n\ +\t\tit++;\n\ +\t}\n\ +\tm_lock.unlock();\n\ +}\n\n"); + } + // decoder switch; fprintf(fp, "size_t %s::decode(void *buf, size_t len, IOStream *stream)\n{\n", classname.c_str()); fprintf(fp, @@ -1161,6 +1205,41 @@ int ApiGen::genDecoderImpl(const std::string &filename) } // pass; fprintf(fp, "\t\t\tSET_LASTCALL(\"%s\");\n", e->name().c_str()); + if (strcmp(m_basename.c_str(), "gles2") == 0) { + if (strcmp(e->name().c_str(), "glAttachShader") == 0){ + fprintf(fp, "\n\ + \t\t\tm_lock.lock();\n\ + m_shaders.insert({var_shader, 1});\n\ + m_lock.unlock();\n"); + } else if(strcmp(e->name().c_str(), "glDeleteProgram") == 0){ + fprintf(fp, + "\t\t\tm_lock.lock(); \n" + "\t\t\tauto pro = m_programs.find(var_program); \n" + "\t\t\tif (pro == m_programs.end()) \n" + "\t\t\t{\n" + "\t\t\t\tDEBUG(\"This should not happened!\"); \n" + "\t\t\t} else { \n" + "\t\t\t\tm_programs.erase(pro); \n" + "\t\t\t}\n" + "\t\t\tm_lock.unlock();\n"); + } else if(strcmp(e->name().c_str(), "glDeleteShader") == 0){ + fprintf(fp, + "\t\t\tm_lock.lock(); \n\ + \t\t\tauto shader = m_shaders.find(var_shader); \n\ + \t\t\tif (shader == m_shaders.end()) \n\ + \t\t\t{ \n\ + \t\t\t\tDEBUG(\"This should not happened!\"); \n\ + \t\t\t} else { \n\ + \t\t\t\tm_shaders.erase(shader); \n\ + \t\t\t} \n\ + \t\t\tm_lock.unlock(); \n"); + } else if(strcmp(e->name().c_str(), "glLinkProgram") == 0){ + fprintf(fp, " \n\ + \t\t\tm_lock.lock();\n\ + \t\t\tm_programs.insert({var_program, 1});\n\ + \t\t\tm_lock.unlock();\n"); + } + } fprintf(fp, "\t\t\tbreak;\n"); fprintf(fp, "\t\t}\n"); diff --git a/src/anbox/graphics/emugl/RenderThread.cpp b/src/anbox/graphics/emugl/RenderThread.cpp index 7e6dff7..7c8e4e6 100644 --- a/src/anbox/graphics/emugl/RenderThread.cpp +++ b/src/anbox/graphics/emugl/RenderThread.cpp @@ -84,8 +84,12 @@ intptr_t RenderThread::main() { } } while (progress); + } + threadInfo.m_gl2Dec.freeShader(); + threadInfo.m_gl2Dec.freeProgram(); + // Release references to the current thread's context/surfaces if any renderer_->bindContext(0, 0, 0); if (threadInfo.currContext || threadInfo.currDrawSurf || threadInfo.currReadSurf) From 5cc79d9782daf9bec13b3f67c6af5bb6efc6ce35 Mon Sep 17 00:00:00 2001 From: Ondra Pelech Date: Sun, 1 Apr 2018 16:19:28 +0200 Subject: [PATCH 10/20] Use the `z` as print format for `size_t` variable instead of `l` to make it platform independent `l` is a format for `long int`. It accidentally worked on 64 bit architectures, because `long int` has the same length as `size_t` there. It didn't work on 32 bit architectures, where `size_t` is shorter than `long int`. Let's use `z`, because that's the proper format for `size_t` -- it works on any platform. --- src/anbox/qemu/qemud_message_processor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/anbox/qemu/qemud_message_processor.cpp b/src/anbox/qemu/qemud_message_processor.cpp index d9ee009..b47f078 100644 --- a/src/anbox/qemu/qemud_message_processor.cpp +++ b/src/anbox/qemu/qemud_message_processor.cpp @@ -70,7 +70,7 @@ void QemudMessageProcessor::process_commands() { void QemudMessageProcessor::send_header(const size_t &size) { char header[header_size + 1]; - std::snprintf(header, header_size + 1, "%04lx", size); + std::snprintf(header, header_size + 1, "%04zx", size); messenger_->send(header, header_size); } From 4dd2ae389a26a64444968b00db6b7dc8f2d6c0c5 Mon Sep 17 00:00:00 2001 From: Jiancong <94389147@qq.com> Date: Tue, 3 Apr 2018 10:57:25 +0800 Subject: [PATCH 11/20] Fix the cycle-referenced caused memory leak by shared_ptr used, this issue is recognized by valgrind memcheck tool. --- external/process-cpp-minimal/include/core/posix/signal.h | 2 +- external/process-cpp-minimal/src/core/posix/signal.cpp | 8 +++----- src/anbox/cmds/session_manager.cpp | 9 +++++++-- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/external/process-cpp-minimal/include/core/posix/signal.h b/external/process-cpp-minimal/include/core/posix/signal.h index d11724a..a647149 100644 --- a/external/process-cpp-minimal/include/core/posix/signal.h +++ b/external/process-cpp-minimal/include/core/posix/signal.h @@ -100,7 +100,7 @@ protected: * @brief Traps the specified signals for the entire process. */ CORE_POSIX_DLL_PUBLIC -std::shared_ptr trap_signals_for_process( +SignalTrap* trap_signals_for_process( std::initializer_list blocked_signals); /** diff --git a/external/process-cpp-minimal/src/core/posix/signal.cpp b/external/process-cpp-minimal/src/core/posix/signal.cpp index fd90047..4dd38cf 100644 --- a/external/process-cpp-minimal/src/core/posix/signal.cpp +++ b/external/process-cpp-minimal/src/core/posix/signal.cpp @@ -203,12 +203,10 @@ private: }; } -std::shared_ptr core::posix::trap_signals_for_process( - std::initializer_list blocked_signals) +core::posix::SignalTrap* core::posix::trap_signals_for_process( + std::initializer_list blocked_signals) { - return std::make_shared( - impl::SignalTrap::Scope::process, - blocked_signals); + return new impl::SignalTrap(impl::SignalTrap::Scope::process, blocked_signals); } std::shared_ptr core::posix::trap_signals_for_all_subsequent_threads( diff --git a/src/anbox/cmds/session_manager.cpp b/src/anbox/cmds/session_manager.cpp index 4988967..1551e81 100644 --- a/src/anbox/cmds/session_manager.cpp +++ b/src/anbox/cmds/session_manager.cpp @@ -131,7 +131,7 @@ anbox::cmds::SessionManager::SessionManager() use_system_dbus_)); action([this](const cli::Command::Context &) { - auto trap = core::posix::trap_signals_for_process( + core::posix::SignalTrap* trap = core::posix::trap_signals_for_process( {core::posix::Signal::sig_term, core::posix::Signal::sig_int}); trap->signal_raised().connect([trap](const core::posix::Signal &signal) { INFO("Signal %i received. Good night.", static_cast(signal)); @@ -139,11 +139,13 @@ anbox::cmds::SessionManager::SessionManager() }); if (standalone_ && !experimental_) { + delete trap; ERROR("Experimental features selected, but --experimental flag not set"); return EXIT_FAILURE; } if (!fs::exists("/dev/binder") || !fs::exists("/dev/ashmem")) { + delete trap; ERROR("Failed to start as either binder or ashmem kernel drivers are not loaded"); return EXIT_FAILURE; } @@ -176,8 +178,10 @@ anbox::cmds::SessionManager::SessionManager() input_manager, display_frame, single_window_); - if (!platform) + if (!platform) { + delete trap; return EXIT_FAILURE; + } auto app_db = std::make_shared(); @@ -283,6 +287,7 @@ anbox::cmds::SessionManager::SessionManager() rt->stop(); + delete trap; return EXIT_SUCCESS; }); } From c288083bb3168bbb2440f61fe88a128eaeba7b22 Mon Sep 17 00:00:00 2001 From: misha98857 Date: Tue, 3 Apr 2018 21:54:27 +0400 Subject: [PATCH 12/20] fix GLM error fix this problem: "GLM: GLM_GTX_transform is an experimental extension and may change in the future" --- src/anbox/graphics/emugl/Renderer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/anbox/graphics/emugl/Renderer.cpp b/src/anbox/graphics/emugl/Renderer.cpp index a807131..98d26cc 100644 --- a/src/anbox/graphics/emugl/Renderer.cpp +++ b/src/anbox/graphics/emugl/Renderer.cpp @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +#define GLM_ENABLE_EXPERIMENTAL #include "anbox/graphics/emugl/Renderer.h" #include "anbox/graphics/emugl/DispatchTables.h" #include "anbox/graphics/emugl/RenderThreadInfo.h" From 715c57564a61092a767b6adfa14a636757623af2 Mon Sep 17 00:00:00 2001 From: Jiancong <94389147@qq.com> Date: Wed, 4 Apr 2018 17:09:24 +0800 Subject: [PATCH 13/20] Remove debug info print. --- external/android-emugl/host/tools/emugen/ApiGen.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/external/android-emugl/host/tools/emugen/ApiGen.cpp b/external/android-emugl/host/tools/emugen/ApiGen.cpp index e368055..fc6c031 100644 --- a/external/android-emugl/host/tools/emugen/ApiGen.cpp +++ b/external/android-emugl/host/tools/emugen/ApiGen.cpp @@ -1215,10 +1215,8 @@ int ApiGen::genDecoderImpl(const std::string &filename) fprintf(fp, "\t\t\tm_lock.lock(); \n" "\t\t\tauto pro = m_programs.find(var_program); \n" - "\t\t\tif (pro == m_programs.end()) \n" - "\t\t\t{\n" - "\t\t\t\tDEBUG(\"This should not happened!\"); \n" - "\t\t\t} else { \n" + "\t\t\tif (pro != m_programs.end()) \n" + "\t\t\t{ \n" "\t\t\t\tm_programs.erase(pro); \n" "\t\t\t}\n" "\t\t\tm_lock.unlock();\n"); @@ -1226,10 +1224,8 @@ int ApiGen::genDecoderImpl(const std::string &filename) fprintf(fp, "\t\t\tm_lock.lock(); \n\ \t\t\tauto shader = m_shaders.find(var_shader); \n\ - \t\t\tif (shader == m_shaders.end()) \n\ + \t\t\tif (shader != m_shaders.end()) \n\ \t\t\t{ \n\ - \t\t\t\tDEBUG(\"This should not happened!\"); \n\ - \t\t\t} else { \n\ \t\t\t\tm_shaders.erase(shader); \n\ \t\t\t} \n\ \t\t\tm_lock.unlock(); \n"); From 48471b1454b6f77d4e152332f045586a56485c88 Mon Sep 17 00:00:00 2001 From: Jiancong <94389147@qq.com> Date: Thu, 5 Apr 2018 22:06:43 +0800 Subject: [PATCH 14/20] Revert previous cycling-reference commit. --- external/process-cpp-minimal/include/core/posix/signal.h | 2 +- external/process-cpp-minimal/src/core/posix/signal.cpp | 6 ++++-- src/anbox/cmds/session_manager.cpp | 6 +----- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/external/process-cpp-minimal/include/core/posix/signal.h b/external/process-cpp-minimal/include/core/posix/signal.h index a647149..d11724a 100644 --- a/external/process-cpp-minimal/include/core/posix/signal.h +++ b/external/process-cpp-minimal/include/core/posix/signal.h @@ -100,7 +100,7 @@ protected: * @brief Traps the specified signals for the entire process. */ CORE_POSIX_DLL_PUBLIC -SignalTrap* trap_signals_for_process( +std::shared_ptr trap_signals_for_process( std::initializer_list blocked_signals); /** diff --git a/external/process-cpp-minimal/src/core/posix/signal.cpp b/external/process-cpp-minimal/src/core/posix/signal.cpp index 4dd38cf..43c10e0 100644 --- a/external/process-cpp-minimal/src/core/posix/signal.cpp +++ b/external/process-cpp-minimal/src/core/posix/signal.cpp @@ -203,10 +203,12 @@ private: }; } -core::posix::SignalTrap* core::posix::trap_signals_for_process( +std::shared_ptr core::posix::trap_signals_for_process( std::initializer_list blocked_signals) { - return new impl::SignalTrap(impl::SignalTrap::Scope::process, blocked_signals); + return std::make_shared( + impl::SignalTrap::Scope::process, + blocked_signals); } std::shared_ptr core::posix::trap_signals_for_all_subsequent_threads( diff --git a/src/anbox/cmds/session_manager.cpp b/src/anbox/cmds/session_manager.cpp index 1551e81..af0bcec 100644 --- a/src/anbox/cmds/session_manager.cpp +++ b/src/anbox/cmds/session_manager.cpp @@ -131,7 +131,7 @@ anbox::cmds::SessionManager::SessionManager() use_system_dbus_)); action([this](const cli::Command::Context &) { - core::posix::SignalTrap* trap = core::posix::trap_signals_for_process( + auto trap = core::posix::trap_signals_for_process( {core::posix::Signal::sig_term, core::posix::Signal::sig_int}); trap->signal_raised().connect([trap](const core::posix::Signal &signal) { INFO("Signal %i received. Good night.", static_cast(signal)); @@ -139,13 +139,11 @@ anbox::cmds::SessionManager::SessionManager() }); if (standalone_ && !experimental_) { - delete trap; ERROR("Experimental features selected, but --experimental flag not set"); return EXIT_FAILURE; } if (!fs::exists("/dev/binder") || !fs::exists("/dev/ashmem")) { - delete trap; ERROR("Failed to start as either binder or ashmem kernel drivers are not loaded"); return EXIT_FAILURE; } @@ -179,7 +177,6 @@ anbox::cmds::SessionManager::SessionManager() display_frame, single_window_); if (!platform) { - delete trap; return EXIT_FAILURE; } @@ -287,7 +284,6 @@ anbox::cmds::SessionManager::SessionManager() rt->stop(); - delete trap; return EXIT_SUCCESS; }); } From 08defc555892d4af0e58555b6bdf4fb676e7da2f Mon Sep 17 00:00:00 2001 From: Jiancong <94389147@qq.com> Date: Sun, 6 May 2018 12:28:31 +0800 Subject: [PATCH 15/20] Remove single line bracket. --- src/anbox/cmds/session_manager.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/anbox/cmds/session_manager.cpp b/src/anbox/cmds/session_manager.cpp index af0bcec..165c043 100644 --- a/src/anbox/cmds/session_manager.cpp +++ b/src/anbox/cmds/session_manager.cpp @@ -176,9 +176,8 @@ anbox::cmds::SessionManager::SessionManager() input_manager, display_frame, single_window_); - if (!platform) { + if (!platform) return EXIT_FAILURE; - } auto app_db = std::make_shared(); From 785136fd3697c0b236d58b3d12fee429cb81ea1a Mon Sep 17 00:00:00 2001 From: Gianfranco Costamagna Date: Mon, 19 Mar 2018 11:46:59 +0100 Subject: [PATCH 16/20] GLESv2Imp: fix bad return statement android-emugl: add formatting strings to fprintf output, fixing possible security issue --- .../libs/Translator/GLES_V2/.GLESv2Imp.cpp.swp | Bin 16384 -> 0 bytes .../host/libs/Translator/GLES_V2/GLESv2Imp.cpp | 2 ++ .../android-emugl/host/tools/emugen/ApiGen.cpp | 3 +-- .../host/tools/emugen/EntryPoint.cpp | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) delete mode 100644 external/android-emugl/host/libs/Translator/GLES_V2/.GLESv2Imp.cpp.swp diff --git a/external/android-emugl/host/libs/Translator/GLES_V2/.GLESv2Imp.cpp.swp b/external/android-emugl/host/libs/Translator/GLES_V2/.GLESv2Imp.cpp.swp deleted file mode 100644 index 8102470c466227658d4ea2ddf8c32b58a732f10d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 LIglGetIntegerv(pname,params)) { if (destroyCtx) + { deleteGLESContext(ctx); return; + } } bool es2 = ctx->getCaps()->GL_ARB_ES2_COMPATIBILITY; diff --git a/external/android-emugl/host/tools/emugen/ApiGen.cpp b/external/android-emugl/host/tools/emugen/ApiGen.cpp index fc6c031..f912cb5 100644 --- a/external/android-emugl/host/tools/emugen/ApiGen.cpp +++ b/external/android-emugl/host/tools/emugen/ApiGen.cpp @@ -1158,8 +1158,7 @@ int ApiGen::genDecoderImpl(const std::string &filename) varoffset.c_str(), varoffset.c_str(), varoffset.c_str(), - classname.c_str(), - e->name().c_str() + classname.c_str() ); varoffset += " + 4"; diff --git a/external/android-emugl/host/tools/emugen/EntryPoint.cpp b/external/android-emugl/host/tools/emugen/EntryPoint.cpp index cc3bef1..8f91c83 100644 --- a/external/android-emugl/host/tools/emugen/EntryPoint.cpp +++ b/external/android-emugl/host/tools/emugen/EntryPoint.cpp @@ -99,7 +99,7 @@ bool EntryPoint::parse(unsigned int lc, const std::string & str) std::string vartype, varname; if (!parseParameterDeclaration(field, &vartype, &varname, &error)) { fprintf(stderr, - "line: %d: Parsing error in field <%s>\n", + "line: %d: Parsing error in field <%s>, error: %s\n", lc, field.c_str(), error.c_str()); From a02f2ab47c5dc331fe592cad20ee0c3afebda817 Mon Sep 17 00:00:00 2001 From: Gianfranco Costamagna Date: Mon, 19 Mar 2018 11:55:06 +0100 Subject: [PATCH 17/20] Add verbosity to build --- scripts/clean-build.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/clean-build.sh b/scripts/clean-build.sh index d1041a4..fb05249 100755 --- a/scripts/clean-build.sh +++ b/scripts/clean-build.sh @@ -55,9 +55,9 @@ cleanup mkdir build || rm -rf build/* cd build -cmake .. -make -j10 -make test +cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo +VERBOSE=1 make -j10 +VERBOSE=1 make test cd .. cleanup From df143a08f9ce5f94f680227d97fe95e803722ef4 Mon Sep 17 00:00:00 2001 From: Gianfranco Costamagna Date: Mon, 19 Mar 2018 11:55:43 +0100 Subject: [PATCH 18/20] Bump compat level to 9 and std-version to 4.1.3 --- debian/compat | 2 +- debian/control | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/debian/compat b/debian/compat index 7f8f011..ec63514 100644 --- a/debian/compat +++ b/debian/compat @@ -1 +1 @@ -7 +9 diff --git a/debian/control b/debian/control index 8696f8e..72e3872 100644 --- a/debian/control +++ b/debian/control @@ -2,8 +2,8 @@ Source: anbox Section: misc Priority: optional Maintainer: Simon Fels -Build-Depends: debhelper (>= 7), dkms, dh-systemd -Standards-Version: 3.9.7 +Build-Depends: debhelper (>= 9), dkms, dh-systemd +Standards-Version: 4.1.3 Homepage: http://anbox.io Vcs-Browser: https://github.com/anbox/anbox Vcs-Git: https://github.com/anbox/anbox.git From cfb336e17496561c86e591489712c2a60d6d1ea7 Mon Sep 17 00:00:00 2001 From: Gianfranco Costamagna Date: Mon, 14 May 2018 11:58:43 +0200 Subject: [PATCH 19/20] CMakeLists.txt: Default build type to RelWithDebInfo if none is defined --- CMakeLists.txt | 4 ++-- scripts/clean-build.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3901428..df9d6fe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,8 +5,8 @@ include(CTest) include(GNUInstallDirs) if (NOT CMAKE_BUILD_TYPE) - message(STATUS "No build type selected, default to release") - set(CMAKE_BUILD_TYPE "release") + message(STATUS "No build type selected, default to RelWithDebInfo") + set(CMAKE_BUILD_TYPE "RelWithDebInfo") endif() set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) diff --git a/scripts/clean-build.sh b/scripts/clean-build.sh index fb05249..3e1e766 100755 --- a/scripts/clean-build.sh +++ b/scripts/clean-build.sh @@ -55,7 +55,7 @@ cleanup mkdir build || rm -rf build/* cd build -cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo +cmake .. VERBOSE=1 make -j10 VERBOSE=1 make test cd .. From ceae29b2d2d126f2a6d38223face8ecae55b87d0 Mon Sep 17 00:00:00 2001 From: Simon Fels Date: Mon, 14 May 2018 06:09:13 +0200 Subject: [PATCH 20/20] emugl: limit set of extensions we expose to Android If we expose too many extensions we don't support ourself yet (like EGL_ANDROID_native_fence_sync) then we get unexpected corruption or missing screen updates in our rendered output. Fixes #635, #457, #692, #582 (and a few more duplicates) --- src/anbox/graphics/emugl/RenderControl.cpp | 98 +++++++++++++--------- 1 file changed, 58 insertions(+), 40 deletions(-) diff --git a/src/anbox/graphics/emugl/RenderControl.cpp b/src/anbox/graphics/emugl/RenderControl.cpp index 26e9559..2a2c453 100644 --- a/src/anbox/graphics/emugl/RenderControl.cpp +++ b/src/anbox/graphics/emugl/RenderControl.cpp @@ -26,9 +26,9 @@ #include "external/android-emugl/shared/OpenglCodecCommon/ChecksumCalculatorThreadInfo.h" #include "external/android-emugl/host/include/OpenGLESDispatch/EGLDispatch.h" - #include #include +#include static const GLint rendererVersion = 1; static std::shared_ptr composer; @@ -55,53 +55,61 @@ static EGLint rcGetEGLVersion(EGLint *major, EGLint *minor) { return EGL_TRUE; } -static EGLint rcQueryEGLString(EGLenum name, void *buffer, EGLint bufferSize) { +static std::string filter_extensions(const std::string& extensions, const std::vector& whitelist) { + std::stringstream approved_extensions; + auto extension_list = anbox::utils::string_split(extensions, ' '); + for (const auto& ext : extension_list) { + if (std::find(whitelist.begin(), whitelist.end(), ext) == whitelist.end()) + continue; + + if (approved_extensions.tellp() > 0) + approved_extensions << " "; + + approved_extensions << ext; + } + return approved_extensions.str(); +} + +static EGLint rcQueryEGLString(EGLenum name, void* buffer, EGLint bufferSize) { if (!renderer) return 0; - auto result = s_egl.eglQueryString(renderer->getDisplay(), name); - if (!result) + std::string result = s_egl.eglQueryString(renderer->getDisplay(), name); + if (result.empty()) return 0; - std::string approved_result = result; - - // We need to drop a few extensions from the list reported by the driver - // as not all are well enough support by our EGL/GLES stack. if (name == EGL_EXTENSIONS) { - std::vector common_unsupported_extensions = { - // Leads to crashes on the Android side when SurfaceFlinger initializes - // EGL/GLES and it queries surfaces for available attributes. - "EGL_EXT_buffer_age" + // We need to drop a few extensions from the list reported by the driver + // as not all are well enough support by our EGL implementation. + std::vector whitelisted_extensions = { + "EGL_KHR_image_base", + "EGL_KHR_gl_texture_2D_image", }; - - for (const auto &extension : common_unsupported_extensions) { - size_t start_pos = approved_result.find(extension); - if (start_pos == std::string::npos) continue; - approved_result.replace(start_pos, extension.length(), ""); - } + result = filter_extensions(result, whitelisted_extensions); } - int len = approved_result.length() + 1; + int len = result.length() + 1; if (!buffer || len > bufferSize) { return -len; } - strcpy(static_cast(buffer), approved_result.c_str()); + strcpy(static_cast(buffer), result.c_str()); return len; } -static EGLint rcGetGLString(EGLenum name, void *buffer, EGLint bufferSize) { - RenderThreadInfo *tInfo = RenderThreadInfo::get(); +static EGLint rcGetGLString(EGLenum name, void* buffer, EGLint bufferSize) { + RenderThreadInfo* tInfo = RenderThreadInfo::get(); std::string result; if (tInfo && tInfo->currContext) { - const char *str = nullptr; + const char* str = nullptr; if (tInfo->currContext->isGL2()) - str = reinterpret_cast(s_gles2.glGetString(name)); + str = reinterpret_cast(s_gles2.glGetString(name)); else - str = reinterpret_cast(s_gles1.glGetString(name)); + str = reinterpret_cast(s_gles1.glGetString(name)); - if (str) result += str; + if (str) + result += str; } // We're forcing version 2.0 no matter what the host provides as @@ -113,27 +121,37 @@ static EGLint rcGetGLString(EGLenum name, void *buffer, EGLint bufferSize) { if (name == GL_VERSION) result = "OpenGL ES 2.0"; else if (name == GL_EXTENSIONS) { - std::string approved_extensions = result; - std::vector unsupported_extensions = { - // Leaving this enabled gives crippeled text rendering when - // using the host mesa GLES drivers. - "GL_EXT_unpack_subimage", + // We need to drop a few extensions from the list reported by the driver + // as not all are well enough support by our GL implementation. + std::vector whitelisted_extensions = { + "GL_OES_EGL_image", + "GL_OES_EGL_image_external", + "GL_OES_depth24", + "GL_OES_depth32", + "GL_OES_element_index_uint", + "GL_OES_texture_float", + "GL_OES_texture_float_linear", + "GL_OES_compressed_paletted_texture", + "GL_OES_compressed_ETC1_RGB8_texture", + "GL_OES_depth_texture", + "GL_OES_texture_half_float", + "GL_OES_texture_half_float_linear", + "GL_OES_packed_depth_stencil", + "GL_OES_vertex_half_float", + "GL_OES_standard_derivatives", + "GL_OES_texture_npot", + "GL_OES_rgb8_rgba8", }; - for (const auto &extension : unsupported_extensions) { - size_t start_pos = approved_extensions.find(extension); - if (start_pos == std::string::npos) continue; - approved_extensions.replace(start_pos, extension.length(), ""); - } - - result = approved_extensions; + result = filter_extensions(result, whitelisted_extensions); } int nextBufferSize = result.size() + 1; - if (!buffer || nextBufferSize > bufferSize) return -nextBufferSize; + if (!buffer || nextBufferSize > bufferSize) + return -nextBufferSize; - snprintf(static_cast(buffer), nextBufferSize, "%s", result.c_str()); + snprintf(static_cast(buffer), nextBufferSize, "%s", result.c_str()); return nextBufferSize; }