Merge "remove vr/libeds" into oc-dev
diff --git a/cmds/installd/InstalldNativeService.cpp b/cmds/installd/InstalldNativeService.cpp
index 19dfb87..a0d987d 100644
--- a/cmds/installd/InstalldNativeService.cpp
+++ b/cmds/installd/InstalldNativeService.cpp
@@ -1100,10 +1100,13 @@
ALOGV("unlink %s\n", dex_path);
if (unlink(dex_path) < 0) {
- return error(StringPrintf("Failed to unlink %s", dex_path));
- } else {
- return ok();
+ // It's ok if we don't have a dalvik cache path. Report error only when the path exists
+ // but could not be unlinked.
+ if (errno != ENOENT) {
+ return error(StringPrintf("Failed to unlink %s", dex_path));
+ }
}
+ return ok();
}
struct stats {
diff --git a/cmds/installd/tests/installd_service_test.cpp b/cmds/installd/tests/installd_service_test.cpp
index 4a1f333..34818f6 100644
--- a/cmds/installd/tests/installd_service_test.cpp
+++ b/cmds/installd/tests/installd_service_test.cpp
@@ -54,10 +54,12 @@
return false;
}
-bool create_cache_path(char path[PKG_PATH_MAX] ATTRIBUTE_UNUSED,
- const char *src ATTRIBUTE_UNUSED,
- const char *instruction_set ATTRIBUTE_UNUSED) {
- return false;
+bool create_cache_path(char path[PKG_PATH_MAX],
+ const char *src,
+ const char *instruction_set) {
+ // Not really a valid path but it's good enough for testing.
+ sprintf(path,"/data/dalvik-cache/%s/%s", instruction_set, src);
+ return true;
}
static void mkdir(const char* path, uid_t owner, gid_t group, mode_t mode) {
@@ -151,5 +153,13 @@
EXPECT_EQ(10000, stat_gid("com.example/bar/file"));
}
+TEST_F(ServiceTest, RmDexNoDalvikCache) {
+ LOG(INFO) << "RmDexNoDalvikCache";
+
+ // Try to remove a non existing dalvik cache dex. The call should be
+ // successful because there's nothing to remove.
+ EXPECT_TRUE(service->rmdex("com.example", "arm").isOk());
+}
+
} // namespace installd
} // namespace android
diff --git a/libs/vr/libbufferhubqueue/buffer_hub_queue_producer.cpp b/libs/vr/libbufferhubqueue/buffer_hub_queue_producer.cpp
index 0a36156..435cba4 100644
--- a/libs/vr/libbufferhubqueue/buffer_hub_queue_producer.cpp
+++ b/libs/vr/libbufferhubqueue/buffer_hub_queue_producer.cpp
@@ -140,10 +140,10 @@
LocalHandle fence;
auto buffer_status =
core_->producer_->Dequeue(core_->dequeue_timeout_ms_, &slot, &fence);
- if (!buffer_producer)
- return NO_MEMORY;
buffer_producer = buffer_status.take();
+ if (!buffer_producer)
+ return NO_MEMORY;
if (width == buffer_producer->width() &&
height == buffer_producer->height() &&
diff --git a/libs/vr/libpdx_uds/client_channel_factory.cpp b/libs/vr/libpdx_uds/client_channel_factory.cpp
index 850c6d3..433f459 100644
--- a/libs/vr/libpdx_uds/client_channel_factory.cpp
+++ b/libs/vr/libpdx_uds/client_channel_factory.cpp
@@ -60,7 +60,7 @@
bool connected = socket_.IsValid();
if (!connected) {
- socket_.Reset(socket(AF_UNIX, SOCK_STREAM, 0));
+ socket_.Reset(socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0));
LOG_ALWAYS_FATAL_IF(
endpoint_path_.empty(),
"ClientChannelFactory::Connect: unspecified socket path");
@@ -123,6 +123,15 @@
connected = true;
ALOGD("ClientChannelFactory: Connected successfully to %s...",
remote.sun_path);
+ ChannelConnectionInfo<LocalHandle> connection_info;
+ status = ReceiveData(socket_.Borrow(), &connection_info);
+ if (!status)
+ return status.error_status();
+ socket_ = std::move(connection_info.channel_fd);
+ if (!socket_) {
+ ALOGE("ClientChannelFactory::Connect: Failed to obtain channel socket");
+ return ErrorStatus(EIO);
+ }
}
if (use_timeout)
now = steady_clock::now();
@@ -132,11 +141,11 @@
InitRequest(&request, opcodes::CHANNEL_OPEN, 0, 0, false);
status = SendData(socket_.Borrow(), request);
if (!status)
- return ErrorStatus(status.error());
+ return status.error_status();
ResponseHeader<LocalHandle> response;
status = ReceiveData(socket_.Borrow(), &response);
if (!status)
- return ErrorStatus(status.error());
+ return status.error_status();
int ref = response.ret_code;
if (ref < 0 || static_cast<size_t>(ref) > response.file_descriptors.size())
return ErrorStatus(EIO);
diff --git a/libs/vr/libpdx_uds/private/uds/ipc_helper.h b/libs/vr/libpdx_uds/private/uds/ipc_helper.h
index 5b7e5ff..bde16d3 100644
--- a/libs/vr/libpdx_uds/private/uds/ipc_helper.h
+++ b/libs/vr/libpdx_uds/private/uds/ipc_helper.h
@@ -116,6 +116,15 @@
};
template <typename FileHandleType>
+class ChannelConnectionInfo {
+ public:
+ FileHandleType channel_fd;
+
+ private:
+ PDX_SERIALIZABLE_MEMBERS(ChannelConnectionInfo, channel_fd);
+};
+
+template <typename FileHandleType>
class RequestHeader {
public:
int32_t op{0};
diff --git a/libs/vr/libpdx_uds/private/uds/service_endpoint.h b/libs/vr/libpdx_uds/private/uds/service_endpoint.h
index eb87827..368891c 100644
--- a/libs/vr/libpdx_uds/private/uds/service_endpoint.h
+++ b/libs/vr/libpdx_uds/private/uds/service_endpoint.h
@@ -142,6 +142,8 @@
BorrowedHandle GetChannelSocketFd(int32_t channel_id);
BorrowedHandle GetChannelEventFd(int32_t channel_id);
int32_t GetChannelId(const BorrowedHandle& channel_fd);
+ Status<void> CreateChannelSocketPair(LocalHandle* local_socket,
+ LocalHandle* remote_socket);
std::string endpoint_path_;
bool is_blocking_;
diff --git a/libs/vr/libpdx_uds/service_endpoint.cpp b/libs/vr/libpdx_uds/service_endpoint.cpp
index 6c92259..d96eeff 100644
--- a/libs/vr/libpdx_uds/service_endpoint.cpp
+++ b/libs/vr/libpdx_uds/service_endpoint.cpp
@@ -214,30 +214,42 @@
sockaddr_un remote;
socklen_t addrlen = sizeof(remote);
- LocalHandle channel_fd{accept4(socket_fd_.Get(),
- reinterpret_cast<sockaddr*>(&remote), &addrlen,
- SOCK_CLOEXEC)};
- if (!channel_fd) {
+ LocalHandle connection_fd{accept4(socket_fd_.Get(),
+ reinterpret_cast<sockaddr*>(&remote),
+ &addrlen, SOCK_CLOEXEC)};
+ if (!connection_fd) {
ALOGE("Endpoint::AcceptConnection: failed to accept connection: %s",
strerror(errno));
return ErrorStatus(errno);
}
- int optval = 1;
- if (setsockopt(channel_fd.Get(), SOL_SOCKET, SO_PASSCRED, &optval,
- sizeof(optval)) == -1) {
- ALOGE(
- "Endpoint::AcceptConnection: Failed to enable the receiving of the "
- "credentials for channel %d: %s",
- channel_fd.Get(), strerror(errno));
- return ErrorStatus(errno);
+ LocalHandle local_socket;
+ LocalHandle remote_socket;
+ auto status = CreateChannelSocketPair(&local_socket, &remote_socket);
+ if (!status)
+ return status;
+
+ // Borrow the local channel handle before we move it into OnNewChannel().
+ BorrowedHandle channel_handle = local_socket.Borrow();
+ status = OnNewChannel(std::move(local_socket));
+ if (!status)
+ return status;
+
+ // Send the channel socket fd to the client.
+ ChannelConnectionInfo<LocalHandle> connection_info;
+ connection_info.channel_fd = std::move(remote_socket);
+ status = SendData(connection_fd.Borrow(), connection_info);
+
+ if (status) {
+ // Get the CHANNEL_OPEN message from client over the channel socket.
+ status = ReceiveMessageForChannel(channel_handle, message);
+ } else {
+ CloseChannel(GetChannelId(channel_handle));
}
- // Borrow the channel handle before we pass (move) it into OnNewChannel().
- BorrowedHandle borrowed_channel_handle = channel_fd.Borrow();
- auto status = OnNewChannel(std::move(channel_fd));
- if (status)
- status = ReceiveMessageForChannel(borrowed_channel_handle, message);
+ // Don't need the connection socket anymore. Further communication should
+ // happen over the channel socket.
+ shutdown(connection_fd.Get(), SHUT_WR);
return status;
}
@@ -349,29 +361,41 @@
return ErrorStatus{EINVAL};
}
+Status<void> Endpoint::CreateChannelSocketPair(LocalHandle* local_socket,
+ LocalHandle* remote_socket) {
+ Status<void> status;
+ int channel_pair[2] = {};
+ if (socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, channel_pair) == -1) {
+ ALOGE("Endpoint::CreateChannelSocketPair: Failed to create socket pair: %s",
+ strerror(errno));
+ status.SetError(errno);
+ return status;
+ }
+
+ local_socket->Reset(channel_pair[0]);
+ remote_socket->Reset(channel_pair[1]);
+
+ int optval = 1;
+ if (setsockopt(local_socket->Get(), SOL_SOCKET, SO_PASSCRED, &optval,
+ sizeof(optval)) == -1) {
+ ALOGE(
+ "Endpoint::CreateChannelSocketPair: Failed to enable the receiving of "
+ "the credentials for channel %d: %s",
+ local_socket->Get(), strerror(errno));
+ status.SetError(errno);
+ }
+ return status;
+}
+
Status<RemoteChannelHandle> Endpoint::PushChannel(Message* message,
int /*flags*/,
Channel* channel,
int* channel_id) {
- int channel_pair[2] = {};
- if (socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, channel_pair) == -1) {
- ALOGE("Endpoint::PushChannel: Failed to create a socket pair: %s",
- strerror(errno));
- return ErrorStatus(errno);
- }
-
- LocalHandle local_socket{channel_pair[0]};
- LocalHandle remote_socket{channel_pair[1]};
-
- int optval = 1;
- if (setsockopt(local_socket.Get(), SOL_SOCKET, SO_PASSCRED, &optval,
- sizeof(optval)) == -1) {
- ALOGE(
- "Endpoint::PushChannel: Failed to enable the receiving of the "
- "credentials for channel %d: %s",
- local_socket.Get(), strerror(errno));
- return ErrorStatus(errno);
- }
+ LocalHandle local_socket;
+ LocalHandle remote_socket;
+ auto status = CreateChannelSocketPair(&local_socket, &remote_socket);
+ if (!status)
+ return status.error_status();
std::lock_guard<std::mutex> autolock(channel_mutex_);
auto channel_data = OnNewChannelLocked(std::move(local_socket), channel);
diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp
index c5bbeee..d60768c 100644
--- a/services/sensorservice/SensorService.cpp
+++ b/services/sensorservice/SensorService.cpp
@@ -1250,7 +1250,7 @@
}
// Check maximum delay for the sensor.
- nsecs_t maxDelayNs = sensor->getSensor().getMaxDelay() * 1000;
+ nsecs_t maxDelayNs = sensor->getSensor().getMaxDelay() * 1000LL;
if (maxDelayNs > 0 && (samplingPeriodNs > maxDelayNs)) {
samplingPeriodNs = maxDelayNs;
}
@@ -1511,4 +1511,3 @@
}
}; // namespace android
-
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 45cac6f..fec1f1e 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -1262,7 +1262,6 @@
}
}
mDisplays.clear();
- initializeDisplays();
}
void SurfaceFlinger::updateVrFlinger() {
@@ -1309,6 +1308,12 @@
// parts of this class rely on the primary display always being available.
createDefaultDisplayDevice();
+ // Reset the timing values to account for the period of the swapped in HWC
+ const auto& activeConfig = mHwc->getActiveConfig(HWC_DISPLAY_PRIMARY);
+ const nsecs_t period = activeConfig->getVsyncPeriod();
+ mAnimFrameTracker.setDisplayRefreshPeriod(period);
+ setCompositorTimingSnapped(0, period, 0);
+
android_atomic_or(1, &mRepaintEverything);
setTransactionFlags(eDisplayTransactionNeeded);
}
diff --git a/vulkan/libvulkan/driver.cpp b/vulkan/libvulkan/driver.cpp
index f2cd8e6..0005a90 100644
--- a/vulkan/libvulkan/driver.cpp
+++ b/vulkan/libvulkan/driver.cpp
@@ -887,6 +887,19 @@
const VkAllocationCallbacks& data_allocator =
(pAllocator) ? *pAllocator : GetDefaultAllocator();
+ if (pCreateInfo->pApplicationInfo &&
+ pCreateInfo->pApplicationInfo->apiVersion >= VK_MAKE_VERSION(1, 1, 0)) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wold-style-cast"
+ ALOGI(
+ "Requested Vulkan instance version %d.%d is greater than max "
+ "supported version (1.0)",
+ VK_VERSION_MAJOR(pCreateInfo->pApplicationInfo->apiVersion),
+ VK_VERSION_MINOR(pCreateInfo->pApplicationInfo->apiVersion));
+#pragma clang diagnostic pop
+ return VK_ERROR_INCOMPATIBLE_DRIVER;
+ }
+
CreateInfoWrapper wrapper(*pCreateInfo, data_allocator);
VkResult result = wrapper.Validate();
if (result != VK_SUCCESS)