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

Reply via email to