diff options
author | simonb <simonb> | 2006-04-22 12:16:38 (GMT) |
---|---|---|
committer | simonb <simonb> | 2006-04-22 12:16:38 (GMT) |
commit | de4dfdad163abaff265adde0af4ff48e7424d7af (patch) | |
tree | 7c747ac158803e3d452b9570f0bbb70c279d851d | |
parent | 1028f4cb51ea998f475ec9ffc61aac164d0ca793 (diff) | |
download | fluxbox_lack-de4dfdad163abaff265adde0af4ff48e7424d7af.zip fluxbox_lack-de4dfdad163abaff265adde0af4ff48e7424d7af.tar.bz2 |
fix static management of CommandParser, sf.net 1474444
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | src/CommandParser.cc | 19 | ||||
-rw-r--r-- | src/CommandParser.hh | 5 |
3 files changed, 24 insertions, 3 deletions
@@ -1,6 +1,9 @@ | |||
1 | (Format: Year/Month/Day) | 1 | (Format: Year/Month/Day) |
2 | Changes for 0.9.16: | 2 | Changes for 0.9.16: |
3 | *06/04/22: | 3 | *06/04/22: |
4 | * static CommandParser could be used after destruction (Simon) | ||
5 | Fixes sf.net #1474444, segfault when DISPLAY not set | ||
6 | CommmandParser.hh/cc | ||
4 | * Minor cosmetic changes, thanks Semushin Slava (php-coder AT ngs ru) | 7 | * Minor cosmetic changes, thanks Semushin Slava (php-coder AT ngs ru) |
5 | main.cc Screen.cc util/startfluxbox.in | 8 | main.cc Screen.cc util/startfluxbox.in |
6 | * First draft of new docs in docs/asciidoc (Mathias) | 9 | * First draft of new docs in docs/asciidoc (Mathias) |
diff --git a/src/CommandParser.cc b/src/CommandParser.cc index 6fcb771..1f8218e 100644 --- a/src/CommandParser.cc +++ b/src/CommandParser.cc | |||
@@ -32,6 +32,9 @@ using std::vector; | |||
32 | using FbTk::StringUtil::removeFirstWhitespace; | 32 | using FbTk::StringUtil::removeFirstWhitespace; |
33 | using FbTk::StringUtil::toLower; | 33 | using FbTk::StringUtil::toLower; |
34 | 34 | ||
35 | |||
36 | CommandParser *CommandParser::s_singleton = 0; | ||
37 | |||
35 | CommandFactory::CommandFactory() { | 38 | CommandFactory::CommandFactory() { |
36 | 39 | ||
37 | } | 40 | } |
@@ -39,15 +42,24 @@ CommandFactory::CommandFactory() { | |||
39 | CommandFactory::~CommandFactory() { | 42 | CommandFactory::~CommandFactory() { |
40 | // remove all associations with this factory | 43 | // remove all associations with this factory |
41 | CommandParser::instance().removeAssociation(*this); | 44 | CommandParser::instance().removeAssociation(*this); |
45 | |||
42 | } | 46 | } |
43 | 47 | ||
44 | void CommandFactory::addCommand(const string &command_name) { | 48 | void CommandFactory::addCommand(const string &command_name) { |
45 | CommandParser::instance().associateCommand(command_name, *this); | 49 | CommandParser::instance().associateCommand(command_name, *this); |
46 | } | 50 | } |
47 | 51 | ||
52 | // ensure it is singleton | ||
53 | CommandParser::CommandParser() { | ||
54 | if (s_singleton != 0) | ||
55 | throw std::string("CommandParser currently meant ot be singleton"); | ||
56 | } | ||
57 | |||
48 | CommandParser &CommandParser::instance() { | 58 | CommandParser &CommandParser::instance() { |
49 | static CommandParser singleton; | 59 | if (s_singleton == 0) |
50 | return singleton; | 60 | s_singleton = new CommandParser(); |
61 | |||
62 | return *s_singleton; | ||
51 | } | 63 | } |
52 | 64 | ||
53 | FbTk::Command *CommandParser::parseLine(const string &line) { | 65 | FbTk::Command *CommandParser::parseLine(const string &line) { |
@@ -105,4 +117,7 @@ void CommandParser::removeAssociation(CommandFactory &factory) { | |||
105 | m_commandfactorys.erase(commands.back()); | 117 | m_commandfactorys.erase(commands.back()); |
106 | commands.pop_back(); | 118 | commands.pop_back(); |
107 | } | 119 | } |
120 | |||
121 | if (m_commandfactorys.empty()) | ||
122 | delete s_singleton; | ||
108 | } | 123 | } |
diff --git a/src/CommandParser.hh b/src/CommandParser.hh index 10f47aa..5501345 100644 --- a/src/CommandParser.hh +++ b/src/CommandParser.hh | |||
@@ -54,6 +54,8 @@ public: | |||
54 | /// @return parses and returns a command matching the line | 54 | /// @return parses and returns a command matching the line |
55 | FbTk::Command *parseLine(const std::string &line); | 55 | FbTk::Command *parseLine(const std::string &line); |
56 | 56 | ||
57 | CommandParser(); | ||
58 | |||
57 | /// @return instance of command parser | 59 | /// @return instance of command parser |
58 | static CommandParser &instance(); | 60 | static CommandParser &instance(); |
59 | /// @return map of factorys | 61 | /// @return map of factorys |
@@ -71,7 +73,8 @@ private: | |||
71 | const std::string &arguments); | 73 | const std::string &arguments); |
72 | 74 | ||
73 | CommandFactoryMap m_commandfactorys; ///< a string to factory map | 75 | CommandFactoryMap m_commandfactorys; ///< a string to factory map |
74 | 76 | ||
77 | static CommandParser *s_singleton; | ||
75 | }; | 78 | }; |
76 | 79 | ||
77 | #endif // COMMANDPARSER_HH | 80 | #endif // COMMANDPARSER_HH |