Changeset 71091 in webkit
- Timestamp:
- Nov 1, 2010 6:40:12 PM (13 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r71080 r71091 1 2010-11-01 Sheriff Bot <webkit.review.bot@gmail.com> 2 3 Unreviewed, rolling out r71080. 4 http://trac.webkit.org/changeset/71080 5 https://bugs.webkit.org/show_bug.cgi?id=48815 6 7 This change caused many crashes on the debug bot. (Requested 8 by mrobinson on #webkit). 9 10 * platform/network/soup/SocketStreamHandle.h: 11 * platform/network/soup/SocketStreamHandleSoup.cpp: 12 (WebCore::isActiveHandle): 13 (WebCore::deactivateHandle): 14 (WebCore::SocketStreamHandle::SocketStreamHandle): 15 (WebCore::SocketStreamHandle::connected): 16 (WebCore::SocketStreamHandle::readBytes): 17 (WebCore::SocketStreamHandle::beginWaitingForSocketWritability): 18 (WebCore::connectedCallback): 19 (WebCore::readReadyCallback): 20 (WebCore::writeReadyCallback): 21 1 22 2010-11-01 Martin Robinson <mrobinson@igalia.com> 2 23 -
trunk/WebCore/platform/network/soup/SocketStreamHandle.h
r71080 r71091 52 52 void readBytes(signed long, GError*); 53 53 void writeReady(); 54 void* id() { return m_id; }55 54 56 55 protected: … … 64 63 PlatformRefPtr<GSource> m_writeReadySource; 65 64 char* m_readBuffer; 66 void* m_id;67 65 68 66 SocketStreamHandle(const KURL&, SocketStreamHandleClient*); -
trunk/WebCore/platform/network/soup/SocketStreamHandleSoup.cpp
r71080 r71091 49 49 50 50 // These functions immediately call the similarly named SocketStreamHandle methods. 51 static void connectedCallback(GSocketClient*, GAsyncResult*, void*);52 static void readReadyCallback(GInputStream*, GAsyncResult*, void*);53 static gboolean writeReadyCallback(GSocket*, GIOCondition, void*);51 static void connectedCallback(GSocketClient*, GAsyncResult*, SocketStreamHandle*); 52 static void readReadyCallback(GInputStream*, GAsyncResult*, SocketStreamHandle*); 53 static gboolean writeReadyCallback(GSocket*, GIOCondition, SocketStreamHandle*); 54 54 55 55 // Having a list of active handles means that we do not have to worry about WebCore … … 57 57 // we just ignore it in the callback. We avoid a lot of extra checks and tricky 58 58 // situations this way. 59 static HashMap<void*, SocketStreamHandle*> gActiveHandles; 60 static SocketStreamHandle* getHandleFromId(void* id) 61 { 62 if (!gActiveHandles.contains(id)) 63 return 0; 64 return gActiveHandles.get(id); 65 } 66 67 static void deactivateHandle(SocketStreamHandle* handle) 68 { 69 gActiveHandles.remove(handle->id()); 70 } 71 72 static void* activateHandle(SocketStreamHandle* handle) 73 { 74 static gint currentHandleId = 0; 75 void* id = GINT_TO_POINTER(currentHandleId++); 76 gActiveHandles.set(id, handle); 77 return id; 59 static Vector<SocketStreamHandle*> gActiveHandles; 60 bool isActiveHandle(SocketStreamHandle* handle) 61 { 62 return gActiveHandles.find(handle) != notFound; 63 } 64 65 void deactivateHandle(SocketStreamHandle* handle) 66 { 67 size_t handleIndex = gActiveHandles.find(handle); 68 if (handleIndex != notFound) 69 gActiveHandles.remove(handleIndex); 78 70 } 79 71 … … 87 79 unsigned int port = url.hasPort() ? url.port() : 80; 88 80 89 m_id = activateHandle(this);81 gActiveHandles.append(this); 90 82 PlatformRefPtr<GSocketClient> socketClient = adoptPlatformRef(g_socket_client_new()); 91 83 g_socket_client_connect_to_host_async(socketClient.get(), url.host().utf8().data(), port, 0, 92 reinterpret_cast<GAsyncReadyCallback>(connectedCallback), m_id);84 reinterpret_cast<GAsyncReadyCallback>(connectedCallback), this); 93 85 } 94 86 … … 113 105 m_readBuffer = new char[READ_BUFFER_SIZE]; 114 106 g_input_stream_read_async(m_inputStream.get(), m_readBuffer, READ_BUFFER_SIZE, G_PRIORITY_DEFAULT, 0, 115 reinterpret_cast<GAsyncReadyCallback>(readReadyCallback), m_id);107 reinterpret_cast<GAsyncReadyCallback>(readReadyCallback), this); 116 108 117 109 // The client can close the handle, potentially removing the last reference. … … 140 132 if (m_inputStream) // The client may have closed the connection. 141 133 g_input_stream_read_async(m_inputStream.get(), m_readBuffer, READ_BUFFER_SIZE, G_PRIORITY_DEFAULT, 0, 142 reinterpret_cast<GAsyncReadyCallback>(readReadyCallback), m_id);134 reinterpret_cast<GAsyncReadyCallback>(readReadyCallback), this); 143 135 } 144 136 … … 224 216 m_writeReadySource = adoptPlatformRef(g_socket_create_source( 225 217 g_socket_connection_get_socket(m_socketConnection.get()), static_cast<GIOCondition>(G_IO_OUT), 0)); 226 g_source_set_callback(m_writeReadySource.get(), reinterpret_cast<GSourceFunc>(writeReadyCallback), m_id, 0);218 g_source_set_callback(m_writeReadySource.get(), reinterpret_cast<GSourceFunc>(writeReadyCallback), this, 0); 227 219 g_source_attach(m_writeReadySource.get(), 0); 228 220 } … … 237 229 } 238 230 239 static void connectedCallback(GSocketClient* client, GAsyncResult* result, void* id)231 static void connectedCallback(GSocketClient* client, GAsyncResult* result, SocketStreamHandle* handle) 240 232 { 241 233 // Always finish the connection, even if this SocketStreamHandle was deactivated earlier. … … 244 236 245 237 // The SocketStreamHandle has been deactivated, so just close the connection, ignoring errors. 246 SocketStreamHandle* handle = getHandleFromId(id); 247 if (!handle) { 238 if (!isActiveHandle(handle)) { 248 239 g_io_stream_close(G_IO_STREAM(socketConnection), 0, &error.outPtr()); 249 240 return; … … 253 244 } 254 245 255 static void readReadyCallback(GInputStream* stream, GAsyncResult* result, void* id)246 static void readReadyCallback(GInputStream* stream, GAsyncResult* result, SocketStreamHandle* handle) 256 247 { 257 248 // Always finish the read, even if this SocketStreamHandle was deactivated earlier. … … 259 250 gssize bytesRead = g_input_stream_read_finish(stream, result, &error.outPtr()); 260 251 261 SocketStreamHandle* handle = getHandleFromId(id); 262 if (!handle) 263 return; 264 252 if (!isActiveHandle(handle)) 253 return; 265 254 handle->readBytes(bytesRead, error.get()); 266 255 } 267 256 268 static gboolean writeReadyCallback(GSocket*, GIOCondition condition, void* id) 269 { 270 SocketStreamHandle* handle = getHandleFromId(id); 271 if (!handle) 257 static gboolean writeReadyCallback(GSocket*, GIOCondition condition, SocketStreamHandle* handle) 258 { 259 if (!isActiveHandle(handle)) 272 260 return FALSE; 273 261
Note: See TracChangeset
for help on using the changeset viewer.