internal: make nondestructible global static_parser 90/198090/3 accepted/tizen/unified/20190128.061341 submit/tizen/20190121.031835
authorAdrian Szyndela <adrian.s@samsung.com>
Fri, 18 Jan 2019 11:36:18 +0000 (12:36 +0100)
committerHyotaek Shim <hyotaek.shim@samsung.com>
Mon, 21 Jan 2019 03:13:40 +0000 (12:13 +0900)
This should help with destructing global variable
while using it in other thread.

Multi-threaded daemons often kill the main thread before killing the other threads.
This patch prevents instance memory release when the main thread exits.
, and thus required to avoid crash on released memory.

.#0  ldp_xml_parser::ItemBuilder::~ItemBuilder (this=0xb67a980c <ldp_xml_parser::static_parser>, __in_chrg=<optimized out>) at src/internal/policy.cpp:510
.#1  0xb67a5de8 in ldp_xml_parser::XmlParser::~XmlParser (this=0xb67a980c <ldp_xml_parser::static_parser>, __in_chrg=<optimized out>) at /usr/lib/gcc/armv7l-tizen-linux-gnueabi/6.2.1/include/c++/ext/new_allocator.h:110
.#2  0xb695806c in __cxa_finalize (d=0xb67a9438) at cxa_finalize.c:83
.#3  0xb679bcea in __do_global_dtors_aux () from /lib/libdbuspolicy1.so.1
.#4  0xb6fdfa1c in _dl_fini () at dl-fini.c:235
.#5  0xb6957a44 in __run_exit_handlers (status=<optimized out>, listp=<optimized out>, run_list_atexit=run_list_atexit@entry=true, run_dtors=run_dtors@entry=true) at exit.c:106
.#6  0xb6957b6c in __GI_exit (status=<optimized out>) at exit.c:137
.#7  0xb6940640 in __libc_start_main (main=0xbefffe44, argc=-1230635008, argv=0xb6940640 <__libc_start_main+280>, init=<optimized out>, fini=0x7f55f69c <__libc_csu_fini>, rtld_fini=0xb6fdf7e4 <_dl_fini>, stack_end=0xbefffe44)
.    at libc-start.c:323
.#8  0x7f5589e0 in _start () at ../sysdeps/arm/start.S:110

Change-Id: I0cc0a2623eee688b0498fccacb8a2bc219fd3a94
Signed-off-by: Hyotaek Shim <hyotaek.shim@samsung.com>
src/internal/global_nodestruct.hpp [new file with mode: 0644]
src/internal/internal.cpp
src/internal/naive_policy_checker.hpp
src/internal/xml_parser.cpp
src/internal/xml_parser.hpp

