gfxstream: guest: remove EmulatorFeatureInfo dependency in libgfxstream_vulkan.so

EmulatorFeatureInfo likes to bundle all the features
into one giant struct.  Newer variants like virtio-gpu
tend to separate feature versioning into separate
capabilites.

This provides a compat layer for the older style,
as we move towards the newer style of versioning.

BUG=311486792
TEST=compile

Change-Id: I3017edf29e4c256321abf01c8e6ce43d7bf042e6
diff --git a/guest/OpenglSystemCommon/EmulatorFeatureInfo.h b/guest/OpenglSystemCommon/EmulatorFeatureInfo.h
index 90b989e..a69c341 100644
--- a/guest/OpenglSystemCommon/EmulatorFeatureInfo.h
+++ b/guest/OpenglSystemCommon/EmulatorFeatureInfo.h
@@ -206,6 +206,26 @@
     bool hasVulkanAuxCommandMemory; // This feature tracks if vulkan command buffers should be stored in an auxiliary shared memory
 };
 
+// This should be ABI identical with the variant in ResourceTracker.h
+struct EmulatorGfxStreamVkFeatureInfo {
+    bool hasDirectMem;
+    bool hasVulkan;
+    bool hasDeferredVulkanCommands;
+    bool hasVulkanNullOptionalStrings;
+    bool hasVulkanCreateResourcesWithRequirements;
+    bool hasVulkanIgnoredHandles;
+    bool hasVirtioGpuNext;
+    bool hasVulkanFreeMemorySync;
+    bool hasVirtioGpuNativeSync;
+    bool hasVulkanShaderFloat16Int8;
+    bool hasVulkanAsyncQueueSubmit;
+    bool hasVulkanQueueSubmitWithCommands;
+    bool hasVulkanBatchedDescriptorSetUpdate;
+    bool hasVulkanAsyncQsri;
+    bool hasVulkanAuxCommandMemory;
+    bool setupComplete;
+};
+
 enum GrallocType {
     GRALLOC_TYPE_RANCHU = 0,
     GRALLOC_TYPE_MINIGBM = 1,
diff --git a/guest/OpenglSystemCommon/HostConnection.cpp b/guest/OpenglSystemCommon/HostConnection.cpp
index 037834b..86fad3e 100644
--- a/guest/OpenglSystemCommon/HostConnection.cpp
+++ b/guest/OpenglSystemCommon/HostConnection.cpp
@@ -673,3 +673,28 @@
     GLint version = m_rcEnc->rcGetRendererVersion(m_rcEnc.get());
     return version;
 }
+
+void HostConnection::setVulkanFeatureInfo(void* info) {
+    struct EmulatorGfxStreamVkFeatureInfo* featureInfo =
+        (struct EmulatorGfxStreamVkFeatureInfo*)info;
+
+    featureInfo->hasDirectMem = m_rcEnc->featureInfo()->hasDirectMem;
+    featureInfo->hasVulkan = m_rcEnc->featureInfo()->hasVulkan;
+    featureInfo->hasDeferredVulkanCommands = m_rcEnc->featureInfo()->hasDeferredVulkanCommands;
+    featureInfo->hasVulkanNullOptionalStrings =
+        m_rcEnc->featureInfo()->hasVulkanNullOptionalStrings;
+    featureInfo->hasVulkanCreateResourcesWithRequirements =
+        m_rcEnc->featureInfo()->hasVulkanCreateResourcesWithRequirements;
+    featureInfo->hasVulkanIgnoredHandles = m_rcEnc->featureInfo()->hasVulkanIgnoredHandles;
+    featureInfo->hasVirtioGpuNext = m_rcEnc->featureInfo()->hasVirtioGpuNext;
+    featureInfo->hasVulkanFreeMemorySync = m_rcEnc->featureInfo()->hasVulkanFreeMemorySync;
+    featureInfo->hasVirtioGpuNativeSync = m_rcEnc->featureInfo()->hasVirtioGpuNativeSync;
+    featureInfo->hasVulkanShaderFloat16Int8 = m_rcEnc->featureInfo()->hasVulkanShaderFloat16Int8;
+    featureInfo->hasVulkanAsyncQueueSubmit = m_rcEnc->featureInfo()->hasVulkanAsyncQueueSubmit;
+    featureInfo->hasVulkanQueueSubmitWithCommands =
+        m_rcEnc->featureInfo()->hasVulkanQueueSubmitWithCommands;
+    featureInfo->hasVulkanBatchedDescriptorSetUpdate =
+        m_rcEnc->featureInfo()->hasVulkanBatchedDescriptorSetUpdate;
+    featureInfo->hasVulkanAsyncQsri = m_rcEnc->featureInfo()->hasVulkanAsyncQsri;
+    featureInfo->hasVulkanAuxCommandMemory = m_rcEnc->featureInfo()->hasVulkanAuxCommandMemory;
+}
diff --git a/guest/OpenglSystemCommon/HostConnection.h b/guest/OpenglSystemCommon/HostConnection.h
index b7fa122..43ac5a9 100644
--- a/guest/OpenglSystemCommon/HostConnection.h
+++ b/guest/OpenglSystemCommon/HostConnection.h
@@ -158,7 +158,9 @@
 #pragma clang diagnostic pop
 #endif
 
