Index: ppapi/nacl_irt/manifest_service.cc |
diff --git a/ppapi/nacl_irt/manifest_service.cc b/ppapi/nacl_irt/manifest_service.cc |
index 8e671b90ceac9f24df864d175a373eb38c643968..a80151257af2e0ed5f09182b45dbb6e4248484f1 100644 |
--- a/ppapi/nacl_irt/manifest_service.cc |
+++ b/ppapi/nacl_irt/manifest_service.cc |
@@ -13,6 +13,12 @@ |
#include "ppapi/nacl_irt/plugin_startup.h" |
#include "ppapi/proxy/ppapi_messages.h" |
+#if !defined(OS_NACL_SFI) |
+#include <pthread.h> |
+#include <map> |
+#include <string> |
+#endif |
+ |
namespace ppapi { |
const char kFilePrefix[] = "files/"; |
@@ -120,11 +126,44 @@ bool ManifestService::OpenResource(const char* file, int* fd) { |
return true; |
} |
+#if !defined(OS_NACL_SFI) |
+namespace { |
+ |
+pthread_mutex_t g_mu = PTHREAD_MUTEX_INITIALIZER; |
+std::map<std::string, int>* g_prefetched_fds; |
+ |
+} // namespace |
+ |
+void RegisterPreopenedDescriptorsNonSfi( |
+ const std::map<std::string, int>& key_fd_map) { |
+ pthread_mutex_lock(&g_mu); |
+ DCHECK(!g_prefetched_fds); |
+ g_prefetched_fds = new std::map<std::string, int>; |
+ *g_prefetched_fds = key_fd_map; |
+ pthread_mutex_unlock(&g_mu); |
+} |
+#endif |
+ |
int IrtOpenResource(const char* file, int* fd) { |
// Remove leading '/' character. |
if (file[0] == '/') |
++file; |
+#if !defined(OS_NACL_SFI) |
+ // Fast path for prefetched FDs. |
+ pthread_mutex_lock(&g_mu); |
+ if (g_prefetched_fds) { |
+ std::map<std::string, int>::iterator it = g_prefetched_fds->find(file); |
+ if (it != g_prefetched_fds->end()) { |
+ *fd = it->second; |
+ g_prefetched_fds->erase(it); |
+ pthread_mutex_unlock(&g_mu); |
+ return 0; |
+ } |
+ } |
+ pthread_mutex_unlock(&g_mu); |
+#endif |
+ |
ManifestService* manifest_service = GetManifestService(); |
if (manifest_service == NULL || |
!manifest_service->OpenResource(file, fd)) { |