WebKit Bugzilla
New
Browse
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
RESOLVED FIXED
48507
[GTK] Implement RunLoop, WorkQueue, Connection classes for WebKit2
https://bugs.webkit.org/show_bug.cgi?id=48507
Summary
[GTK] Implement RunLoop, WorkQueue, Connection classes for WebKit2
Amruth Raj
Reported
2010-10-28 04:38:30 PDT
Implement RunLoop, WorkQueue and Connection classes and their corresponding Makefile changes
Attachments
Implements RunLoop, WorkQueue, Connection classes
(22.00 KB, patch)
2010-10-29 06:15 PDT
,
Amruth Raj
no flags
Details
Formatted Diff
Diff
RunLoop WorkQueue and Connection class implementation for GTK port
(22.98 KB, patch)
2010-11-02 09:39 PDT
,
Ravi Phaneendra Kasibhatla
mrobinson
: review-
Details
Formatted Diff
Diff
RunLoop WorkQueue Connection class implementation
(25.15 KB, patch)
2010-11-18 05:17 PST
,
Ravi Phaneendra Kasibhatla
no flags
Details
Formatted Diff
Diff
RunLoop WorkQueue Connection class implementation
(25.36 KB, patch)
2010-11-18 06:08 PST
,
Ravi Phaneendra Kasibhatla
no flags
Details
Formatted Diff
Diff
RunLoop WorkQueue Connection class implementation without using ioctl
(26.10 KB, patch)
2010-11-26 06:27 PST
,
Ravi Phaneendra Kasibhatla
mrobinson
: review-
Details
Formatted Diff
Diff
RunLoop WorkQueue Connection class implementation
(25.13 KB, patch)
2010-11-29 03:08 PST
,
Amruth Raj
mrobinson
: review+
Details
Formatted Diff
Diff
Addressed style issues
(25.29 KB, patch)
2010-11-29 22:26 PST
,
Amruth Raj
mrobinson
: review+
commit-queue
: commit-queue-
Details
Formatted Diff
Diff
Patch on top of latest revision
(25.46 KB, patch)
2010-11-30 23:05 PST
,
Amruth Raj
no flags
Details
Formatted Diff
Diff
Show Obsolete
(7)
View All
Add attachment
proposed patch, testcase, etc.
Amruth Raj
Comment 1
2010-10-29 06:15:37 PDT
Created
attachment 72321
[details]
Implements RunLoop, WorkQueue, Connection classes
Ravi Phaneendra Kasibhatla
Comment 2
2010-10-29 07:14:31 PDT
Adding myself to the CC list for this bug.
Ravi Phaneendra Kasibhatla
Comment 3
2010-11-02 09:39:58 PDT
Created
attachment 72680
[details]
RunLoop WorkQueue and Connection class implementation for GTK port Patch contains the implementation of RunLoop, WorkQueue and Connection classes for GTK port.
Martin Robinson
Comment 4
2010-11-15 11:51:31 PST
Comment on
attachment 72680
[details]
RunLoop WorkQueue and Connection class implementation for GTK port View in context:
https://bugs.webkit.org/attachment.cgi?id=72680&action=review
Here's an initial review. These are mostly style issues. Someone with more experience with the WebKit2 ports might have more insightful comments about the functionality.
> WebKit2/Platform/CoreIPC/gtk/ConnectionGtk.cpp:34 > +#include "ArgumentEncoder.h" > +#include "WorkItem.h" > + > +#include <errno.h> > +#include <stdio.h> > +#include <sys/fcntl.h>
These includes should be together in one clump with a newline before the "using" declaration.
> WebKit2/Platform/CoreIPC/gtk/ConnectionGtk.cpp:51 > + // TODO: unregister from connection queue. > + m_connectionQueue.unregisterEventSourceHandler(m_socket);
Why isn't it possible to simply implement this now? It should probably be implemented or the comment should explain why.
> WebKit2/Platform/CoreIPC/gtk/ConnectionGtk.cpp:81 > + Vector<uint8_t> buffer; > + buffer.resize(messageSize); > + numberOfBytesRead = read(m_socket, buffer.data(), messageSize); > + > + size_t realBufferSize = messageSize - sizeof(MessageID); > + unsigned messageID = *reinterpret_cast<unsigned*>(buffer.data() + realBufferSize); > + > + processIncomingMessage(MessageID::fromInt(messageID), adoptPtr(new ArgumentDecoder(buffer.data(), realBufferSize)));
This seems wrong. It assumes that read(...) is returning all of the message data, which read(...) doesn't guarantee. If, for some reason, it is always the case for Unix domain sockets then there should be a comment about it, I think. Additionally numberOfBytesRead is used to store the the result of read(...), but it isn't used. It's only used for the earlier size_t read(...).
> WebKit2/Platform/CoreIPC/gtk/ConnectionGtk.cpp:112 > + Vector<uint8_t> buffer; > + buffer.append(reinterpret_cast<uint8_t*>(&bufferSize), sizeof(size_t)); > + buffer.append(arguments->buffer(), arguments->bufferSize());
Sending these separately will avoid a memcpy, right? Perhaps we should do that.
> WebKit2/Platform/CoreIPC/gtk/ConnectionGtk.cpp:116 > + int bytesWritten = write(m_socket, buffer.data(), buffer.size()); > + ASSERT_UNUSED(bytesWritten, bytesWritten); > +
Shouldn't we be checking the return value here? write returns -1 on error and perhaps we should handle that somehow. Qt seems to handle all situations where bytesWritten != buffer.size() as a fatal error always. We should probably handle it somehow.
> WebKit2/Platform/RunLoop.h:37 > +#include <glib.h>
Please do no use GTK+ / GLib includes in headers. If you have to use GLib types, use forward-declarations.
> WebKit2/Platform/gtk/RunLoopGtk.cpp:78 > + g_source_set_callback(source, (GSourceFunc)&RunLoop::performWork, this, NULL);
Use 0 here instead of NULL (and everywhere, except when it generates a warning).
> WebKit2/Platform/gtk/RunLoopGtk.cpp:98 > +gboolean RunLoop::TimerBase::oneShotTimerFired(gpointer context) > +{ > + RunLoop::TimerBase* timerclass = static_cast<RunLoop::TimerBase*>(context); > + timerclass->fired();
Traditionally we just cast the callback when it's added and use something like gboolean RunLoop::TimerBase::oneShotTimerFired(RunLoop::TimerBase* timerClass). Note the camelCase. Why is this called timerclass, when it's an instance?
> WebKit2/Platform/gtk/RunLoopGtk.cpp:107 > +gboolean RunLoop::TimerBase::repeatingTimerFired(gpointer context) > +{ > + RunLoop::TimerBase* timerclass = static_cast<RunLoop::TimerBase*>(context); > + timerclass->fired(); > + return TRUE; > +}
Same comments here.
> WebKit2/Platform/gtk/RunLoopGtk.cpp:116 > + g_source_set_callback(m_timerSource, (GSourceFunc)&RunLoop::TimerBase::repeatingTimerFired, this, NULL);
0 instead of NULL.
> WebKit2/Platform/gtk/RunLoopGtk.cpp:119 > + g_source_set_callback(m_timerSource, (GSourceFunc)&RunLoop::TimerBase::oneShotTimerFired, this, NULL);
Ditto.
> WebKit2/Platform/gtk/RunLoopGtk.cpp:135 > + return m_timerSource? true : false;
Is it possible to just do something like "return m_timerSource;" without generating a warning?
> WebKit2/Platform/gtk/WorkQueueGtk.cpp:62 > +void* WorkQueue::workQueueThreadBody(void *context) > +{ > + static_cast<WorkQueue*>(context)->workQueueThreadBody(); > + return 0; > +}
I think this might be clearer if it was void* WorkQueue::workQueueThreadBody(WorkQueue *workQueue) and you just use a reinterpret_cast cast when you add it. See comment above.
> WebKit2/Platform/gtk/WorkQueueGtk.cpp:74 > + : m_dispatchSource(dispatchSource) > + , m_workItem(workItem) > + , m_workQueue(workQueue)
These should be indented.
> WebKit2/Platform/gtk/WorkQueueGtk.cpp:82 > + static gboolean performWorkOnce(gpointer source) > + { > + EventSource* eventSource = static_cast<EventSource*>(source);
Ditto with the reinterpret_cast approach.
> WebKit2/Platform/gtk/WorkQueueGtk.cpp:94 > + static gboolean closeConnection(GIOChannel* channel, GIOCondition condition, gpointer source)
Ditto.
> WebKit2/Platform/gtk/WorkQueueGtk.cpp:96 > + if ((condition & G_IO_HUP) || (condition & G_IO_ERR)) {
Please use an early return here instead.
> WebKit2/Platform/gtk/WorkQueueGtk.cpp:112 > + static gboolean performWork(GIOChannel* channel, GIOCondition condition, gpointer source) > + { > + if (condition & G_IO_IN) { > + EventSource* eventSource = static_cast<EventSource*>(source);
Same two comments as above.
> WebKit2/Platform/gtk/WorkQueueGtk.cpp:127 > + static void deleteEventSource(gpointer source)
Ditto.
> WebKit2/Platform/gtk/WorkQueueGtk.cpp:150 > + if (condition == G_IO_IN) { > + g_source_set_callback(dispatchSource, (GSourceFunc)& WorkQueue::EventSource::performWork, eventSource, &WorkQueue::EventSource::deleteEventSource); > + } else if (condition == (G_IO_HUP | G_IO_ERR)) { > + g_source_set_callback(dispatchSource, (GSourceFunc)&WorkQueue::EventSource::closeConnection, eventSource, &WorkQueue::EventSource::deleteEventSource); > + }
A few issues here: 1. One line bodies should not have the surrounding curly braces per WebKit style. On the other hand these lines are pretty long so maybe you should split them across multiple lines which would require the curly braces. See the WebKit style guidelines for more information:
http://webkit.org/coding/coding-style.html
2. Use a reinterpret_cast instead of a C-style cast. This comment applies globally to this patch. :) 3. The spacing is weird around for the ampersand operator in the first block "& WorkQueue::" --> "&WorkQueue".
> WebKit2/Platform/gtk/WorkQueueGtk.cpp:182 > + Vector<EventSource*> sources; > + sources = it->second;
Couldn't this be one line?
> WebKit2/Platform/gtk/WorkQueueGtk.cpp:186 > + EventSource* eventSource = sources[i]; > + GSource* gSource = eventSource->dispatchSource(); > + g_source_destroy(gSource);
Couldn't this be one line too?
> WebKit2/Platform/gtk/WorkQueueGtk.cpp:198 > + g_source_set_callback(dispatchSource, (GSourceFunc)&WorkQueue::EventSource::performWorkOnce, eventSource, &WorkQueue::EventSource::deleteEventSource);
reinterpret_cast here.
> WebKit2/Platform/PlatformProcessIdentifier.h:3 > + * Portions Copyright (c) 2010 Motorola Mobility, Inc. All rights reserved.
Typically there is a threshold of about 10 lines before adding copyright lines to a file.
> WebKit2/Platform/WorkQueue.h:35 > +#include <glib.h>
Please do not include GTK+ / GLib includes in header files. Instead use forward declarations. GTK+/GLib headers increase build times.
> WebKit2/Platform/WorkQueue.h:164 > + class EventSource;
This forward declaration should be at the top of the file, I think.
Amruth Raj
Comment 5
2010-11-16 07:12:59 PST
(In reply to
comment #4
)
> (From update of
attachment 72680
[details]
) > View in context:
https://bugs.webkit.org/attachment.cgi?id=72680&action=review
> > Here's an initial review. These are mostly style issues. Someone with more experience with the WebKit2 ports might have more insightful comments about the functionality. >
Adding more WebKit2 contributors. Could you please give us your comments on this patch. Robinson has given his initial comments and we are working on the same.
Balazs Kelemen
Comment 6
2010-11-16 15:17:04 PST
(In reply to
comment #5
)
> (In reply to
comment #4
) > > (From update of
attachment 72680
[details]
[details]) > > View in context:
https://bugs.webkit.org/attachment.cgi?id=72680&action=review
> > > > Here's an initial review. These are mostly style issues. Someone with more experience with the WebKit2 ports might have more insightful comments about the functionality. > > > Adding more WebKit2 contributors. > Could you please give us your comments on this patch. Robinson has given his initial comments and we are working on the same.
Generally looks pretty straightforward to me. I do not see any blocker from landing it after you have fixed the problems mentioned by Robinson.
Ravi Phaneendra Kasibhatla
Comment 7
2010-11-18 05:17:17 PST
Created
attachment 74227
[details]
RunLoop WorkQueue Connection class implementation RunLoop WorkQueue Connection class implementation after addressing the comments by mrobinson.
Ravi Phaneendra Kasibhatla
Comment 8
2010-11-18 06:08:32 PST
Created
attachment 74230
[details]
RunLoop WorkQueue Connection class implementation Added a missing change with the previous patch
Ravi Phaneendra Kasibhatla
Comment 9
2010-11-18 06:17:15 PST
(In reply to
comment #4
)
> (From update of
attachment 72680
[details]
) > View in context:
https://bugs.webkit.org/attachment.cgi?id=72680&action=review
> > Here's an initial review. These are mostly style issues. Someone with more experience with the WebKit2 ports might have more insightful comments about the functionality. > > > WebKit2/Platform/CoreIPC/gtk/ConnectionGtk.cpp:34 > > +#include "ArgumentEncoder.h" > > +#include "WorkItem.h" > > + > > +#include <errno.h> > > +#include <stdio.h> > > +#include <sys/fcntl.h> > > These includes should be together in one clump with a newline before the "using" declaration.
Done.
> > > WebKit2/Platform/CoreIPC/gtk/ConnectionGtk.cpp:51 > > + // TODO: unregister from connection queue. > > + m_connectionQueue.unregisterEventSourceHandler(m_socket); > > Why isn't it possible to simply implement this now? It should probably be implemented or the comment should explain why. >
This is an incorrect TODO. This is implemented. We have removed this now.
> > WebKit2/Platform/CoreIPC/gtk/ConnectionGtk.cpp:81 > > + Vector<uint8_t> buffer; > > + buffer.resize(messageSize); > > + numberOfBytesRead = read(m_socket, buffer.data(), messageSize); > > + > > + size_t realBufferSize = messageSize - sizeof(MessageID); > > + unsigned messageID = *reinterpret_cast<unsigned*>(buffer.data() + realBufferSize); > > + > > + processIncomingMessage(MessageID::fromInt(messageID), adoptPtr(new ArgumentDecoder(buffer.data(), realBufferSize))); > > This seems wrong. It assumes that read(...) is returning all of the message data, which read(...) doesn't guarantee. If, for some reason, it is always the case for Unix domain sockets then there should be a comment about it, I think. Additionally numberOfBytesRead is used to store the the result of read(...), but it isn't used. It's only used for the earlier size_t read(...). >
Thanks for pointing. Unix domain sockets do not guarantee it. We implemented functions writeBytesToSocket, readBytesFromSocket to handle these cases. We also handled the error cases.
> > WebKit2/Platform/CoreIPC/gtk/ConnectionGtk.cpp:112 > > + Vector<uint8_t> buffer; > > + buffer.append(reinterpret_cast<uint8_t*>(&bufferSize), sizeof(size_t)); > > + buffer.append(arguments->buffer(), arguments->bufferSize()); > > Sending these separately will avoid a memcpy, right? Perhaps we should do that.
Done.
> > > WebKit2/Platform/CoreIPC/gtk/ConnectionGtk.cpp:116 > > + int bytesWritten = write(m_socket, buffer.data(), buffer.size()); > > + ASSERT_UNUSED(bytesWritten, bytesWritten); > > + > > Shouldn't we be checking the return value here? write returns -1 on error and perhaps we should handle that somehow. Qt seems to handle all situations where bytesWritten != buffer.size() as a fatal error always. We should probably handle it somehow.
Done.
> > > WebKit2/Platform/RunLoop.h:37 > > +#include <glib.h> > > Please do no use GTK+ / GLib includes in headers. If you have to use GLib types, use forward-declarations.
Done.
> > > WebKit2/Platform/gtk/RunLoopGtk.cpp:78 > > + g_source_set_callback(source, (GSourceFunc)&RunLoop::performWork, this, NULL); > > Use 0 here instead of NULL (and everywhere, except when it generates a warning).
Done.
> > > WebKit2/Platform/gtk/RunLoopGtk.cpp:98 > > +gboolean RunLoop::TimerBase::oneShotTimerFired(gpointer context) > > +{ > > + RunLoop::TimerBase* timerclass = static_cast<RunLoop::TimerBase*>(context); > > + timerclass->fired(); > > Traditionally we just cast the callback when it's added and use something like gboolean RunLoop::TimerBase::oneShotTimerFired(RunLoop::TimerBase* timerClass). Note the camelCase. Why is this called timerclass, when it's an instance?
Done.
> > > WebKit2/Platform/gtk/RunLoopGtk.cpp:107 > > +gboolean RunLoop::TimerBase::repeatingTimerFired(gpointer context) > > +{ > > + RunLoop::TimerBase* timerclass = static_cast<RunLoop::TimerBase*>(context); > > + timerclass->fired(); > > + return TRUE; > > +} > > Same comments here.
Done.
> > > WebKit2/Platform/gtk/RunLoopGtk.cpp:116 > > + g_source_set_callback(m_timerSource, (GSourceFunc)&RunLoop::TimerBase::repeatingTimerFired, this, NULL); > > 0 instead of NULL.
Done.
> > > WebKit2/Platform/gtk/RunLoopGtk.cpp:119 > > + g_source_set_callback(m_timerSource, (GSourceFunc)&RunLoop::TimerBase::oneShotTimerFired, this, NULL); > > Ditto.
Done.
> > > WebKit2/Platform/gtk/RunLoopGtk.cpp:135 > > + return m_timerSource? true : false; > > Is it possible to just do something like "return m_timerSource;" without generating a warning?
Done.
> > > WebKit2/Platform/gtk/WorkQueueGtk.cpp:62 > > +void* WorkQueue::workQueueThreadBody(void *context) > > +{ > > + static_cast<WorkQueue*>(context)->workQueueThreadBody(); > > + return 0; > > +} > > I think this might be clearer if it was void* WorkQueue::workQueueThreadBody(WorkQueue *workQueue) and you just use a reinterpret_cast cast when you add it. See comment above.
Done.
> > > WebKit2/Platform/gtk/WorkQueueGtk.cpp:74 > > + : m_dispatchSource(dispatchSource) > > + , m_workItem(workItem) > > + , m_workQueue(workQueue) > > These should be indented.
Done.
> > > WebKit2/Platform/gtk/WorkQueueGtk.cpp:82 > > + static gboolean performWorkOnce(gpointer source) > > + { > > + EventSource* eventSource = static_cast<EventSource*>(source); > > Ditto with the reinterpret_cast approach.
Done.
> > > WebKit2/Platform/gtk/WorkQueueGtk.cpp:94 > > + static gboolean closeConnection(GIOChannel* channel, GIOCondition condition, gpointer source) > > Ditto.
Done.
> > > WebKit2/Platform/gtk/WorkQueueGtk.cpp:96 > > + if ((condition & G_IO_HUP) || (condition & G_IO_ERR)) { > > Please use an early return here instead.
Done.
> > > WebKit2/Platform/gtk/WorkQueueGtk.cpp:112 > > + static gboolean performWork(GIOChannel* channel, GIOCondition condition, gpointer source) > > + { > > + if (condition & G_IO_IN) { > > + EventSource* eventSource = static_cast<EventSource*>(source); > > Same two comments as above.
Done.
> > > WebKit2/Platform/gtk/WorkQueueGtk.cpp:127 > > + static void deleteEventSource(gpointer source) > > Ditto.
Done.
> > > WebKit2/Platform/gtk/WorkQueueGtk.cpp:150 > > + if (condition == G_IO_IN) { > > + g_source_set_callback(dispatchSource, (GSourceFunc)& WorkQueue::EventSource::performWork, eventSource, &WorkQueue::EventSource::deleteEventSource); > > + } else if (condition == (G_IO_HUP | G_IO_ERR)) { > > + g_source_set_callback(dispatchSource, (GSourceFunc)&WorkQueue::EventSource::closeConnection, eventSource, &WorkQueue::EventSource::deleteEventSource); > > + } > > A few issues here: > 1. One line bodies should not have the surrounding curly braces per WebKit style. On the other hand these lines are pretty long so maybe you should split them across multiple lines which would require the curly braces. See the WebKit style guidelines for more information:
http://webkit.org/coding/coding-style.html
> 2. Use a reinterpret_cast instead of a C-style cast. This comment applies globally to this patch. :) > 3. The spacing is weird around for the ampersand operator in the first block "& WorkQueue::" --> "&WorkQueue". >
Done. Addressed all 3 points.
> > WebKit2/Platform/gtk/WorkQueueGtk.cpp:182 > > + Vector<EventSource*> sources; > > + sources = it->second; > > Couldn't this be one line?
Done.
> > > WebKit2/Platform/gtk/WorkQueueGtk.cpp:186 > > + EventSource* eventSource = sources[i]; > > + GSource* gSource = eventSource->dispatchSource(); > > + g_source_destroy(gSource); > > Couldn't this be one line too?
Done.
> > > WebKit2/Platform/gtk/WorkQueueGtk.cpp:198 > > + g_source_set_callback(dispatchSource, (GSourceFunc)&WorkQueue::EventSource::performWorkOnce, eventSource, &WorkQueue::EventSource::deleteEventSource); > > reinterpret_cast here.
Done.
> > > WebKit2/Platform/PlatformProcessIdentifier.h:3 > > + * Portions Copyright (c) 2010 Motorola Mobility, Inc. All rights reserved. > > Typically there is a threshold of about 10 lines before adding copyright lines to a file.
Done.
> > > WebKit2/Platform/WorkQueue.h:35 > > +#include <glib.h> > > Please do not include GTK+ / GLib includes in header files. Instead use forward declarations. GTK+/GLib headers increase build times. > > > WebKit2/Platform/WorkQueue.h:164 > > + class EventSource; > > This forward declaration should be at the top of the file, I think.
We want EventSource forward declaration only within the WorkQueue class as we are declaring it inner class of WorkQueue. So, we followed the existing style in the file i.e. as in Mac, Win and Qt ports.
Ravi Phaneendra Kasibhatla
Comment 10
2010-11-26 06:27:24 PST
Created
attachment 74930
[details]
RunLoop WorkQueue Connection class implementation without using ioctl RunLoop WorkQueue Connection class implementation without using ioctl as per last review comments.
Martin Robinson
Comment 11
2010-11-28 04:58:12 PST
Comment on
attachment 74930
[details]
RunLoop WorkQueue Connection class implementation without using ioctl View in context:
https://bugs.webkit.org/attachment.cgi?id=74930&action=review
Great progress. I'm very happy with the elimination of the ioctl call. I still have a couple questions though.
> WebKit2/Platform/CoreIPC/gtk/ConnectionGtk.cpp:39 > +static const size_t messageInitialSize = 4096;
initialMessageBufferSize?
> WebKit2/Platform/CoreIPC/gtk/ConnectionGtk.cpp:49 > + uint8_t* buffer = reinterpret_cast<uint8_t*>(ptr);
Why not just pass in a uint8_t pointer here?
> WebKit2/Platform/CoreIPC/gtk/ConnectionGtk.cpp:77 > + uint8_t* buffer = reinterpret_cast<uint8_t*>(ptr);
Same.
> WebKit2/Platform/CoreIPC/gtk/ConnectionGtk.cpp:136 > + if ((m_pendingBytes -= readBytesFromSocket(m_socket, (void*)(m_readBuffer.data() + (m_currentMessageSize - m_pendingBytes)), m_pendingBytes)) > 0)
Why not just pass a uint8_t*? Can't readBytesFromSocket just take a uint8_t. You shouldn't need to cast a pointer to void* anyway.
> WebKit2/Platform/gtk/RunLoopGtk.cpp:45 > + m_runLoopMain = 0;
I don't think you need to set this to zero in the destructor.
> WebKit2/Platform/gtk/RunLoopGtk.cpp:50 > + m_runLoopContext = 0;
Same.
> WebKit2/Platform/gtk/WorkQueueGtk.cpp:84 > + return TRUE;
If the queue is invalid do we want to keep getting this callback? Can a queue ever change from the invalid state?
> WebKit2/Platform/gtk/WorkQueueGtk.cpp:161 > + if (condition == G_IO_IN) { > + g_source_set_callback(dispatchSource, > + reinterpret_cast<GSourceFunc>(&WorkQueue::EventSource::performWork), > + eventSource, > + reinterpret_cast<GDestroyNotify>(&WorkQueue::EventSource::deleteEventSource)); > + } else if (condition == (G_IO_HUP | G_IO_ERR)) { > + g_source_set_callback(dispatchSource, > + reinterpret_cast<GSourceFunc>(&WorkQueue::EventSource::closeConnection), > + eventSource, > + reinterpret_cast<GDestroyNotify>(&WorkQueue::EventSource::deleteEventSource)); > + }
This design is a little bit unbalanced, I think. Both the caller and the callee need to know about the semantics of the g_source_set_callback call. I'm not sure if it's possible to make the method more general or not. Maybe you could have a single source callback and pass some data about what the return value should be (true or false). That would remove the need for a specialized source callback (EventSource::closeConnection).
Martin Robinson
Comment 12
2010-11-28 04:59:45 PST
(In reply to
comment #11
)
> Why not just pass a uint8_t*? Can't readBytesFromSocket just take a uint8_t. You shouldn't need to cast a pointer to void* anyway.
Sorry. This should read: "Why not just pass a uint8_t*? You shouldn't need to cast a pointer to void* anyway."
Amruth Raj
Comment 13
2010-11-29 03:08:54 PST
Created
attachment 75006
[details]
RunLoop WorkQueue Connection class implementation
Amruth Raj
Comment 14
2010-11-29 03:20:03 PST
(In reply to
comment #11
)
> (From update of
attachment 74930
[details]
) > View in context:
https://bugs.webkit.org/attachment.cgi?id=74930&action=review
> > Great progress. I'm very happy with the elimination of the ioctl call. I still have a couple questions though. > > > WebKit2/Platform/CoreIPC/gtk/ConnectionGtk.cpp:39 > > +static const size_t messageInitialSize = 4096; > > initialMessageBufferSize?
Done
> > > WebKit2/Platform/CoreIPC/gtk/ConnectionGtk.cpp:49 > > + uint8_t* buffer = reinterpret_cast<uint8_t*>(ptr); > > Why not just pass in a uint8_t pointer here?
Done.
> > > WebKit2/Platform/CoreIPC/gtk/ConnectionGtk.cpp:77 > > + uint8_t* buffer = reinterpret_cast<uint8_t*>(ptr); > > Same.
Done.
> > > WebKit2/Platform/CoreIPC/gtk/ConnectionGtk.cpp:136 > > + if ((m_pendingBytes -= readBytesFromSocket(m_socket, (void*)(m_readBuffer.data() + (m_currentMessageSize - m_pendingBytes)), m_pendingBytes)) > 0) > > Why not just pass a uint8_t*? Can't readBytesFromSocket just take a uint8_t. You shouldn't need to cast a pointer to void* anyway.
Done.
> > > WebKit2/Platform/gtk/RunLoopGtk.cpp:45 > > + m_runLoopMain = 0; > > I don't think you need to set this to zero in the destructor. >
Done.
> > WebKit2/Platform/gtk/RunLoopGtk.cpp:50 > > + m_runLoopContext = 0; > > Same.
Done.
> > > WebKit2/Platform/gtk/WorkQueueGtk.cpp:84 > > + return TRUE; > > If the queue is invalid do we want to keep getting this callback? Can a queue ever change from the invalid state?
Changed the code to return false. Thanks for pointing.
> > > WebKit2/Platform/gtk/WorkQueueGtk.cpp:161 > > + if (condition == G_IO_IN) { > > + g_source_set_callback(dispatchSource, > > + reinterpret_cast<GSourceFunc>(&WorkQueue::EventSource::performWork), > > + eventSource, > > + reinterpret_cast<GDestroyNotify>(&WorkQueue::EventSource::deleteEventSource)); > > + } else if (condition == (G_IO_HUP | G_IO_ERR)) { > > + g_source_set_callback(dispatchSource, > > + reinterpret_cast<GSourceFunc>(&WorkQueue::EventSource::closeConnection), > > + eventSource, > > + reinterpret_cast<GDestroyNotify>(&WorkQueue::EventSource::deleteEventSource)); > > + } > > This design is a little bit unbalanced, I think. Both the caller and the callee need to know about the semantics of the g_source_set_callback call. I'm not sure if it's possible to make the method more general or not. Maybe you could have a single source callback and pass some data about what the return value should be (true or false). That would remove the need for a specialized source callback (EventSource::closeConnection).
Removed closeConnection callback. The return value can be determined by the condition parameter of the callback.
Martin Robinson
Comment 15
2010-11-29 05:45:28 PST
Comment on
attachment 75006
[details]
RunLoop WorkQueue Connection class implementation View in context:
https://bugs.webkit.org/attachment.cgi?id=75006&action=review
Looks good to me, though there are a few style issues. I'll fix them and land it myself.
> WebKit2/Platform/CoreIPC/gtk/ConnectionGtk.cpp:41 > +static int readBytesFromSocket(int fd, uint8_t* ptr, size_t length)
This should be "fileDescriptor" instead of "fd".
> WebKit2/Platform/CoreIPC/gtk/ConnectionGtk.cpp:69 > +static bool writeBytesToSocket(int fd, uint8_t* ptr, size_t length)
Same.
> WebKit2/Platform/CoreIPC/gtk/ConnectionGtk.cpp:79 > + // Keep writing to the socket till the complete message has been written
This is missing the period.
> WebKit2/Platform/CoreIPC/gtk/ConnectionGtk.cpp:91 > + // write operation failed if complete message is not written
This should have a capital letter and a period.
> WebKit2/Platform/CoreIPC/gtk/ConnectionGtk.cpp:135 > + // handle any previously unprocessed message
Ditto.
> WebKit2/Platform/CoreIPC/gtk/ConnectionGtk.cpp:144 > + // prepare to read the next message
Ditto.
> WebKit2/Platform/gtk/WorkQueueGtk.cpp:131 > +void WorkQueue::registerEventSourceHandler(int fd, int condition, PassOwnPtr<WorkItem> item)
Sorry that I missed this. It should be "fileDescriptor" not "fd".
> WebKit2/Platform/gtk/WorkQueueGtk.cpp:144 > + reinterpret_cast<GSourceFunc>(&WorkQueue::EventSource::performWork), > + eventSource, > + reinterpret_cast<GDestroyNotify>(&WorkQueue::EventSource::deleteEventSource)); > +
The indentation looks off here.
> WebKit2/Platform/gtk/WorkQueueGtk.cpp:165 > +void WorkQueue::unregisterEventSourceHandler(int fd)
This should be fileDesciptor as well.
Amruth Raj
Comment 16
2010-11-29 22:26:50 PST
Created
attachment 75106
[details]
Addressed style issues Addressed the style issues mentioned in the previous comment
Martin Robinson
Comment 17
2010-11-30 00:17:16 PST
Comment on
attachment 75106
[details]
Addressed style issues Thanks. That makes things easier.
WebKit Commit Bot
Comment 18
2010-11-30 19:00:00 PST
Comment on
attachment 75106
[details]
Addressed style issues Rejecting patch 75106 from commit-queue. Failed to run "['./WebKitTools/Scripts/webkit-patch', '--status-host=queues.webkit.org', '--bot-id=eseidel-cq-sl', 'apply-attachment', '--force-clean', '--non-interactive', 75106]" exit_code: 2 Last 500 characters of output: ILED at 83. Hunk #4 succeeded at 141 (offset 2 lines). 1 out of 4 hunks FAILED -- saving rejects to file WebKit2/Platform/RunLoop.h.rej patching file WebKit2/Platform/WorkQueue.h Hunk #3 succeeded at 83 (offset 5 lines). Hunk #4 succeeded at 158 (offset 5 lines). patching file WebKit2/Platform/gtk/RunLoopGtk.cpp patching file WebKit2/Platform/gtk/WorkQueueGtk.cpp Failed to run "[u'/Projects/CommitQueue/WebKitTools/Scripts/svn-apply', u'--reviewer', u'Martin Robinson', u'--force']" exit_code: 1 Full output:
http://queues.webkit.org/results/6484003
Amruth Raj
Comment 19
2010-11-30 23:05:42 PST
Created
attachment 75256
[details]
Patch on top of latest revision
WebKit Commit Bot
Comment 20
2010-12-02 09:34:22 PST
Comment on
attachment 75256
[details]
Patch on top of latest revision Clearing flags on attachment: 75256 Committed
r73142
: <
http://trac.webkit.org/changeset/73142
>
WebKit Commit Bot
Comment 21
2010-12-02 09:34:29 PST
All reviewed patches have been landed. Closing bug.
Note
You need to
log in
before you can comment on or make changes to this bug.
Top of Page
Format For Printing
XML
Clone This Bug