diff --git a/src/internal/global_nodestruct.hpp b/src/internal/global_nodestruct.hpp
new file mode 100644 (file)
index 0000000..6bc7fe7
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2015-2019 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+/**
+ * \file
+ * \ingroup Implementation
+ */
+
+
+#ifndef GLOBAL_NODESTRUCT_HPP
+#define GLOBAL_NODESTRUCT_HPP
+
+/** Declare a global variable that is constructed (via gcc's __attribute__((constructor))) but never destroyed. */
+#define DCL_NODESTRUCT_GLOBAL(TYPE,NAME)\
+       namespace detail_NODESTRUCT_GLOBAL { alignas(TYPE) extern uint8_t NAME[sizeof(TYPE)]; }\
+       /* awkwardly written to silence gcc's -Wstrict-aliasing because _Pragma("GCC diagnostic ignored \"-Wstrict-aliasing\"") is bugged */\
+       static inline TYPE &NAME() { auto p = static_cast<void*>(&detail_NODESTRUCT_GLOBAL::NAME[0]); return *reinterpret_cast<TYPE*>(p); }\
+       namespace detailInit_NODESTRUCT_GLOBAL { __attribute__((constructor)) static void NAME() { new(&::NAME()) TYPE(); } }
+
+/** Define a global variable that is constructed (via gcc's __attribute__((constructor))) but never destroyed. */
+#define DEF_NODESTRUCT_GLOBAL(TYPE,NAME)\
+       namespace detail_NODESTRUCT_GLOBAL { alignas(TYPE) uint8_t NAME[sizeof(TYPE)]; }
+
+
+#endif // GLOBAL_NODESTRUCT_HPP
index 8100483..78b8dc1 100755 (executable)
@@ -35,7 +35,7 @@ static const char* get_str(const char* const szstr) {
 int __internal_init(bool bus_type, const char* const config_name)
 {
        policy_checker().clearDb(bus_type);
-       auto err = ldp_xml_parser::static_parser.parsePolicy(bus_type, get_str(config_name));
+       auto err = static_parser().parsePolicy(bus_type, get_str(config_name));
        if (tslog::enabled())
                memory_dump(bus_type);
        return err;
@@ -64,7 +64,7 @@ void __internal_init_flush_logs()
 
 void __internal_init_sup_group(bool bus_type, uid_t uid, gid_t gid)
 {
-       ldp_xml_parser::static_parser.updateGroupPolicy(bus_type, uid, gid);
+       static_parser().updateGroupPolicy(bus_type, uid, gid);
 }
 
 void __internal_enter()
index d4379cc..c15eab0 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "policy.hpp"
 #include "naive_policy_db.hpp"
+#include "global_nodestruct.hpp"
 
 namespace ldp_xml_parser
 {
@@ -170,18 +171,6 @@ namespace ldp_xml_parser
        };
 }
 
-/** Declare a global variable that is constructed (via gcc's __attribute__((constructor))) but never destroyed. */
-#define DCL_NODESTRUCT_GLOBAL(TYPE,NAME)\
-       namespace detail_NODESTRUCT_GLOBAL { alignas(TYPE) extern uint8_t NAME[sizeof(TYPE)]; }\
-       /* awkwardly written to silence gcc's -Wstrict-aliasing because _Pragma("GCC diagnostic ignored \"-Wstrict-aliasing\"") is bugged */\
-       static inline TYPE &NAME() { auto p = static_cast<void*>(&detail_NODESTRUCT_GLOBAL::NAME[0]); return *reinterpret_cast<TYPE*>(p); }\
-       namespace detailInit_NODESTRUCT_GLOBAL { __attribute__((constructor)) static void NAME() { new(&::NAME()) TYPE(); } }
-
-/** Define a global variable that is constructed (via gcc's __attribute__((constructor))) but never destroyed. */
-#define DEF_NODESTRUCT_GLOBAL(TYPE,NAME)\
-       namespace detail_NODESTRUCT_GLOBAL { alignas(TYPE) uint8_t NAME[sizeof(TYPE)]; }
-
-
 DCL_NODESTRUCT_GLOBAL(ldp_xml_parser::NaivePolicyChecker, policy_checker)
 
 #endif
index 25cc199..03d6a13 100644 (file)
@@ -49,7 +49,7 @@ void parseAssert(bool condition) {
 
 void start_element_handler(void *data, const char *el, const char **attr) {
        (void)data;
-       XmlParser& parser = static_parser;
+       XmlParser& parser = static_parser();
        try {
                parser.elementStart(el, attr);
        } catch (...) {
@@ -60,7 +60,7 @@ void start_element_handler(void *data, const char *el, const char **attr) {
 
 void end_element_handler(void *data, const char *el) {
        (void)data;
-       XmlParser& parser = static_parser;
+       XmlParser& parser = static_parser();
        try {
                parser.elementEnd(el);
        } catch (...) {
@@ -71,7 +71,7 @@ void end_element_handler(void *data, const char *el) {
 
 void text_handler(void *data, const char *text, int len) {
        (void)data;
-       XmlParser& parser = static_parser;
+       XmlParser& parser = static_parser();
        try {
                parser.text(text, len);
        } catch (...) {
@@ -297,4 +297,4 @@ void XmlParser::getIncludedFiles(const std::string& parent_dir, const std::strin
        }
 }
 
-ldp_xml_parser::XmlParser ldp_xml_parser::static_parser;
+DEF_NODESTRUCT_GLOBAL(ldp_xml_parser::XmlParser, static_parser);
index 3cf7899..2369c61 100755 (executable)
@@ -24,6 +24,7 @@
 #include <set>
 #include <boost/noncopyable.hpp>
 #include "policy.hpp"
+#include "global_nodestruct.hpp"
 
 namespace ldp_xml_parser
 {
@@ -81,7 +82,8 @@ namespace ldp_xml_parser
                std::vector<std::string> included_files;
        };
 
-       extern XmlParser static_parser;
 } //namespace
 
+DCL_NODESTRUCT_GLOBAL(ldp_xml_parser::XmlParser, static_parser)
+
 #endif