On 04/05/2013 01:52 PM, Lukas Slebodnik wrote:
On (02/04/13 17:44), Ondrej Kos wrote:
https://fedorahosted.org/sssd/ticket/1855
I couldn't let it this way when I saw the code :)
Patch is attached
Ondra
--
Ondrej Kos
Associate Software Engineer
Identity Management
Red Hat Czech
phone: +420-532-294-558
cell: +420-736-417-909
ext: 82-62558
loc: 1013 Brno 1 office
irc: okos @ #sssd #brno
diff --git a/dhash/dhash.h b/dhash/dhash.h
index
baa0d6aa88b767b63018127c4ac454922fdd77d8..7f44c57f8091c70766c9d7fccb166e81b377721e
100644
--- a/dhash/dhash.h
+++ b/dhash/dhash.h
@@ -133,6 +133,14 @@ typedef enum
HASH_ENTRY_DESTROY
} hash_destroy_enum;
+typedef enum {
+ HI_STATE_0,
+ HI_STATE_1,
+ HI_STATE_2,
+ HI_STATE_3A,
+ HI_STATE_3B
+} hash_iter_state;
+
This enum is only used in static function hash_iter_next().
It is unnecessarily to be available in public API.
I think that this typedef could be safety moved to implementation file dhash.c
typedef struct hash_key_t {
hash_key_enum type;
union {
--
1.8.1.4
Thanks for review Lukas,
New patch attached.
Ondra
--
Ondrej Kos
Associate Software Engineer
Identity Management
Red Hat Czech
From 19d878fbd42535b2dba2cf5f89eda2a09464c241 Mon Sep 17 00:00:00 2001
From: Ondrej Kos <o...@redhat.com>
Date: Tue, 2 Apr 2013 17:28:32 +0200
Subject: [PATCH] DHASH: Don't use backward jumps
https://fedorahosted.org/sssd/ticket/1855
---
dhash/dhash.c | 77 ++++++++++++++++++++++++++++++++++++++++++-----------------
1 file changed, 55 insertions(+), 22 deletions(-)
diff --git a/dhash/dhash.c b/dhash/dhash.c
index 72709afade903a9e6e2ccf5cf8876928da70f5ec..ab1bebcdf1627329d4d4bf27c0f9ce223725438c 100644
--- a/dhash/dhash.c
+++ b/dhash/dhash.c
@@ -124,6 +124,14 @@ struct _hash_iter_context_t {
element_t *p;
};
+enum hash_iter_state {
+ HI_STATE_0,
+ HI_STATE_1,
+ HI_STATE_2,
+ HI_STATE_3A,
+ HI_STATE_3B
+};
+
/*****************************************************************************/
/********************** External Function Declarations *********************/
/*****************************************************************************/
@@ -709,32 +717,57 @@ static hash_entry_t *hash_iter_next(struct hash_iter_context_t *iter_arg)
{
struct _hash_iter_context_t *iter = (struct _hash_iter_context_t *) iter_arg;
hash_entry_t *entry;
+ enum hash_iter_state state = HI_STATE_3A;
if (iter->table == NULL) return NULL;
- goto state_3a;
- state_1:
- iter->i++;
- if(iter->i >= iter->table->segment_count) return NULL;
- /* test probably unnecessary */
- iter->s = iter->table->directory[iter->i];
- if (iter->s == NULL) goto state_1;
- iter->j = 0;
- state_2:
- if (iter->j >= iter->table->segment_size) goto state_1;
- iter->p = iter->s[iter->j];
- state_3a:
- if (iter->p == NULL) goto state_3b;
- entry = &iter->p->entry;
- iter->p = iter->p->next;
+ while (state != HI_STATE_0) {
+
+ switch (state) {
+ case HI_STATE_1:
+ iter->i++;
+ if(iter->i >= iter->table->segment_count) return NULL;
+ /* test probably unnecessary */
+ iter->s = iter->table->directory[iter->i];
+ if (iter->s == NULL) {
+ state = HI_STATE_1;
+ break;
+ }
+ iter->j = 0;
+ state = HI_STATE_2;
+
+ case HI_STATE_2:
+ if (iter->j >= iter->table->segment_size) {
+ state = HI_STATE_1;
+ break;
+ }
+ iter->p = iter->s[iter->j];
+ state = HI_STATE_3A;
+
+ case HI_STATE_3A:
+ if (iter->p == NULL) {
+ state = HI_STATE_3B;
+ break;
+ }
+ entry = &iter->p->entry;
+ iter->p = iter->p->next;
+ state = HI_STATE_0;
+ break;
+
+ case HI_STATE_3B:
+ iter->j++;
+ state = HI_STATE_2;
+ break;
+
+ default:
+ /* Should never reach here */
+ fprintf(stderr, "ERROR hash_iter_next reached invalid state\n");
+ return NULL;
+ break;
+ }
+ }
+
return entry;
- state_3b:
- iter->j++;
- goto state_2;
-
- /* Should never reach here */
- fprintf(stderr, "ERROR hash_iter_next reached invalid state\n");
- return NULL;
}
struct hash_iter_context_t *new_hash_iter_context(hash_table_t *table)
--
1.8.1.4
_______________________________________________
sssd-devel mailing list
sssd-devel@lists.fedorahosted.org
https://lists.fedorahosted.org/mailman/listinfo/sssd-devel