[spirit] Segmentation fault when parsing grammar with threads
Hi out there, after searching for the cause of segmentation faults in my program i figured out that it happens while parsing my grammar with spirit. But this happens only if i run multiple threads, with only one thread all works as expected. I used the current boost trunk, gcc 4.1.2 and option D_REENTRANT Does anybody have a clue what happens inside parse(...) that could cause this segfault? Best regards Andi calling code: ('buf' is a zero-terminated string) -------------------------------------------------------- HttpRequestGrammar parser; parse_info<const char*> parserInfo = parse(buf, parser); my grammar: (cutted some rules to limit length ;-)) -------------------------------------------------------- #ifndef BASIC_HTTP_GRAMMAR_H_ #define BASIC_HTTP_GRAMMAR_H_ #include <boost/spirit/core.hpp> #include <boost/spirit/actor/assign_actor.hpp> #include <boost/spirit/actor/insert_at_actor.hpp> using namespace boost::spirit; struct HttpRequestGrammar : public grammar<HttpRequestGrammar> { template <typename ScannerT> struct definition { definition(HttpRequestGrammar const& self) { first = ( request = *( SP | CRLF ) >> requestLine >> CRLF >> *(( generalHeader | requestHeader | entityHeader ) >> CRLF) >> CRLF, requestLine = method[insert_at_a(self.headerMap, "method")] >> SP >> requestUri[insert_at_a(self.headerMap, "url")] >> SP >> httpVersion[insert_at_a(self.headerMap, "version")], method = str_p("GET") | "HEAD", ... .. token = +graph_p, SP = str_p(" "), CRLF = str_p("\r\n") ); } subrule<0> request; subrule<1> requestLine; subrule<2> generalHeader; ... .. subrule<1000> SP; subrule<1001> CRLF; rule<ScannerT> first; rule<ScannerT> const& start() const { return first; } }; mutable std::map<std::string, std::string> headerMap; }; #endif /*BASIC_HTTP_GRAMMAR_H_*/
In case you don't get an answer here you might try posting on the boost spirit general mailing list. Jeff Flinn Andreas Bruckmeier wrote:
Hi out there,
after searching for the cause of segmentation faults in my program i figured out that it happens while parsing my grammar with spirit. But this happens only if i run multiple threads, with only one thread all works as expected.
I used the current boost trunk, gcc 4.1.2 and option D_REENTRANT
Does anybody have a clue what happens inside parse(...) that could cause this segfault?
Best regards Andi
calling code: ('buf' is a zero-terminated string) -------------------------------------------------------- HttpRequestGrammar parser; parse_info<const char*> parserInfo = parse(buf, parser);
my grammar: (cutted some rules to limit length ;-)) -------------------------------------------------------- #ifndef BASIC_HTTP_GRAMMAR_H_ #define BASIC_HTTP_GRAMMAR_H_
#include <boost/spirit/core.hpp> #include <boost/spirit/actor/assign_actor.hpp> #include <boost/spirit/actor/insert_at_actor.hpp>
using namespace boost::spirit;
struct HttpRequestGrammar : public grammar<HttpRequestGrammar> {
template <typename ScannerT> struct definition {
definition(HttpRequestGrammar const& self) { first = (
request = *( SP | CRLF ) >> requestLine >> CRLF >> *(( generalHeader | requestHeader | entityHeader ) >> CRLF) >> CRLF,
requestLine = method[insert_at_a(self.headerMap, "method")] >> SP >> requestUri[insert_at_a(self.headerMap, "url")] >> SP >> httpVersion[insert_at_a(self.headerMap, "version")],
method = str_p("GET") | "HEAD", ... .. token = +graph_p, SP = str_p(" "), CRLF = str_p("\r\n") ); }
subrule<0> request; subrule<1> requestLine; subrule<2> generalHeader; ... .. subrule<1000> SP; subrule<1001> CRLF;
rule<ScannerT> first; rule<ScannerT> const&
start() const { return first; }
};
mutable std::map<std::string, std::string> headerMap; };
#endif /*BASIC_HTTP_GRAMMAR_H_*/
participants (2)
-
Andreas Bruckmeier
-
Jeff Flinn