From f633d641c21f45e46aa9585fc38389da033c0212 Mon Sep 17 00:00:00 2001 From: "Sarang S. Dalal" Date: Sun, 29 Oct 2017 10:23:31 +0100 Subject: [PATCH 01/31] replace deprecated vfs_read with kernel_read See https://github.com/anbox/anbox/issues/486 and related issue with ashmem and ZFS: https://github.com/zfsonlinux/spl/issues/656 --- kernel/ashmem/ashmem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/ashmem/ashmem.c b/kernel/ashmem/ashmem.c index c846db6..4fde1d7 100644 --- a/kernel/ashmem/ashmem.c +++ b/kernel/ashmem/ashmem.c @@ -313,7 +313,7 @@ static ssize_t ashmem_read(struct file *file, char __user *buf, * be destroyed until all references to the file are dropped and * ashmem_release is called. */ - ret = __vfs_read(asma->file, buf, len, pos); + ret = kernel_read(asma->file, buf, len, pos); if (ret >= 0) /** Update backing file pos, since f_ops->read() doesn't */ asma->file->f_pos = *pos; From 1c7eef1fd364b6289972ef0487fc3a303d28f378 Mon Sep 17 00:00:00 2001 From: Lee Jones Date: Fri, 17 Nov 2017 12:24:20 +0000 Subject: [PATCH 02/31] anbox: qemu: qemud_message_processor: Handle multiple 'cat'ed messages It is possible for more than one message to be delivered concurrently. When this happens, messages are concatenated together (end-to-end). Current code errors out if the total received data is larger than the known header_size (4) + the body size (reported in the header). However, when >=2 messages arrive at the same time, the total received data will be far greater than this. The current code base actually handles multiple messages perfectly already, so all we need to do is remove the early return and everything "just works". Signed-off-by: Lee Jones --- src/anbox/qemu/qemud_message_processor.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/anbox/qemu/qemud_message_processor.cpp b/src/anbox/qemu/qemud_message_processor.cpp index c9d5b50..d9ee009 100644 --- a/src/anbox/qemu/qemud_message_processor.cpp +++ b/src/anbox/qemu/qemud_message_processor.cpp @@ -51,7 +51,6 @@ void QemudMessageProcessor::process_commands() { unsigned int body_size = 0; ::sscanf(header, "%04x", &body_size); - if (body_size != buffer_.size() - header_size) break; std::string command; // Make sure we only copy as much bytes as we have to and not more From 2e632eb41c553448ec2e0d3b4cbbd45960aaea23 Mon Sep 17 00:00:00 2001 From: MatthiasSchuster Date: Sat, 9 Dec 2017 23:36:57 +0100 Subject: [PATCH 03/31] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a1a54f0..9639b5a 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,7 @@ $ anbox-installer This will guide you through the installation process. -**NOTE:** Anbox is currently in a **pre-alpha development state**. Don't expect a +**NOTE:** Anbox is currently in a **alpha development state**. Don't expect a fully working system for a production system with all features you need. You will for sure see bugs and crashes. If you do so, please don't hestitate and report them! From 642330e22c367458ece2fe11dce68082d42e1d2b Mon Sep 17 00:00:00 2001 From: step21 Date: Thu, 4 Jan 2018 21:06:43 +0100 Subject: [PATCH 04/31] python 3 compatible --- scripts/gen-emugl-entries.py | 184 ++++++++++++++++++----------------- 1 file changed, 94 insertions(+), 90 deletions(-) diff --git a/scripts/gen-emugl-entries.py b/scripts/gen-emugl-entries.py index a122ef7..851dbe7 100755 --- a/scripts/gen-emugl-entries.py +++ b/scripts/gen-emugl-entries.py @@ -128,28 +128,28 @@ def gen_functions_header(entries, prefix_name, verbatim, filename, with_args): """ prefix_name = prefix_name.upper() - print "// Auto-generated with: %s" % banner_command(sys.argv) - print "// DO NOT EDIT THIS FILE" - print "" - print "#ifndef %s_FUNCTIONS_H" % prefix_name - print "#define %s_FUNCTIONS_H" % prefix_name - print "" + print("// Auto-generated with: %s" % banner_command(sys.argv)) + print("// DO NOT EDIT THIS FILE") + print("") + print("#ifndef %s_FUNCTIONS_H" % prefix_name) + print("#define %s_FUNCTIONS_H" % prefix_name) + print("") for line in verbatim: - print line + print(line) - print "#define LIST_%s_FUNCTIONS(X) \\" % prefix_name + print("#define LIST_%s_FUNCTIONS(X) \\" % prefix_name) for entry in entries: if with_args: - print " X(%s, %s, (%s), (%s)) \\" % \ + print(" X(%s, %s, (%s), (%s)) \\" % \ (entry.return_type, entry.func_name, entry.parameters, - entry.call) + entry.call)) else: - print " X(%s, %s, (%s)) \\" % \ - (entry.return_type, entry.func_name, entry.parameters) + print(" X(%s, %s, (%s)) \\" % \ + (entry.return_type, entry.func_name, entry.parameters)) - print "" - print "" - print "#endif // %s_FUNCTIONS_H" % prefix_name + print("") + print("") + print("#endif // %s_FUNCTIONS_H" % prefix_name) @@ -199,10 +199,10 @@ def gen_translator(entries): "glProgramUniform3ui": 1, "glProgramUniform4ui": 1, "glBindVertexBuffer": 1, - }; + } translator_nocontext_fail_codes = { "glClientWaitSync" : "GL_WAIT_FAILED", - }; + } def needExternC(entry): if translator_needexternc.has_key(entry.func_name): return "extern \"C\" " @@ -210,14 +210,14 @@ def gen_translator(entries): return "" def get_fail_code(entry): if translator_nocontext_fail_codes.has_key(entry.func_name): - return translator_nocontext_fail_codes[entry.func_name]; + return translator_nocontext_fail_codes[entry.func_name] else: return "0" def gen_cxt_getter(entry): if (entry.return_type == "void"): - print " GET_CTX_V2();" + print(" GET_CTX_V2();") else: - print " GET_CTX_V2_RET(%s);" % get_fail_code(entry) + print(" GET_CTX_V2_RET(%s);" % get_fail_code(entry)) def gen_validations_custom_impl(entry): isGen = entry.func_name.startswith("glGen") @@ -231,14 +231,14 @@ def gen_translator(entries): if entry.return_type == "void": return "SET_ERROR_IF(%s,%s)" % (condition, glerr); else: - return "RET_AND_SET_ERROR_IF(%s,%s,%s)" % (condition, glerr, get_fail_code(entry)); + return "RET_AND_SET_ERROR_IF(%s,%s,%s)" % (condition, glerr, get_fail_code(entry)) if (isGen or isDelete) and ("n" in entry.varnames): - print " %s;" % mySetError("n < 0", "GL_INVALID_VALUE"); + print(" %s;" % mySetError("n < 0", "GL_INVALID_VALUE")) if (isBufferOp and hasTargetArg): - print " %s;" % mySetError("!GLESv2Validate::bufferTarget(ctx, target)", "GL_INVALID_ENUM"); + print(" %s;" % mySetError("!GLESv2Validate::bufferTarget(ctx, target)", "GL_INVALID_ENUM")) if translator_custom_pre.has_key(entry.func_name): - print translator_custom_pre[entry.func_name], + print(translator_custom_pre[entry.func_name],) def gen_call_ret(entry): globalNameTypes = { @@ -262,53 +262,53 @@ def gen_translator(entries): needsShareGroup = True if needsShareGroup: - print " if (ctx->shareGroup().get()) {" + print(" if (ctx->shareGroup().get()) {") for key in zip(entry.vartypes, entry.varnames): vartype, varname = key if globalNames.has_key(key): - print " const GLuint %s = ctx->shareGroup()->getGlobalName(%s, %s);" % (globalNames[key], globalNameTypes[key], varname) + print(" const GLuint %s = ctx->shareGroup()->getGlobalName(%s, %s);" % (globalNames[key], globalNameTypes[key], varname)) globalCall = ", ".join(map(lambda k: globalNames.get(k, k[1]), zip(entry.vartypes, entry.varnames))) if needsShareGroup and translator_custom_share_processing.has_key(entry.func_name): - print translator_custom_share_processing[entry.func_name], + print(translator_custom_share_processing[entry.func_name]) if (entry.return_type == "void"): if (needsShareGroup): - print " ", + print(" "), if not translator_no_passthrough.has_key(entry.func_name): - print " ctx->dispatcher().%s(%s);" % (entry.func_name, globalCall) + print(" ctx->dispatcher().%s(%s);" % (entry.func_name, globalCall)) if needsShareGroup: - print " }" + print(" }") if translator_custom_post.has_key(entry.func_name): - print translator_custom_post[entry.func_name]; + print(translator_custom_post[entry.func_name]) else: if (needsShareGroup): - print " ", + print(" "), if not translator_no_passthrough.has_key(entry.func_name): - print " %s %s = ctx->dispatcher().%s(%s);" % (entry.return_type, entry.func_name + "RET", entry.func_name, globalCall) + print(" %s %s = ctx->dispatcher().%s(%s);" % (entry.return_type, entry.func_name + "RET", entry.func_name, globalCall)) else: - print " %s %s = %s" % (entry.return_type, entry_func_name + "RET", get_fail_code(entry)) + print(") %s %s = %s" % (entry.return_type, entry_func_name + "RET", get_fail_code(entry))) if translator_custom_post.has_key(entry.func_name): - print translator_custom_post[entry.func_name]; + print(translator_custom_post[entry.func_name]) - print " return %s;" % (entry.func_name + "RET"); + print(" return %s;" % (entry.func_name + "RET")) if needsShareGroup: - print " } else return %s;" % (get_fail_code(entry)) + print(" } else return %s;" % (get_fail_code(entry))) - print "// Auto-generated with: %s" % banner_command(sys.argv) - print "// This file is best left unedited." - print "// Try to make changes through gen_translator in gen-entries.py," - print "// and/or parcel out custom functionality in separate code." + print("// Auto-generated with: %s" % banner_command(sys.argv)) + print("// This file is best left unedited.") + print("// Try to make changes through gen_translator in gen-entries.py,") + print("// and/or parcel out custom functionality in separate code.") for entry in entries: - print "%sGL_APICALL %s GL_APIENTRY %s(%s) {" % (needExternC(entry), entry.return_type, entry.func_name, entry.parameters) - gen_cxt_getter(entry); - gen_validations_custom_impl(entry); - gen_call_ret(entry); - print "}\n" + print("%sGL_APICALL %s GL_APIENTRY %s(%s) {" % (needExternC(entry), entry.return_type, entry.func_name, entry.parameters)) + gen_cxt_getter(entry) + gen_validations_custom_impl(entry) + gen_call_ret(entry) + print("}\n") def gen_dll_wrapper(entries, prefix_name, verbatim, filename): """Generate a C source file that contains functions that act as wrappers @@ -322,77 +322,77 @@ def gen_dll_wrapper(entries, prefix_name, verbatim, filename): ENTRY_PREFIX = "__dll_" - print "// Auto-generated with: %s" % banner_command(sys.argv) - print "// DO NOT EDIT THIS FILE" - print "" - print "#include " + print("// Auto-generated with: %s" % banner_command(sys.argv)) + print("// DO NOT EDIT THIS FILE") + print("") + print("#include ") for line in verbatim: - print line + print(line) - print "" - print "///" - print "/// W R A P P E R P O I N T E R S" - print "///" - print "" + print("") + print("///") + print("/// W R A P P E R P O I N T E R S") + print("///") + print("") for entry in entries: ptr_name = ENTRY_PREFIX + entry.func_name - print "static %s (*%s)(%s) = 0;" % \ - (entry.return_type, ptr_name, entry.parameters) + print("static %s (*%s)(%s) = 0;" % \ + (entry.return_type, ptr_name, entry.parameters)) - print "" - print "///" - print "/// W R A P P E R F U N C T I O N S" - print "///" - print "" + print("") + print("///") + print("/// W R A P P E R F U N C T I O N S") + print("///") + print("") for entry in entries: - print "%s %s(%s) {" % \ - (entry.return_type, entry.func_name, entry.parameters) + print ("%s %s(%s) {" % \ + (entry.return_type, entry.func_name, entry.parameters)) ptr_name = ENTRY_PREFIX + entry.func_name if entry.return_type != "void": - print " return %s(%s);" % (ptr_name, entry.call) + print(" return %s(%s);" % (ptr_name, entry.call)) else: - print " %s(%s);" % (ptr_name, entry.call) - print "}\n" + print(" %s(%s);" % (ptr_name, entry.call)) + print("}\n") - print "" - print "///" - print "/// I N I T I A L I Z A T I O N F U N C T I O N" - print "///" - print "" + print("") + print("///") + print("/// I N I T I A L I Z A T I O N F U N C T I O N") + print("///") + print("") - print "int %s_dynlink_init(void* lib) {" % prefix_name + print("int %s_dynlink_init(void* lib) {" % prefix_name) for entry in entries: ptr_name = ENTRY_PREFIX + entry.func_name - print " %s = (%s(*)(%s))dlsym(lib, \"%s\");" % \ + print(" %s = (%s(*)(%s))dlsym(lib, \"%s\");" % \ (ptr_name, entry.return_type, entry.parameters, - entry.func_name) - print " if (!%s) return -1;" % ptr_name - print " return 0;" - print "}" + entry.func_name)) + print(" if (!%s) return -1;" % ptr_name) + print(" return 0;") + print("}") def gen_windows_def_file(entries): """Generate a windows DLL .def file. |entries| is a list of Entry instances. """ - print "EXPORTS" + print("EXPORTS") for entry in entries: - print " %s" % entry.func_name + print(" %s" % entry.func_name) def gen_unix_sym_file(entries): """Generate an ELF linker version file. |entries| is a list of Entry instances. """ - print "VERSION {" - print "\tglobal:" + print("VERSION {") + print("\tglobal:") for entry in entries: - print "\t\t%s;" % entry.func_name - print "\tlocal:" - print "\t\t*;" - print "};" + print("\t\t%s;" % entry.func_name) + print("\tlocal:") + print("\t\t*;") + print("};") def gen_symbols(entries, underscore): """Generate a list of symbols from |entries|, a list of Entry instances. @@ -403,7 +403,7 @@ def gen_symbols(entries, underscore): if underscore: prefix = "_" for entry in entries: - print "%s%s" % (prefix, entry.func_name) + print("%s%s" % (prefix, entry.func_name)) def parse_file(filename, lines, mode): """Generate one of possible outputs from |filename|. |lines| must be a list @@ -413,7 +413,9 @@ def parse_file(filename, lines, mode): entries, prefix_name, verbatim, errors = parse_entries_file(lines) if errors: for error in errors: - print >> sys.stderr, "ERROR: %s:%s" % (filename, error) + print("ERROR: %s:%s" % (filename, error)) + #FIXME + #print >> sys.stderr, "ERROR: %s:%s" % (filename, error) sys.exit(1) if not prefix_name: @@ -466,7 +468,9 @@ parser.add_argument("file", help=".entries file path") args = parser.parse_args() if not args.mode: - print >> sys.stderr, "ERROR: Please use --mode=, see --help." + print("ERROR: Please use --mode=, see --help.") + #FIXME + #print >> sys.stderr, "ERROR: Please use --mode=, see --help." sys.exit(1) if args.output: From 3882f3bfa50b6360784d886605bdebd36a1f8ecb Mon Sep 17 00:00:00 2001 From: step21 Date: Fri, 5 Jan 2018 15:29:32 +0100 Subject: [PATCH 05/31] fixed sys.stderr --- scripts/gen-emugl-entries.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/scripts/gen-emugl-entries.py b/scripts/gen-emugl-entries.py index 851dbe7..d651fb2 100755 --- a/scripts/gen-emugl-entries.py +++ b/scripts/gen-emugl-entries.py @@ -25,6 +25,7 @@ # # Anything else is an error. +from __future__ import print_function import re import sys import argparse @@ -32,6 +33,9 @@ import argparse re_func = re.compile(r"""^(.*[\* ])([A-Za-z_][A-Za-z0-9_]*)\((.*)\);$""") re_param = re.compile(r"""^(.*[\* ])([A-Za-z_][A-Za-z0-9_]*)$""") +def eprint(*args, **kwargs): + print(*args, file=sys.stderr, **kwargs) + class Entry: """Small class used to model a single DLL entry point.""" def __init__(self, func_name, return_type, parameters): @@ -413,9 +417,7 @@ def parse_file(filename, lines, mode): entries, prefix_name, verbatim, errors = parse_entries_file(lines) if errors: for error in errors: - print("ERROR: %s:%s" % (filename, error)) - #FIXME - #print >> sys.stderr, "ERROR: %s:%s" % (filename, error) + eprint("ERROR: %s:%s" % (filename, error), file=sys.stderr) sys.exit(1) if not prefix_name: @@ -468,9 +470,7 @@ parser.add_argument("file", help=".entries file path") args = parser.parse_args() if not args.mode: - print("ERROR: Please use --mode=, see --help.") - #FIXME - #print >> sys.stderr, "ERROR: Please use --mode=, see --help." + eprint("ERROR: Please use --mode=, see --help.", file=sys.stderr) sys.exit(1) if args.output: From 0af5a76743717abb1c5ecf0f9baf85085a90af40 Mon Sep 17 00:00:00 2001 From: "Sarang S. Dalal" Date: Tue, 23 Jan 2018 00:18:18 +0100 Subject: [PATCH 06/31] added kernel version check for calling kernel_read vs vfs_read added kernel version check for calling kernel_read vs vfs_read, as suggested here: https://github.com/Asmodee-Box/anbox/commit/55d56994295eae827421a5fffc7ec2370af6015e --- kernel/ashmem/ashmem.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/kernel/ashmem/ashmem.c b/kernel/ashmem/ashmem.c index 4fde1d7..dd15960 100644 --- a/kernel/ashmem/ashmem.c +++ b/kernel/ashmem/ashmem.c @@ -313,7 +313,11 @@ static ssize_t ashmem_read(struct file *file, char __user *buf, * be destroyed until all references to the file are dropped and * ashmem_release is called. */ - ret = kernel_read(asma->file, buf, len, pos); + #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 9, 0) + ret = __vfs_read(asma->file, buf, len, pos); + #else + ret = kernel_read(asma->file, buf, len, pos); + #endif if (ret >= 0) /** Update backing file pos, since f_ops->read() doesn't */ asma->file->f_pos = *pos; From ba3ae093ed16b76e2a787ae1fb5824ee8d0a6f7f Mon Sep 17 00:00:00 2001 From: "Sarang S. Dalal" Date: Tue, 23 Jan 2018 00:58:08 +0100 Subject: [PATCH 07/31] add comment to explain kernel_read --- kernel/ashmem/ashmem.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kernel/ashmem/ashmem.c b/kernel/ashmem/ashmem.c index dd15960..1831493 100644 --- a/kernel/ashmem/ashmem.c +++ b/kernel/ashmem/ashmem.c @@ -312,6 +312,8 @@ static ssize_t ashmem_read(struct file *file, char __user *buf, * once asma->file is set it will never be changed, and will not * be destroyed until all references to the file are dropped and * ashmem_release is called. + * + * kernel_read supersedes vfs_read from kernel version 3.9 */ #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 9, 0) ret = __vfs_read(asma->file, buf, len, pos); From 6d50d440834adbe9e1ca0d35452ea271ed72f308 Mon Sep 17 00:00:00 2001 From: Lee Jones Date: Wed, 31 Jan 2018 08:51:32 +0000 Subject: [PATCH 08/31] android: service: platform_service: Read rotation angle from parcel When passing window state, currently only the frame location and stack & task IDs are contained in the parcel. This patch also receives the new 'rotation_angle' attribute. This patch is critical since it ensures each '4 Byte' value in this strongly ordered sequence is extracted at the right time, in the correct way. Signed-off-by: Lee Jones --- android/service/platform_service.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/android/service/platform_service.cpp b/android/service/platform_service.cpp index 8e2c57a..0a19818 100644 --- a/android/service/platform_service.cpp +++ b/android/service/platform_service.cpp @@ -49,6 +49,7 @@ anbox::PlatformApiStub::WindowStateUpdate::Window PlatformService::unpack_window auto frame_bottom = data.readInt32(); auto task_id = data.readInt32(); auto stack_id = data.readInt32(); + auto rotation_angle = data.readInt32(); return anbox::PlatformApiStub::WindowStateUpdate::Window{ -1, // Display id will be added by the caller From 5e7d773d82251d78f1799a62deb0fe76d380fdeb Mon Sep 17 00:00:00 2001 From: Han Pengfei Date: Thu, 1 Feb 2018 14:46:45 +0800 Subject: [PATCH 09/31] 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 10/31] 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 5d3284cb14c9c97fcd6bdb71e0c7a525ae5d83c8 Mon Sep 17 00:00:00 2001 From: Filip Stedronsky Date: Thu, 1 Feb 2018 12:35:34 +0100 Subject: [PATCH 11/31] Fix compatibility with Boost 1.66 Do not use deprecated native() method. --- src/anbox/network/base_socket_messenger.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/anbox/network/base_socket_messenger.cpp b/src/anbox/network/base_socket_messenger.cpp index fb093f3..23efc78 100644 --- a/src/anbox/network/base_socket_messenger.cpp +++ b/src/anbox/network/base_socket_messenger.cpp @@ -138,7 +138,7 @@ unsigned short BaseSocketMessenger::local_port() const { template void BaseSocketMessenger::set_no_delay() { - const auto fd = socket->native(); + const auto fd = socket->native_handle(); int flag = 1; const auto ret = ::setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, From 15803e186865217689bbc8a15e611f78b033abc4 Mon Sep 17 00:00:00 2001 From: Han Pengfei Date: Thu, 1 Feb 2018 15:00:23 +0800 Subject: [PATCH 12/31] 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 13/31] 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 633b4ddb374eeef2af25d991c4a7af8b03d55616 Mon Sep 17 00:00:00 2001 From: Mustafa Kuscu Date: Sun, 11 Feb 2018 01:44:08 +0300 Subject: [PATCH 14/31] fix argument in binder_set_stop_on_user_error binder_set_stop_on_user_error second argument breaks build. --- kernel/binder/binder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/binder/binder.c b/kernel/binder/binder.c index fb939e6..f904646 100644 --- a/kernel/binder/binder.c +++ b/kernel/binder/binder.c @@ -137,7 +137,7 @@ static DECLARE_WAIT_QUEUE_HEAD(binder_user_error_wait); static int binder_stop_on_user_error; static int binder_set_stop_on_user_error(const char *val, - struct kernel_param *kp) + const struct kernel_param *kp) { int ret; From f17433117097222298f4f68a16da90b596265fbb Mon Sep 17 00:00:00 2001 From: Mustafa Kuscu Date: Mon, 12 Feb 2018 11:17:06 +0300 Subject: [PATCH 15/31] make the patch specific to kernel 4.15 and later The change starts with kernel 4.15. --- kernel/binder/binder.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/kernel/binder/binder.c b/kernel/binder/binder.c index f904646..9ccadf1 100644 --- a/kernel/binder/binder.c +++ b/kernel/binder/binder.c @@ -137,7 +137,11 @@ static DECLARE_WAIT_QUEUE_HEAD(binder_user_error_wait); static int binder_stop_on_user_error; static int binder_set_stop_on_user_error(const char *val, +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0) const struct kernel_param *kp) +#else + struct kernel_param *kp) +#endif { int ret; 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 16/31] 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 17/31] 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 18/31] 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 19/31] 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 20/31] 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 21/31] 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 22/31] 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 23/31] 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 24/31] 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 25/31] 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 26/31] 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 27/31] 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 28/31] 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 29/31] 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 30/31] 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 31/31] 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; }