summaryrefslogtreecommitdiffstats
path: root/src/include
diff options
context:
space:
mode:
authorDenys Vlasenko <dvlasenk@redhat.com>2010-12-06 16:56:50 +0100
committerDenys Vlasenko <dvlasenk@redhat.com>2010-12-06 16:56:50 +0100
commit47728cc3c70c2b6d3a645e5760b39b20bd946e39 (patch)
tree6fd64dc8d124d5a10dd4efddd69a71f921f4a1d1 /src/include
parent300a498bdc7b2912f8aaebeb87a7b4cc0a9970a5 (diff)
downloadabrt-47728cc3c70c2b6d3a645e5760b39b20bd946e39.tar.gz
abrt-47728cc3c70c2b6d3a645e5760b39b20bd946e39.tar.xz
abrt-47728cc3c70c2b6d3a645e5760b39b20bd946e39.zip
This patch changes crash data to use C structures.
The smallest data element is: struct crash_item { char *content; unsigned flags; }; where content is, eh, content, and flags is a bit flag field. crash_data_t is a map of crash_item's, implemented as a pointer to heap-allocated GHashTable. vector_of_crash_data_t is a vector of crash_data_t's, implemented as a pointer to heap-allocated GPtrArray. Most operations have light wrappers around them to hide the nature of the containers. For example, to free vector_of_crash_data, you need to use free_vector_of_crash_data(ptr) instead of open-coding g_ptr_array_free. The wrapper is thin. The goal is not so much to hide the implementation, but more to make it easier to use the correct function. dbus (un)marshalling functions convert crash_item to three-element array of strings, in order to keep compatibility with abrt-gui (python). This can be changed later to use native representation. crash_data_t and vector_of_crash_data_t are represented in "natural" way, no funny stuff there. Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Diffstat (limited to 'src/include')
-rw-r--r--src/include/abrt_crash_dump.h12
-rw-r--r--src/include/abrtlib.h8
-rw-r--r--src/include/crash_dump.h94
3 files changed, 67 insertions, 47 deletions
diff --git a/src/include/abrt_crash_dump.h b/src/include/abrt_crash_dump.h
index fe924256..3a23285a 100644
--- a/src/include/abrt_crash_dump.h
+++ b/src/include/abrt_crash_dump.h
@@ -77,18 +77,10 @@ extern "C" {
bool is_editable_file(const char *file_name);
+void log_map_crash_data(crash_data_t *crash_data, const char *pfx);
+
#ifdef __cplusplus
}
#endif
-
-#ifdef __cplusplus
-
-typedef std::vector<map_crash_data_t> vector_map_crash_data_t;
-
-void log_map_crash_data(const map_crash_data_t& data, const char *name);
-
-#endif /* __cplusplus */
-
-
#endif
diff --git a/src/include/abrtlib.h b/src/include/abrtlib.h
index cb2755b0..1fadd31a 100644
--- a/src/include/abrtlib.h
+++ b/src/include/abrtlib.h
@@ -237,10 +237,10 @@ std::string to_string(T x)
void parse_args(const char *psArgs, vector_string_t& pArgs, int quote = -1);
void parse_release(const char *pRelease, char **product, char **version);
-char* make_description_bz(const map_crash_data_t& pCrashData);
-char* make_description_reproduce_comment(const map_crash_data_t& pCrashData);
-char* make_description_logger(const map_crash_data_t& pCrashData);
-char* make_description_mailx(const map_crash_data_t& pCrashData);
+char* make_description_bz(crash_data_t *crash_data);
+char* make_description_reproduce_comment(crash_data_t *crash_data);
+char* make_description_logger(crash_data_t *crash_data);
+char* make_description_mailx(crash_data_t *crash_data);
/**
* Loads settings and stores it in second parameter. On success it
diff --git a/src/include/crash_dump.h b/src/include/crash_dump.h
index ab7835b4..10ddc885 100644
--- a/src/include/crash_dump.h
+++ b/src/include/crash_dump.h
@@ -19,54 +19,82 @@
#ifndef CRASH_DUMP_H_
#define CRASH_DUMP_H_
+#include <glib.h>
-// Crash data is a map of 3-element vectors of strings: type, editable, content
-#define CD_TYPE 0
-#define CD_EDITABLE 1
-#define CD_CONTENT 2
-
-// SYS - system value, should not be displayed
-// BIN - binary data
-// TXT - text data, can be displayed
-#define CD_SYS "s"
-#define CD_BIN "b"
-#define CD_TXT "t"
-
-#define CD_ISEDITABLE "y"
-#define CD_ISNOTEDITABLE "n"
+#ifdef __cplusplus
+extern "C" {
+#endif
struct dump_dir;
-#ifdef __cplusplus
+enum {
+ CD_FLAG_SYS = (1 << 0),
+ CD_FLAG_BIN = (1 << 1),
+ CD_FLAG_TXT = (1 << 2),
+ CD_FLAG_ISEDITABLE = (1 << 3),
+ CD_FLAG_ISNOTEDITABLE = (1 << 4),
+};
-#include <map>
-#include <vector>
-#include <string>
+struct crash_item {
+ char *content;
+ unsigned flags;
+};
+typedef struct crash_item crash_item;
/* In-memory crash data structure and accessors */
-typedef std::map<std::string, std::vector<std::string> > map_crash_data_t;
+typedef GHashTable crash_data_t;
+
+crash_data_t *new_crash_data(void);
+
+static inline void free_crash_data(crash_data_t *crash_data)
+{
+ if (crash_data)
+ g_hash_table_destroy(crash_data);
+}
+
+void add_to_crash_data_ext(crash_data_t *crash_data,
+ const char *name,
+ const char *content,
+ unsigned flags);
+/* Uses CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE flags */
+void add_to_crash_data(crash_data_t *crash_data,
+ const char *name,
+ const char *content);
+
+static inline struct crash_item *get_crash_data_item_or_NULL(crash_data_t *crash_data, const char *key)
+{
+ return (struct crash_item *)g_hash_table_lookup(crash_data, key);
+}
+const char *get_crash_item_content_or_NULL(crash_data_t *crash_data, const char *key);
+/* Aborts if key is not found: */
+const char *get_crash_item_content_or_die(crash_data_t *crash_data, const char *key);
-void add_to_crash_data_ext(map_crash_data_t& pCrashData,
- const char *pItem,
- const char *pType,
- const char *pEditable,
- const char *pContent);
-/* Uses type:CD_TXT, editable:CD_ISNOTEDITABLE */
-void add_to_crash_data(map_crash_data_t& pCrashData,
- const char *pItem,
- const char *pContent);
-const char *get_crash_data_item_content_or_NULL(const map_crash_data_t& crash_data, const char *key);
-/* Aborts if key is not found: */
-const std::string& get_crash_data_item_content(const map_crash_data_t& crash_data, const char *key);
+/* Vector of these structures */
+
+typedef GPtrArray vector_of_crash_data_t;
+
+static inline crash_data_t *get_crash_data(vector_of_crash_data_t *vector, unsigned i)
+{
+ return (crash_data_t *)g_ptr_array_index(vector, i);
+}
+
+vector_of_crash_data_t *new_vector_of_crash_data(void);
+static inline void free_vector_of_crash_data(vector_of_crash_data_t *vector)
+{
+ if (vector)
+ g_ptr_array_free(vector, TRUE);
+}
/* Conversions between in-memory and on-disk formats */
-void load_crash_data_from_crash_dump_dir(struct dump_dir *dd, map_crash_data_t& data);
-struct dump_dir *create_crash_dump_dir(const map_crash_data_t& crash_data);
+crash_data_t *load_crash_data_from_crash_dump_dir(struct dump_dir *dd);
+struct dump_dir *create_crash_dump_dir(crash_data_t *crash_data);
+#ifdef __cplusplus
+}
#endif
#endif