diff options
author | Denys Vlasenko <dvlasenk@redhat.com> | 2010-12-06 16:56:50 +0100 |
---|---|---|
committer | Denys Vlasenko <dvlasenk@redhat.com> | 2010-12-06 16:56:50 +0100 |
commit | 47728cc3c70c2b6d3a645e5760b39b20bd946e39 (patch) | |
tree | 6fd64dc8d124d5a10dd4efddd69a71f921f4a1d1 /src/include | |
parent | 300a498bdc7b2912f8aaebeb87a7b4cc0a9970a5 (diff) | |
download | abrt-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.h | 12 | ||||
-rw-r--r-- | src/include/abrtlib.h | 8 | ||||
-rw-r--r-- | src/include/crash_dump.h | 94 |
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 |