IPDL processing takes ~9.4s on my i7-6700K and is the long pole in the
"export" tier for clobber --disable-compile-environment builds. IPDL
shouldn't be needed for these builds.
Disabling IPDL makes artifact builds ~4s faster on my machine.
--HG--
extra : rebase_source : 60aeec636e18380c3258f054e90d1b6c3a16fadf
The bulk of this commit was generated with a script, executed at the top
level of a typical source code checkout. The only non-machine-generated
part was modifying MFBT's moz.build to reflect the new naming.
CLOSED TREE makes big refactorings like this a piece of cake.
# The main substitution.
find . -name '*.cpp' -o -name '*.cc' -o -name '*.h' -o -name '*.mm' -o -name '*.idl'| \
xargs perl -p -i -e '
s/nsRefPtr\.h/RefPtr\.h/g; # handle includes
s/nsRefPtr ?</RefPtr</g; # handle declarations and variables
'
# Handle a special friend declaration in gfx/layers/AtomicRefCountedWithFinalize.h.
perl -p -i -e 's/::nsRefPtr;/::RefPtr;/' gfx/layers/AtomicRefCountedWithFinalize.h
# Handle nsRefPtr.h itself, a couple places that define constructors
# from nsRefPtr, and code generators specially. We do this here, rather
# than indiscriminantly s/nsRefPtr/RefPtr/, because that would rename
# things like nsRefPtrHashtable.
perl -p -i -e 's/nsRefPtr/RefPtr/g' \
mfbt/nsRefPtr.h \
xpcom/glue/nsCOMPtr.h \
xpcom/base/OwningNonNull.h \
ipc/ipdl/ipdl/lower.py \
ipc/ipdl/ipdl/builtin.py \
dom/bindings/Codegen.py \
python/lldbutils/lldbutils/utils.py
# In our indiscriminate substitution above, we renamed
# nsRefPtrGetterAddRefs, the class behind getter_AddRefs. Fix that up.
find . -name '*.cpp' -o -name '*.h' -o -name '*.idl' | \
xargs perl -p -i -e 's/nsRefPtrGetterAddRefs/RefPtrGetterAddRefs/g'
if [ -d .git ]; then
git mv mfbt/nsRefPtr.h mfbt/RefPtr.h
else
hg mv mfbt/nsRefPtr.h mfbt/RefPtr.h
fi
--HG--
rename : mfbt/nsRefPtr.h => mfbt/RefPtr.h
Similar to the last patch, we copy any sub-protocols a protocol owns
before destroying the sub-protocols. We do this to ensure a stable
iteration over the sub-protocols, as destroying a sub-protocol may
trigger other sub-protocol deletions. Let's permit an existing
interface method to do the copying for us, so if the details of how we
store sub-protocols change, this call site is insulated from the
details.
In $PROTOCOL::CloneManages, we reach directly into the other protocol's
sub-protocol arrays to copy them. It would be better, from a
fewer-places-to-modify-when-things-change point of view if we used the
$PROTOCOL::Managed$SUBPROTOCOL array getter that already exists for this
purpose. A good compiler should be able to remove the function call
overhead...but cloning managees is probably expensive anyway, so a
function call here doesn't matter much.
It's not immediately obvious to me why we clone and then iterate over
the clone, rather than iterating directly, but perhaps there are subtle
IPDL dragons lurking hereabouts.
The functions:
- _callCxxArrayInsertSorted
- _callCxxArrayRemoveSorted
- _callCxxArrayClear
- _cxxArrayHasElementSorted
are only ever used to touch the managed sub-protocol arrays of a
protocol. It would be better if they reflected the *intent* of what
they were doing, rather than what C++ function they were calling, since
we're about to change that.
The patch removes 455 occurrences of FAIL_ON_WARNINGS from moz.build files, and
adds 78 instances of ALLOW_COMPILER_WARNINGS. About half of those 78 are in
code we control and which should be removable with a little effort.
--HG--
extra : rebase_source : 82e3387abfbd5f1471e953961d301d3d97ed2973
PFoo::Transition currently looks something like:
bool
Transition(
State from,
mozilla::ipc::Trigger trigger,
State* next)
{
switch (from) {
...
default:
NS_RUNTIMEABORT("corrupted actor state");
return false;
}
(*(next)) = __Error;
return false;
}
Coverity complains that the assignment (*(next)) = __Error will never be
reached, and rightfully so. We can remove this fallthrough block when
there are no states declared in the individual protocol.
Coverity was complaining that we have things like:
if ((!(actor))) {
return false;
}
if ((!(actor))) {
return false;
}
in the generated code, as the second return will clearly never be hit. To
address this, let's remove a redundant call to dtorPrologue.
The common include file /ipc/chromium/chromium-config.mozbuild already
defines this variable for us, and there's no point in telling the
compiler to look twice in the same directory for includes.
Similarly to part, there's no need to say we don't know the routing id
when constructing a message, and then turn around and set the routing id
immediately afterwards. Just let the constructor do its work.
The default constructor for ipdl-generated messages looks like:
MOZ_IMPLICIT Msg_AsyncMessage() :
IPC::Message(MSG_ROUTING_NONE, ID, IPC::Message::PRIORITY_NORMAL, COMPRESSION_NONE, "PContent::Msg_AsyncMessage")
{
}
IPC::Message::PRIORITY_NORMAL is 1, so any set_priority(1) calls are
just redudant.
Additionally, the priorities for messages are known at code generation
time, so we are always able to provide the right constants to the
message constructor, rather than using set_priority calls later.
There are, sadly, many combinations of linkage in use throughout the tree.
The main differentiator, though, is between program/libraries related to
Gecko or not. Kind of. Some need mozglue, some don't. Some need dependent
linkage, some standalone.
Anyways, these new templates remove the need to manually define the
right dependencies against xpcomglue, nspr, mozalloc and mozglue
in most cases.
Places that build programs and were resetting MOZ_GLUE_PROGRAM_LDFLAGS
or that build libraries and were resetting MOZ_GLUE_LDFLAGS can now
just not use those Gecko-specific templates.
OS_LIBS for libraries that are not part of the gecko tree, EXTRA_LIBS for
libraries, such as NSPR, that are in the tree, but are not handled by
moz.build just yet. Those EXTRA_LIBS may also come from a system library.
However, in cases where the expanded variables are always empty for the
in-tree case, OS_LIBS is used (as for, e.g. MOZ_ZLIB_LIBS). OS_LDFLAGS is
used exclusively for non-library linker flags.
Always pass EXTRA_LIBS before OS_LIBS on linker command lines.
Forbid EXTRA_DSO_LDOPTS, SHARED_LIBRARY_LIBS and LIBS in Makefiles.