From cf7f53ebbc8caf63a1a84d3b55cc2c70ac8056a7 Mon Sep 17 00:00:00 2001 From: caro Date: Sat, 6 Jun 2009 04:22:21 +0000 Subject: [PATCH] Fix init error handling of array, benchmark, counter,main, rectangle and stringshare modules. Patch by Andre Dieb, modified by me (formatting and fix for the Windows code in eina_counter) git-svn-id: http://svn.enlightenment.org/svn/e/trunk/eina@40915 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- AUTHORS | 2 +- src/lib/eina_array.c | 47 ++++++++++++++++++----------- src/lib/eina_benchmark.c | 24 +++++++++++++-- src/lib/eina_counter.c | 8 +++-- src/lib/eina_main.c | 74 ++++++++++++++++++++++++++++++++++++++++------ src/lib/eina_rectangle.c | 26 ++++++++++++---- src/lib/eina_stringshare.c | 44 ++++++++++++++++----------- 7 files changed, 170 insertions(+), 55 deletions(-) diff --git a/AUTHORS b/AUTHORS index 52ded6f..48ff69a 100644 --- a/AUTHORS +++ b/AUTHORS @@ -9,4 +9,4 @@ Peter "pfritz" Wehrfritz Arnaud de Turckheim "quarium" Alexandre "diaxen" Becoulet Albin Tonnerre -Andre Dieb +Andre Dieb diff --git a/src/lib/eina_array.c b/src/lib/eina_array.c index 5ae254e..688fa4b 100644 --- a/src/lib/eina_array.c +++ b/src/lib/eina_array.c @@ -148,6 +148,7 @@ #include #include #include +#include #include "eina_types.h" #include "eina_error.h" @@ -358,24 +359,34 @@ eina_array_grow(Eina_Array *array) EAPI int eina_array_init(void) { - if (!_eina_array_init_count) - { - eina_error_init(); - eina_magic_string_init(); - - eina_magic_string_set(EINA_MAGIC_ITERATOR, - "Eina Iterator"); - eina_magic_string_set(EINA_MAGIC_ACCESSOR, - "Eina Accessor"); - eina_magic_string_set(EINA_MAGIC_ARRAY, - "Eina Array"); - eina_magic_string_set(EINA_MAGIC_ARRAY_ITERATOR, - "Eina Array Iterator"); - eina_magic_string_set(EINA_MAGIC_ARRAY_ACCESSOR, - "Eina Array Accessor"); - } - - return ++_eina_array_init_count; + if (!_eina_array_init_count) + { + if (!eina_error_init()) + { + fprintf(stderr, "Could not initialize eina error module.\n"); + return 0; + } + + if (!eina_magic_string_init()) + { + EINA_ERROR_PERR("ERROR: Could not initialize eina magic string module.\n"); + eina_error_shutdown(); + return 0; + } + + eina_magic_string_set(EINA_MAGIC_ITERATOR, + "Eina Iterator"); + eina_magic_string_set(EINA_MAGIC_ACCESSOR, + "Eina Accessor"); + eina_magic_string_set(EINA_MAGIC_ARRAY, + "Eina Array"); + eina_magic_string_set(EINA_MAGIC_ARRAY_ITERATOR, + "Eina Array Iterator"); + eina_magic_string_set(EINA_MAGIC_ARRAY_ACCESSOR, + "Eina Array Accessor"); + } + + return ++_eina_array_init_count; } /** diff --git a/src/lib/eina_benchmark.c b/src/lib/eina_benchmark.c index 50b9c44..c63776a 100644 --- a/src/lib/eina_benchmark.c +++ b/src/lib/eina_benchmark.c @@ -145,11 +145,29 @@ eina_benchmark_init(void) if (_eina_benchmark_count > 1) return _eina_benchmark_count; - eina_error_init(); - eina_array_init(); - eina_counter_init(); + if (!eina_error_init()) + { + fprintf(stderr, "Could not initialize eina error module.\n"); + return 0; + } + if (!eina_array_init()) + { + EINA_ERROR_PERR("Could not initialize eina array module.\n"); + goto array_init_error; + } + if (!eina_counter_init()) + { + EINA_ERROR_PERR("Could not initialize eina counter module.\n"); + goto counter_init_error; + } return _eina_benchmark_count; + + counter_init_error: + eina_array_shutdown(); + array_init_error: + eina_error_shutdown(); + return 0; } /** diff --git a/src/lib/eina_counter.c b/src/lib/eina_counter.c index 49055d1..51871ef 100644 --- a/src/lib/eina_counter.c +++ b/src/lib/eina_counter.c @@ -252,12 +252,16 @@ eina_counter_init(void) if (_eina_counter_init_count == 1) { - eina_error_init(); + if (!eina_error_init()) + { + fprintf(stderr, "Could not initialize eina error module.\n"); + return 0; + } #ifdef _WIN32 if (!QueryPerformanceFrequency(&_eina_counter_frequency)) { EINA_COUNTER_ERROR_WINDOWS = eina_error_msg_register("Change your OS, you moron !"); - _eina_counter_init_count--; + eina_error_shutdown(); return 0; } #endif /* _WIN2 */ diff --git a/src/lib/eina_main.c b/src/lib/eina_main.c index bb28d23..cec96bc 100644 --- a/src/lib/eina_main.c +++ b/src/lib/eina_main.c @@ -16,6 +16,8 @@ * if not, see . */ +#include + #ifdef HAVE_CONFIG_H # include "config.h" #endif @@ -47,18 +49,72 @@ eina_init(void) { if (_eina_main_count) goto finish_init; - eina_error_init(); - eina_hash_init(); - eina_stringshare_init(); - eina_list_init(); - eina_array_init(); - eina_counter_init(); - eina_benchmark_init(); - eina_magic_string_init(); - eina_rectangle_init(); + if (!eina_error_init()) + { + fprintf(stderr, "Could not initialize eina error module.\n"); + return 0; + } + if (!eina_hash_init()) + { + EINA_ERROR_PERR("Could not initialize eina hash module.\n"); + goto hash_init_error; + } + if (!eina_stringshare_init()) + { + EINA_ERROR_PERR("Could not initialize eina stringshare module.\n"); + goto stringshare_init_error; + } + if (!eina_list_init()) + { + EINA_ERROR_PERR("Could not initialize eina list module.\n"); + goto list_init_error; + } + if (!eina_array_init()) + { + EINA_ERROR_PERR("Could not initialize eina array module.\n"); + goto array_init_error; + } + if (!eina_counter_init()) + { + EINA_ERROR_PERR("Could not initialize eina counter module.\n"); + goto counter_init_error; + } + if (!eina_benchmark_init()) + { + EINA_ERROR_PERR("Could not initialize eina benchmark module.\n"); + goto benchmark_init_error; + } + if (!eina_magic_string_init()) + { + EINA_ERROR_PERR("Could not initialize eina magic string module.\n"); + goto magic_string_init_error; + } + if (!eina_rectangle_init()) + { + EINA_ERROR_PERR("Could not initialize eina rectangle module.\n"); + goto rectangle_init_error; + } finish_init: return ++_eina_main_count; + + rectangle_init_error: + eina_magic_string_shutdown(); + magic_string_init_error: + eina_benchmark_shutdown(); + benchmark_init_error: + eina_counter_shutdown(); + counter_init_error: + eina_array_shutdown(); + array_init_error: + eina_list_shutdown(); + list_init_error: + eina_stringshare_shutdown(); + stringshare_init_error: + eina_hash_shutdown(); + hash_init_error: + eina_error_shutdown(); + return 0; } EAPI int diff --git a/src/lib/eina_rectangle.c b/src/lib/eina_rectangle.c index 79524a1..7638dc0 100644 --- a/src/lib/eina_rectangle.c +++ b/src/lib/eina_rectangle.c @@ -20,6 +20,7 @@ # include "config.h" #endif +#include #include #include "eina_rectangle.h" @@ -353,8 +354,16 @@ eina_rectangle_init(void) if (_eina_rectangle_init_count > 1) return _eina_rectangle_init_count; - eina_error_init(); - eina_mempool_init(); + if (!eina_error_init()) + { + fprintf(stderr, "Could not initialize eina error module.\n"); + return 0; + } + if (!eina_mempool_init()) + { + EINA_ERROR_PERR("Could not initialize eina mempool module.\n"); + goto mempool_init_error; + } #ifdef EINA_DEFAULT_MEMPOOL choice = "pass_through"; @@ -364,14 +373,21 @@ eina_rectangle_init(void) #endif _eina_rectangle_mp = eina_mempool_new(choice, "rectangle", NULL, - sizeof (Eina_Rectangle_Alloc) + sizeof (Eina_Rectangle), 42); + sizeof (Eina_Rectangle_Alloc) + sizeof (Eina_Rectangle), 42); if (!_eina_rectangle_mp) { - EINA_ERROR_PERR("ERROR: Mempool for rectangle cannot be allocated in list init.\n"); - abort(); + EINA_ERROR_PERR("ERROR: Mempool for rectangle cannot be allocated in list init.\n"); + goto init_error; } return _eina_rectangle_init_count; + + init_error: + eina_mempool_shutdown(); + mempool_init_error: + eina_error_shutdown(); + + return 0; } EAPI int diff --git a/src/lib/eina_stringshare.c b/src/lib/eina_stringshare.c index 04fcd86..a165768 100644 --- a/src/lib/eina_stringshare.c +++ b/src/lib/eina_stringshare.c @@ -825,23 +825,33 @@ eina_stringshare_init(void) */ if (!_eina_stringshare_init_count) { - share = calloc(1, sizeof(Eina_Stringshare)); - if (!share) - return 0; - - eina_error_init(); - eina_magic_string_init(); - - eina_magic_string_set(EINA_MAGIC_STRINGSHARE, - "Eina Stringshare"); - eina_magic_string_set(EINA_MAGIC_STRINGSHARE_HEAD, - "Eina Stringshare Head"); - eina_magic_string_set(EINA_MAGIC_STRINGSHARE_NODE, - "Eina Stringshare Node"); - EINA_MAGIC_SET(share, EINA_MAGIC_STRINGSHARE); - - _eina_stringshare_small_init(); - _eina_stringshare_population_init(); + share = calloc(1, sizeof(Eina_Stringshare)); + if (!share) + return 0; + + if (!eina_error_init()) + { + fprintf(stderr, "Could not initialize eina error module.\n"); + return 0; + } + + if (!eina_magic_string_init()) + { + EINA_ERROR_PERR("ERROR: Could not initialize eina magic string module.\n"); + eina_error_shutdown(); + return 0; + } + + eina_magic_string_set(EINA_MAGIC_STRINGSHARE, + "Eina Stringshare"); + eina_magic_string_set(EINA_MAGIC_STRINGSHARE_HEAD, + "Eina Stringshare Head"); + eina_magic_string_set(EINA_MAGIC_STRINGSHARE_NODE, + "Eina Stringshare Node"); + EINA_MAGIC_SET(share, EINA_MAGIC_STRINGSHARE); + + _eina_stringshare_small_init(); + _eina_stringshare_population_init(); } return ++_eina_stringshare_init_count; -- 2.7.4