Hi Ehsan,
Yes, in my opinion that is the problem. I'm trying to use the global stream
variable across module boundaries, more specifically from the following source
files: content\base\src\Element.cpp; layout\style\nsCSSParser.cpp;
content\base\src\nsINode.cpp, js\src\builtin\Eval.cpp,
js\src\vm\Interpreter.cpp, js\src\jsfun.cpp, browser\app\nsBrowserApp.cpp,
content\base\src\nsDocument.cpp, dom\base\nsGlobalWindow.cpp,
parser\html\nsHtml5TreeOperation.cpp,
content\html\document\src\nsHTMLContentSink.cpp
So it's across at least two different modules.
I've tried to follow your advice in using MOZ_EXPORT and MOZ_IMPORT, but I'm
not getting anywhere :-/ The application runs, but it crashes.
Of the top of your head, do you maybe know of a variable that is used in a
similar way, so that I can look into how this is supposed to be done.
For example, if I wanted to create a stream in nsBrowserApp.cpp and then use
that stream from the other files what should I do?
Do I put:
extern MOZ_EXPORT std::stringstream FC_LOG_STREAM; in that file (or in the
header included from that file, and then i define the varible in the .cpp file)
and then use MOZ_IMPORT std::stringstream FC_LOG_STREAM; in the other
files/headers or?
Sorry for taking up your time, but getting into the source code of Firefox,
especially since I've done very little real world development in C++ is a bit
overwhelming. Any help will be appreciated!
Thank you
On Friday, October 24, 2014 7:26:00 PM UTC+2, Ehsan Akhgari wrote:
> It's hard to determine exactly what's happening because your post
> doesn't explain where you're using this variable, but note that extern
> variables cannot be used across module boundaries. For example,
> nsBrowserApp.cpp get compiled into firefox.exe, whereas most of our code
> gets compiled in xul.dll. If you define an extern variable somewhere in
> firefox.exe, you cannot use it from xul.dll. If you need this kind of
> cross module access, you need to export a function/variable from one
> module and import and call it in the other, using MOZ_EXPORT and
> MOZ_IMPORT_API and friends.
>
> On 2014-10-24 8:36 AM, Josip Maras wrote:
> > Hi,
> >
> > I'm extending the Firefox source in order to log some information during
> > web app execution, for example event, script executions, new element
> > creations, removals, attribute modifications, etc. Since these things occur
> > often, when I load a more demanding application (e.g. facebook), everything
> > hangs for a while, because there is a large number of relatively small
> > pieces of information being written to a file.
> >
> > Because of this, i was thinking of doing it in batches, having one global
> > extern stream variable where all longs are added to, and when enough
> > information gets accumulated to write it to a file, and avoid these
> > hangings.
> >
> > Since I'm a noob C++ "programmer" I will paste some code of what i've done,
> > just in case:
> >
> > I have one header file with the extern variable:
> >
> > -- FC_ExternStreamDeclaration.h --
> >
> > #ifndef FC_EXTERN_VAR_DECL_H
> > #define FC_EXTERN_VAR_DECL_H
> >
> > #include <stdio.h>
> > #include <sstream>
> > #include <fstream>
> >
> > extern std::stringstream FC_LOG_STREAM;
> >
> > #endif //FC_EXTERN_VAR_DECL_H
> >
> >
> > and one header with the logging functionality
> >
> > -- FC_Log.h --
> >
> > #pragma once
> > #ifndef FC_LOG_H
> > #define FC_LOG_H
> >
> > #include <stdio.h>
> > #include <sstream>
> > #include <fstream>
> >
> > #include "FC_ExternStreamDeclaration.h"
> >
> > inline void WriteToStream(const char** fragments, int length)
> > {
> > //add to stream
> > //if stream big enough write to file
> > }
> > #endif //FC_LOG_H
> >
> > and in nsBrowserApp.cpp where the main function is defined, i define the
> > variable and include the headers
> >
> > ----- nsBrowserApp.cpp ---
> >
> > #include "FC_ExternStreamDeclaration.h"
> > #include "FC_Log.h"
> >
> > std::stringstream FC_LOG_STREAM;
> >
> > And then, in each file from which i do logging, i include the header files
> > and call the WriteToStream function. For example, I'm doing it from
> > Interpreter.cpp, Eval.cpp, nsINode.h, etc. (all over the code).
> >
> > And i thought that this will be enough. However, i get: error LNK2001
> > unresolved external symbol stringstream FC_LOG_STREAM. If i define it
> > there, the compilation succeeds, but I effectively get two different
> > streams, one for the JavaScript execution, and the other for the DOM and
> > the rest of the browser.
> >
> > I'm thinking this happens because these variables are in different dlls.
> > I would be grateful for any tips about fixing it.
> > Sorry for the long question.
> >
> > Thank you,
> >
> > Josip
> > _______________________________________________
> > dev-platform mailing list
> > [email protected]
> > https://lists.mozilla.org/listinfo/dev-platform
> >
_______________________________________________
dev-platform mailing list
[email protected]
https://lists.mozilla.org/listinfo/dev-platform