Changeset 202723 in webkit
- Timestamp:
- Jun 30, 2016 6:29:47 PM (8 years ago)
- Location:
- trunk/Source
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WTF/wtf/spi/darwin/XPCSPI.h
r194318 r202723 124 124 EXTERN_C const char* xpc_string_get_string_ptr(xpc_object_t); 125 125 EXTERN_C void xpc_transaction_begin(void); 126 EXTERN_C void xpc_transaction_end(void); 127 EXTERN_C void xpc_transaction_exit_clean(void); 126 128 EXTERN_C void xpc_track_activity(void); 127 129 -
trunk/Source/WebKit2/ChangeLog
r202700 r202723 1 2016-06-30 Chris Dumez <cdumez@apple.com> 2 3 [iOS] WebContent processes do not exit promptly 4 https://bugs.webkit.org/show_bug.cgi?id=159301 5 <rdar://problem/26965488> 6 7 Reviewed by Anders Carlsson. 8 9 WebContent processes do not exit promptly, they hang around for 10 seconds 10 until the watchdog forcefully calls exit(). 11 12 This patch addresses the issue by asking XPC to exit when clean. It also 13 fixes 2 XPC transactions that were leaking so that XPC can become clean. 14 15 * DatabaseProcess/EntryPoint/mac/XPCService/DatabaseServiceEntryPoint.mm: 16 (DatabaseServiceInitializer): 17 * NetworkProcess/EntryPoint/mac/XPCService/NetworkServiceEntryPoint.mm: 18 (NetworkServiceInitializer): 19 * PluginProcess/EntryPoint/mac/XPCService/PluginServiceEntryPoint.mm: 20 (PluginServiceInitializer): 21 * WebProcess/EntryPoint/mac/XPCService/WebContentServiceEntryPoint.mm: 22 (WebContentServiceInitializer): 23 Add extra priorityBoostMessage parameter which is then passed along to 24 ChildProcess via initialization parameters. ChildProcess is now in 25 charge of retaining the message for as long as it needs the priority 26 boost. In particular, ChildProcess now takes care of releasing the 27 boost message before existing to avoid leaking an XPC transaction. 28 29 * Shared/ChildProcess.cpp: 30 (WebKit::ChildProcess::initialize): 31 Retain priorityBoostMessage as a data member. 32 33 (WebKit::ChildProcess::stopRunLoop): 34 (WebKit::ChildProcess::platformStopRunLoop): 35 * Shared/ios/ChildProcessIOS.mm: 36 (WebKit::ChildProcess::platformStopRunLoop): 37 On iOS, call XPCServiceExit() to exit instead of RunLoop::main().stop() 38 which did not work. 39 40 * Shared/ChildProcess.h: 41 * Shared/EntryPointUtilities/mac/XPCService/XPCServiceEntryPoint.h: 42 (WebKit::XPCServiceInitializer): 43 Set priorityBoostMessage on ChildProcessInitializationParameters. 44 45 * Shared/EntryPointUtilities/mac/XPCService/XPCServiceEntryPoint.mm: 46 (WebKit::XPCServiceExit): 47 Add XPCServiceExit() function which destroys the priority boost 48 message, calls xpc_transaction_end() to balance the 49 xpc_transaction_begin() in XPCServiceInitializer() and then call 50 xpc_transaction_exit_clean() to ask XPC to exit when clean. 51 52 * Shared/EntryPointUtilities/mac/XPCService/XPCServiceMain.mm: 53 (WebKit::XPCServiceEventHandler): 54 Leaking the "pre-bootstrap" event for priority boosting would cause us to 55 leak an XPC transaction, which would prevent XPC from becoming clean and 56 exiting. Instead, we now pass it along to the initialization function. 57 We then pass it to ChildProcess which manages the lifetime of this message 58 instead of leaking it. 59 1 60 2016-06-30 Brian Burg <bburg@apple.com> 2 61 -
trunk/Source/WebKit2/DatabaseProcess/EntryPoint/mac/XPCService/DatabaseServiceEntryPoint.mm
r200628 r202723 37 37 using namespace WebKit; 38 38 39 extern "C" WK_EXPORT void DatabaseServiceInitializer(xpc_connection_t connection, xpc_object_t initializerMessage );39 extern "C" WK_EXPORT void DatabaseServiceInitializer(xpc_connection_t connection, xpc_object_t initializerMessage, xpc_object_t priorityBoostMessage); 40 40 41 void DatabaseServiceInitializer(xpc_connection_t connection, xpc_object_t initializerMessage )41 void DatabaseServiceInitializer(xpc_connection_t connection, xpc_object_t initializerMessage, xpc_object_t priorityBoostMessage) 42 42 { 43 43 #if HAVE(OS_ACTIVITY) … … 48 48 #endif 49 49 50 XPCServiceInitializer<DatabaseProcess, XPCServiceInitializerDelegate>(adoptOSObject(connection), initializerMessage );50 XPCServiceInitializer<DatabaseProcess, XPCServiceInitializerDelegate>(adoptOSObject(connection), initializerMessage, priorityBoostMessage); 51 51 52 52 #if HAVE(OS_ACTIVITY) -
trunk/Source/WebKit2/NetworkProcess/EntryPoint/mac/XPCService/NetworkServiceEntryPoint.mm
r200631 r202723 49 49 using namespace WebKit; 50 50 51 extern "C" WK_EXPORT void NetworkServiceInitializer(xpc_connection_t connection, xpc_object_t initializerMessage );51 extern "C" WK_EXPORT void NetworkServiceInitializer(xpc_connection_t connection, xpc_object_t initializerMessage, xpc_object_t priorityBoostMessage); 52 52 53 void NetworkServiceInitializer(xpc_connection_t connection, xpc_object_t initializerMessage )53 void NetworkServiceInitializer(xpc_connection_t connection, xpc_object_t initializerMessage, xpc_object_t priorityBoostMessage) 54 54 { 55 55 // Remove the SecItemShim from the DYLD_INSERT_LIBRARIES environment variable so any processes spawned by … … 64 64 #endif 65 65 66 XPCServiceInitializer<NetworkProcess, NetworkServiceInitializerDelegate>(adoptOSObject(connection), initializerMessage );66 XPCServiceInitializer<NetworkProcess, NetworkServiceInitializerDelegate>(adoptOSObject(connection), initializerMessage, priorityBoostMessage); 67 67 68 68 #if HAVE(OS_ACTIVITY) -
trunk/Source/WebKit2/PluginProcess/EntryPoint/mac/XPCService/PluginServiceEntryPoint.mm
r200631 r202723 70 70 #endif // ENABLE(NETSCAPE_PLUGIN_API) 71 71 72 extern "C" WK_EXPORT void PluginServiceInitializer(xpc_connection_t connection, xpc_object_t initializerMessage );72 extern "C" WK_EXPORT void PluginServiceInitializer(xpc_connection_t connection, xpc_object_t initializerMessage, xpc_object_t priorityBoostMessage); 73 73 74 void PluginServiceInitializer(xpc_connection_t connection, xpc_object_t initializerMessage )74 void PluginServiceInitializer(xpc_connection_t connection, xpc_object_t initializerMessage, xpc_object_t priorityBoostMessage) 75 75 { 76 76 #if ENABLE(NETSCAPE_PLUGIN_API) … … 88 88 #endif 89 89 90 XPCServiceInitializer<PluginProcess, PluginServiceInitializerDelegate>(adoptOSObject(connection), initializerMessage );90 XPCServiceInitializer<PluginProcess, PluginServiceInitializerDelegate>(adoptOSObject(connection), initializerMessage, priorityBoostMessage); 91 91 92 92 #if HAVE(OS_ACTIVITY) -
trunk/Source/WebKit2/Shared/ChildProcess.cpp
r202611 r202723 64 64 { 65 65 platformInitialize(); 66 67 #if PLATFORM(COCOA) 68 m_priorityBoostMessage = parameters.priorityBoostMessage; 69 #endif 66 70 67 71 initializeProcess(parameters); … … 159 163 void ChildProcess::stopRunLoop() 160 164 { 165 platformStopRunLoop(); 166 } 167 168 #if !PLATFORM(IOS) 169 void ChildProcess::platformStopRunLoop() 170 { 161 171 RunLoop::main().stop(); 162 172 } 173 #endif 163 174 164 175 void ChildProcess::terminate() -
trunk/Source/WebKit2/Shared/ChildProcess.h
r202611 r202723 46 46 IPC::Connection::Identifier connectionIdentifier; 47 47 HashMap<String, String> extraInitializationData; 48 #if PLATFORM(COCOA) 49 OSObjectPtr<xpc_object_t> priorityBoostMessage; 50 #endif 48 51 }; 49 52 … … 111 114 112 115 void platformInitialize(); 116 void platformStopRunLoop(); 113 117 114 118 // The timeout, in seconds, before this process will be terminated if termination … … 126 130 127 131 UserActivity m_processSuppressionDisabled; 132 133 #if PLATFORM(COCOA) 134 OSObjectPtr<xpc_object_t> m_priorityBoostMessage; 135 #endif 128 136 }; 129 137 -
trunk/Source/WebKit2/Shared/EntryPointUtilities/mac/XPCService/XPCServiceEntryPoint.h
r195985 r202723 68 68 69 69 template<typename XPCServiceType, typename XPCServiceInitializerDelegateType> 70 void XPCServiceInitializer(OSObjectPtr<xpc_connection_t> connection, xpc_object_t initializerMessage )70 void XPCServiceInitializer(OSObjectPtr<xpc_connection_t> connection, xpc_object_t initializerMessage, xpc_object_t priorityBoostMessage) 71 71 { 72 72 XPCServiceInitializerDelegateType delegate(WTFMove(connection), initializerMessage); … … 82 82 83 83 ChildProcessInitializationParameters parameters; 84 if (priorityBoostMessage) 85 parameters.priorityBoostMessage = adoptOSObject(xpc_retain(priorityBoostMessage)); 86 84 87 if (!delegate.getConnectionIdentifier(parameters.connectionIdentifier)) 85 88 exit(EXIT_FAILURE); … … 102 105 } 103 106 107 void XPCServiceExit(OSObjectPtr<xpc_object_t>&& priorityBoostMessage); 108 104 109 } // namespace WebKit 105 110 -
trunk/Source/WebKit2/Shared/EntryPointUtilities/mac/XPCService/XPCServiceEntryPoint.mm
r190257 r202723 121 121 } 122 122 123 void XPCServiceExit(OSObjectPtr<xpc_object_t>&& priorityBoostMessage) 124 { 125 // Make sure to destroy the priority boost message to avoid leaking a transaction. 126 priorityBoostMessage = nullptr; 127 // Balances the xpc_transaction_begin() in XPCServiceInitializer. 128 xpc_transaction_end(); 129 xpc_transaction_exit_clean(); 130 } 131 123 132 } // namespace WebKit -
trunk/Source/WebKit2/Shared/EntryPointUtilities/mac/XPCService/XPCServiceMain.mm
r195795 r202723 35 35 static void XPCServiceEventHandler(xpc_connection_t peer) 36 36 { 37 static xpc_object_t priorityBoostMessage = nullptr; 38 37 39 xpc_connection_set_target_queue(peer, dispatch_get_main_queue()); 38 40 xpc_connection_set_event_handler(peer, ^(xpc_object_t event) { … … 50 52 CFStringRef entryPointFunctionName = (CFStringRef)CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), CFSTR("WebKitEntryPoint")); 51 53 52 typedef void (*InitializerFunction)(xpc_connection_t, xpc_object_t );54 typedef void (*InitializerFunction)(xpc_connection_t, xpc_object_t, xpc_object_t); 53 55 InitializerFunction initializerFunctionPtr = reinterpret_cast<InitializerFunction>(CFBundleGetFunctionPointerForName(webKitBundle, entryPointFunctionName)); 54 56 if (!initializerFunctionPtr) { … … 69 71 dup2(fd, STDERR_FILENO); 70 72 71 initializerFunctionPtr(peer, event); 73 initializerFunctionPtr(peer, event, priorityBoostMessage); 74 if (priorityBoostMessage) 75 xpc_release(priorityBoostMessage); 72 76 } 73 77 74 78 // Leak a boost onto the NetworkProcess. 75 if (!strcmp(xpc_dictionary_get_string(event, "message-name"), "pre-bootstrap")) 76 xpc_retain(event); 79 if (!strcmp(xpc_dictionary_get_string(event, "message-name"), "pre-bootstrap")) { 80 assert(!priorityBoostMessage); 81 priorityBoostMessage = xpc_retain(event); 82 } 77 83 } 78 84 }); -
trunk/Source/WebKit2/Shared/ios/ChildProcessIOS.mm
r193783 r202723 32 32 #import "SandboxInitializationParameters.h" 33 33 #import "WebKitSystemInterface.h" 34 #import "XPCServiceEntryPoint.h" 34 35 #import <WebCore/FileSystem.h> 35 36 #import <WebCore/FloatingPointEnvironment.h> … … 115 116 } 116 117 118 void ChildProcess::platformStopRunLoop() 119 { 120 XPCServiceExit(WTFMove(m_priorityBoostMessage)); 121 } 122 117 123 } // namespace WebKit 118 124 -
trunk/Source/WebKit2/WebProcess/EntryPoint/mac/XPCService/WebContentServiceEntryPoint.mm
r200631 r202723 44 44 using namespace WebKit; 45 45 46 extern "C" WK_EXPORT void WebContentServiceInitializer(xpc_connection_t connection, xpc_object_t initializerMessage );46 extern "C" WK_EXPORT void WebContentServiceInitializer(xpc_connection_t connection, xpc_object_t initializerMessage, xpc_object_t priorityBoostMessage); 47 47 48 void WebContentServiceInitializer(xpc_connection_t connection, xpc_object_t initializerMessage )48 void WebContentServiceInitializer(xpc_connection_t connection, xpc_object_t initializerMessage, xpc_object_t priorityBoostMessage) 49 49 { 50 50 // Remove the WebProcessShim from the DYLD_INSERT_LIBRARIES environment variable so any processes spawned by … … 64 64 #endif // PLATFORM(IOS) 65 65 66 XPCServiceInitializer<WebProcess, XPCServiceInitializerDelegate>(adoptOSObject(connection), initializerMessage );66 XPCServiceInitializer<WebProcess, XPCServiceInitializerDelegate>(adoptOSObject(connection), initializerMessage, priorityBoostMessage); 67 67 68 68 #if HAVE(OS_ACTIVITY)
Note: See TracChangeset
for help on using the changeset viewer.