-private:
+    void setVulkanFeatureInfo(void* info);
+
+   private:
     // If the connection failed, |conn| is deleted.
     // Returns NULL if connection failed.
  static std::unique_ptr<HostConnection> connect(enum VirtGpuCapset capset);
diff --git a/guest/vulkan/gfxstream_vk_device.cpp b/guest/vulkan/gfxstream_vk_device.cpp
index 4c022e8..3b41bc9 100644
--- a/guest/vulkan/gfxstream_vk_device.cpp
+++ b/guest/vulkan/gfxstream_vk_device.cpp
@@ -82,7 +82,9 @@
             return VK_ERROR_DEVICE_LOST;
         }
 
-        gfxstream::vk::ResourceTracker::get()->setupFeatures(rcEnc->featureInfo_const());
+        struct GfxStreamVkFeatureInfo features = {};
+        hostCon->setVulkanFeatureInfo(&features);
+        gfxstream::vk::ResourceTracker::get()->setupFeatures(&features);
     }
 
     gfxstream::vk::ResourceTracker::get()->setThreadingCallbacks({
diff --git a/guest/vulkan_enc/ResourceTracker.cpp b/guest/vulkan_enc/ResourceTracker.cpp
index 048650a..9aada82 100644
--- a/guest/vulkan_enc/ResourceTracker.cpp
+++ b/guest/vulkan_enc/ResourceTracker.cpp
@@ -15,7 +15,6 @@
 
 #include "ResourceTracker.h"
 
-#include "../OpenglSystemCommon/EmulatorFeatureInfo.h"
 #include "../OpenglSystemCommon/HostConnection.h"
 #include "CommandBufferStagingStream.h"
 #include "DescriptorSetVirtualization.h"
@@ -1243,10 +1242,10 @@
 void ResourceTracker::clearDescriptorPoolAndUnregisterDescriptorSets(void* context, VkDevice device,
                                                                      VkDescriptorPool pool) {
     std::vector<VkDescriptorSet> toClear =
-        clearDescriptorPool(pool, mFeatureInfo->hasVulkanBatchedDescriptorSetUpdate);
+        clearDescriptorPool(pool, mFeatureInfo.hasVulkanBatchedDescriptorSetUpdate);
 
     for (auto set : toClear) {
-        if (mFeatureInfo->hasVulkanBatchedDescriptorSetUpdate) {
+        if (mFeatureInfo.hasVulkanBatchedDescriptorSetUpdate) {
             VkDescriptorSetLayout setLayout = as_goldfish_VkDescriptorSet(set)->reified->setLayout;
             decDescriptorSetLayoutRef(context, device, setLayout, nullptr);
         }
@@ -1426,20 +1425,17 @@
         // capabilities provide versioning. Set features to be unconditionally true, since
         // using virtio-gpu encompasses all prior goldfish features.  mFeatureInfo should be
         // deprecated in favor of caps.
-
-        mFeatureInfo.reset(new EmulatorFeatureInfo);
-
-        mFeatureInfo->hasVulkanNullOptionalStrings = true;
-        mFeatureInfo->hasVulkanIgnoredHandles = true;
-        mFeatureInfo->hasVulkanShaderFloat16Int8 = true;
-        mFeatureInfo->hasVulkanQueueSubmitWithCommands = true;
-        mFeatureInfo->hasDeferredVulkanCommands = true;
-        mFeatureInfo->hasVulkanAsyncQueueSubmit = true;
-        mFeatureInfo->hasVulkanCreateResourcesWithRequirements = true;
-        mFeatureInfo->hasVirtioGpuNext = true;
-        mFeatureInfo->hasVirtioGpuNativeSync = true;
-        mFeatureInfo->hasVulkanBatchedDescriptorSetUpdate = true;
-        mFeatureInfo->hasVulkanAsyncQsri = true;
+        mFeatureInfo.hasVulkanNullOptionalStrings = true;
+        mFeatureInfo.hasVulkanIgnoredHandles = true;
+        mFeatureInfo.hasVulkanShaderFloat16Int8 = true;
+        mFeatureInfo.hasVulkanQueueSubmitWithCommands = true;
+        mFeatureInfo.hasDeferredVulkanCommands = true;
+        mFeatureInfo.hasVulkanAsyncQueueSubmit = true;
+        mFeatureInfo.hasVulkanCreateResourcesWithRequirements = true;
+        mFeatureInfo.hasVirtioGpuNext = true;
+        mFeatureInfo.hasVirtioGpuNativeSync = true;
+        mFeatureInfo.hasVulkanBatchedDescriptorSetUpdate = true;
+        mFeatureInfo.hasVulkanAsyncQsri = true;
 
         ResourceTracker::streamFeatureBits |= VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT;
         ResourceTracker::streamFeatureBits |= VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT;
@@ -1450,20 +1446,21 @@
     noRenderControlEnc = mCaps.vulkanCapset.noRenderControlEnc;
 }
 
-void ResourceTracker::setupFeatures(const EmulatorFeatureInfo* features) {
-    if (!features || mFeatureInfo) return;
-    mFeatureInfo.reset(new EmulatorFeatureInfo);
-    *mFeatureInfo = *features;
+void ResourceTracker::setupFeatures(const struct GfxStreamVkFeatureInfo* features) {
+    if (mFeatureInfo.setupComplete) {
+        return;
+    }
 
+    mFeatureInfo = *features;
 #if defined(__ANDROID__)
-    if (mFeatureInfo->hasDirectMem) {
+    if (mFeatureInfo.hasDirectMem) {
         mGoldfishAddressSpaceBlockProvider.reset(
             new GoldfishAddressSpaceBlockProvider(GoldfishAddressSpaceSubdeviceType::NoSubdevice));
     }
 #endif  // defined(__ANDROID__)
 
 #ifdef VK_USE_PLATFORM_FUCHSIA
-    if (mFeatureInfo->hasVulkan) {
+    if (mFeatureInfo.hasVulkan) {
         fidl::ClientEnd<fuchsia_hardware_goldfish::ControlDevice> channel{zx::channel(
             GetConnectToServiceFunction()("/loader-gpu-devices/class/goldfish-control/000"))};
         if (!channel) {
@@ -1492,47 +1489,40 @@
     }
 #endif
 
-    if (mFeatureInfo->hasVulkanNullOptionalStrings) {
+    if (mFeatureInfo.hasVulkanNullOptionalStrings) {
         ResourceTracker::streamFeatureBits |= VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT;
     }
-    if (mFeatureInfo->hasVulkanIgnoredHandles) {
+    if (mFeatureInfo.hasVulkanIgnoredHandles) {
         ResourceTracker::streamFeatureBits |= VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT;
     }
-    if (mFeatureInfo->hasVulkanShaderFloat16Int8) {
+    if (mFeatureInfo.hasVulkanShaderFloat16Int8) {
         ResourceTracker::streamFeatureBits |= VULKAN_STREAM_FEATURE_SHADER_FLOAT16_INT8_BIT;
     }
-    if (mFeatureInfo->hasVulkanQueueSubmitWithCommands) {
+    if (mFeatureInfo.hasVulkanQueueSubmitWithCommands) {
         ResourceTracker::streamFeatureBits |= VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
     }
+
+    mFeatureInfo.setupComplete = true;
 }
 
 void ResourceTracker::setThreadingCallbacks(const ResourceTracker::ThreadingCallbacks& callbacks) {
     ResourceTracker::threadingCallbacks = callbacks;
 }
 
-bool ResourceTracker::hostSupportsVulkan() const {
-    if (!mFeatureInfo) return false;
-
-    return mFeatureInfo->hasVulkan;
-}
-
 bool ResourceTracker::usingDirectMapping() const { return true; }
 
 uint32_t ResourceTracker::getStreamFeatures() const { return ResourceTracker::streamFeatureBits; }
 
 bool ResourceTracker::supportsDeferredCommands() const {
-    if (!mFeatureInfo) return false;
-    return mFeatureInfo->hasDeferredVulkanCommands;
+    return mFeatureInfo.hasDeferredVulkanCommands;
 }
 
 bool ResourceTracker::supportsAsyncQueueSubmit() const {
-    if (!mFeatureInfo) return false;
-    return mFeatureInfo->hasVulkanAsyncQueueSubmit;
+    return mFeatureInfo.hasVulkanAsyncQueueSubmit;
 }
 
 bool ResourceTracker::supportsCreateResourcesWithRequirements() const {
-    if (!mFeatureInfo) return false;
-    return mFeatureInfo->hasVulkanCreateResourcesWithRequirements;
+    return mFeatureInfo.hasVulkanCreateResourcesWithRequirements;
 }
 
 int ResourceTracker::getHostInstanceExtensionIndex(const std::string& extName) const {
@@ -2935,7 +2925,7 @@
     CoherentMemoryPtr coherentMemory = nullptr;
 
 #if defined(__ANDROID__)
-    if (mFeatureInfo->hasDirectMem) {
+    if (mFeatureInfo.hasDirectMem) {
         uint64_t gpuAddr = 0;
         GoldfishAddressSpaceBlockPtr block = nullptr;
         res = enc->vkMapMemoryIntoAddressSpaceGOOGLE(device, mem, &gpuAddr, true);
@@ -2963,7 +2953,7 @@
         }
     } else
 #endif  // defined(__ANDROID__)
-        if (mFeatureInfo->hasVirtioGpuNext) {
+        if (mFeatureInfo.hasVirtioGpuNext) {
             struct VirtGpuCreateBlob createBlob = {0};
             uint64_t hvaSizeId[3];
             res = enc->vkGetMemoryHostAddressInfoGOOGLE(device, mem, &hvaSizeId[0], &hvaSizeId[1],
@@ -4689,7 +4679,7 @@
 
 #if defined(VK_USE_PLATFORM_ANDROID_KHR) || defined(__linux__)
     if (exportSyncFd) {
-        if (!mFeatureInfo->hasVirtioGpuNativeSync) {
+        if (!mFeatureInfo.hasVirtioGpuNativeSync) {
             mesa_logd("%s: ensure sync device\n", __func__);
             ensureSyncDeviceFd();
         }
@@ -4865,7 +4855,7 @@
             return VK_ERROR_OUT_OF_HOST_MEMORY;
         }
 
-        if (mFeatureInfo->hasVirtioGpuNativeSync) {
+        if (mFeatureInfo.hasVirtioGpuNativeSync) {
             VkResult result;
             int64_t osHandle;
             uint64_t hostFenceHandle = get_host_u64_VkFence(pGetFdInfo->fence);
@@ -5003,7 +4993,7 @@
         });
     }
 
-    if (mFeatureInfo->hasVulkanBatchedDescriptorSetUpdate) {
+    if (mFeatureInfo.hasVulkanBatchedDescriptorSetUpdate) {
         std::vector<uint64_t> poolIds(pCreateInfo->maxSets);
 
         uint32_t count = pCreateInfo->maxSets;
@@ -5049,7 +5039,7 @@
     VkEncoder* enc = (VkEncoder*)context;
     auto ci = pAllocateInfo;
     auto sets = pDescriptorSets;
-    if (mFeatureInfo->hasVulkanBatchedDescriptorSetUpdate) {
+    if (mFeatureInfo.hasVulkanBatchedDescriptorSetUpdate) {
         // Using the pool ID's we collected earlier from the host
         VkResult poolAllocResult = validateAndApplyVirtualDescriptorSetAllocation(ci, sets);
 
@@ -5128,7 +5118,7 @@
 
         for (auto set : existingDescriptorSets) {
             if (removeDescriptorSetFromPool(set,
-                                            mFeatureInfo->hasVulkanBatchedDescriptorSetUpdate)) {
+                                            mFeatureInfo.hasVulkanBatchedDescriptorSetUpdate)) {
                 toActuallyFree.push_back(set);
             }
         }
@@ -5136,7 +5126,7 @@
         if (toActuallyFree.empty()) return VK_SUCCESS;
     }
 
-    if (mFeatureInfo->hasVulkanBatchedDescriptorSetUpdate) {
+    if (mFeatureInfo.hasVulkanBatchedDescriptorSetUpdate) {
         // In the batched set update case, decrement refcount on the set layout
         // and only free on host if we satisfied a pending allocation on the
         // host.
@@ -5233,7 +5223,7 @@
         }
     }
 
-    if (mFeatureInfo->hasVulkanBatchedDescriptorSetUpdate) {
+    if (mFeatureInfo.hasVulkanBatchedDescriptorSetUpdate) {
         for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
             VkDescriptorSet set = transformedWrites[i].dstSet;
             doEmulatedDescriptorWrite(&transformedWrites[i],
@@ -5667,7 +5657,7 @@
 
 #if defined(VK_USE_PLATFORM_ANDROID_KHR) || defined(__linux__)
     if (exportSyncFd) {
-        if (mFeatureInfo->hasVirtioGpuNativeSync &&
+        if (mFeatureInfo.hasVirtioGpuNativeSync &&
             !(mCaps.params[kParamFencePassing] && mCaps.vulkanCapset.externalSync)) {
             VkResult result;
             int64_t osHandle;
@@ -5935,7 +5925,7 @@
         VkEncoder* enc = (VkEncoder*)context;
         VkDeviceMemory deviceMemory = cmdBufStream->getDeviceMemory();
         VkDeviceSize dataOffset = 0;
-        if (mFeatureInfo->hasVulkanAuxCommandMemory) {
+        if (mFeatureInfo.hasVulkanAuxCommandMemory) {
             // for suballocations, deviceMemory is an alias VkDeviceMemory
             // get underling VkDeviceMemory for given alias
             deviceMemoryTransform_tohost(&deviceMemory, 1 /*memoryCount*/, &dataOffset,
@@ -6591,7 +6581,7 @@
     struct goldfish_VkDescriptorSet* ds = as_goldfish_VkDescriptorSet(descriptorSet);
     ReifiedDescriptorSet* reified = ds->reified;
 
-    bool batched = mFeatureInfo->hasVulkanBatchedDescriptorSetUpdate;
+    bool batched = mFeatureInfo.hasVulkanBatchedDescriptorSetUpdate;
 
     for (uint32_t i = 0; i < templateEntryCount; ++i) {
         const auto& entry = templateEntries[i];
@@ -7004,7 +6994,7 @@
 }
 
 CommandBufferStagingStream::Alloc ResourceTracker::getAlloc() {
-    if (mFeatureInfo->hasVulkanAuxCommandMemory) {
+    if (mFeatureInfo.hasVulkanAuxCommandMemory) {
         return [this](size_t size) -> CommandBufferStagingStream::Memory {
             VkMemoryAllocateInfo info{
                 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
@@ -7043,7 +7033,7 @@
 }
 
 CommandBufferStagingStream::Free ResourceTracker::getFree() {
-    if (mFeatureInfo->hasVulkanAuxCommandMemory) {
+    if (mFeatureInfo.hasVulkanAuxCommandMemory) {
         return [this](const CommandBufferStagingStream::Memory& memory) {
             // deviceMemory may not be the actual backing auxiliary VkDeviceMemory
             // for suballocations, deviceMemory is a alias VkDeviceMemory hand;
@@ -7169,7 +7159,7 @@
                                               const VkCommandBuffer* pCommandBuffers) {
     VkEncoder* enc = (VkEncoder*)context;
 
-    if (!mFeatureInfo->hasVulkanQueueSubmitWithCommands) {
+    if (!mFeatureInfo.hasVulkanQueueSubmitWithCommands) {
         enc->vkCmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers,
                                   true /* do lock */);
         return;
@@ -7196,7 +7186,7 @@
                                                  const uint32_t* pDynamicOffsets) {
     VkEncoder* enc = (VkEncoder*)context;
 
-    if (mFeatureInfo->hasVulkanBatchedDescriptorSetUpdate)
+    if (mFeatureInfo.hasVulkanBatchedDescriptorSetUpdate)
         addPendingDescriptorSets(commandBuffer, descriptorSetCount, pDescriptorSets);
 
     enc->vkCmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet,
@@ -7278,7 +7268,7 @@
     mesa_logd("%s: call for image %p hos timage handle 0x%llx\n", __func__, (void*)image,
               (unsigned long long)get_host_u64_VkImage(image));
 
-    if (mFeatureInfo->hasVirtioGpuNativeSync) {
+    if (mFeatureInfo.hasVirtioGpuNativeSync) {
         struct VirtGpuExecBuffer exec = {};
         struct gfxstreamCreateQSRIExportVK exportQSRI = {};
         VirtGpuDevice* instance = VirtGpuDevice::getInstance();
@@ -7351,7 +7341,7 @@
 
     VkEncoder* enc = (VkEncoder*)context;
 
-    if (!mFeatureInfo->hasVulkanAsyncQsri) {
+    if (!mFeatureInfo.hasVulkanAsyncQsri) {
         return enc->vkQueueSignalReleaseImageANDROID(queue, waitSemaphoreCount, pWaitSemaphores,
                                                      image, pNativeFenceFd, true /* lock */);
     }
diff --git a/guest/vulkan_enc/ResourceTracker.h b/guest/vulkan_enc/ResourceTracker.h
index fc4d9b0..ac810d2 100644
--- a/guest/vulkan_enc/ResourceTracker.h
+++ b/guest/vulkan_enc/ResourceTracker.h
@@ -92,7 +92,25 @@
 #include "../egl/goldfish_sync.h"
 #endif
 
-struct EmulatorFeatureInfo;
+// This should be ABI identical with the variant in ResourceTracker.h
+struct GfxStreamVkFeatureInfo {
+    bool hasDirectMem;
+    bool hasVulkan;
+    bool hasDeferredVulkanCommands;
+    bool hasVulkanNullOptionalStrings;
+    bool hasVulkanCreateResourcesWithRequirements;
+    bool hasVulkanIgnoredHandles;
+    bool hasVirtioGpuNext;
+    bool hasVulkanFreeMemorySync;
+    bool hasVirtioGpuNativeSync;
+    bool hasVulkanShaderFloat16Int8;
+    bool hasVulkanAsyncQueueSubmit;
+    bool hasVulkanQueueSubmitWithCommands;
+    bool hasVulkanBatchedDescriptorSetUpdate;
+    bool hasVulkanAsyncQsri;
+    bool hasVulkanAuxCommandMemory;
+    bool setupComplete;
+};
 
 class HostConnection;
 
@@ -530,7 +548,7 @@
     VkDeviceSize getNonCoherentExtendedSize(VkDevice device, VkDeviceSize basicSize) const;
     bool isValidMemoryRange(const VkMappedMemoryRange& range);
 
-    void setupFeatures(const EmulatorFeatureInfo* features);
+    void setupFeatures(const struct GfxStreamVkFeatureInfo* features);
     void setupCaps(uint32_t& noRenderControlEnc);
 
     void setThreadingCallbacks(const ThreadingCallbacks& callbacks);
@@ -877,7 +895,9 @@
     std::recursive_mutex mLock;
 
     std::optional<const VkPhysicalDeviceMemoryProperties> mCachedPhysicalDeviceMemoryProps;
-    std::unique_ptr<EmulatorFeatureInfo> mFeatureInfo;
+
+    struct GfxStreamVkFeatureInfo mFeatureInfo = {};
+
 #if defined(__ANDROID__)
     std::unique_ptr<GoldfishAddressSpaceBlockProvider> mGoldfishAddressSpaceBlockProvider;
 #endif  // defined(__ANDROID__)