]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
CLEANUP: pools: move the lock to the only __pool_get_first() that needs it
authorWilly Tarreau <w@1wt.eu>
Thu, 15 Apr 2021 17:48:44 +0000 (19:48 +0200)
committerWilly Tarreau <w@1wt.eu>
Mon, 19 Apr 2021 13:24:33 +0000 (15:24 +0200)
Now that __pool_alloc() only surrounds __pool_get_first() with the lock,
let's move it to the only variant that requires it and remove the ugly
ifdefs from the function. This is safe because nobody else calls this
function.

include/haproxy/pool.h

index 876668763f47721d67fefa2d36567ea53cd8fe51..a5c3619f7976e593ea0425de6155efa4f32588eb 100644 (file)
@@ -209,19 +209,25 @@ static inline void __pool_free(struct pool_head *pool, void *ptr)
  * Returns a pointer to type <type> taken from the pool <pool_type> if
  * available, otherwise returns NULL. No malloc() is attempted, and poisonning
  * is never performed. The purpose is to get the fastest possible allocation.
+ * This version takes the pool's lock in order to do this.
  */
 static inline void *__pool_get_first(struct pool_head *pool)
 {
        void *p;
 
+       HA_SPIN_LOCK(POOL_LOCK, &pool->lock);
        if ((p = pool->free_list) != NULL) {
                pool->free_list = *POOL_LINK(pool, p);
                pool->used++;
+       }
+       HA_SPIN_UNLOCK(POOL_LOCK, &pool->lock);
+
 #ifdef DEBUG_MEMORY_POOLS
+       if (p) {
                /* keep track of where the element was allocated from */
                *POOL_LINK(pool, p) = (void *)pool;
-#endif
        }
+#endif
        return p;
 }
 
@@ -274,13 +280,7 @@ static inline void *__pool_alloc(struct pool_head *pool, unsigned int flags)
                goto ret;
 #endif
 
-#if !defined(CONFIG_HAP_LOCKLESS_POOLS) && !defined(CONFIG_HAP_NO_GLOBAL_POOLS)
-       HA_SPIN_LOCK(POOL_LOCK, &pool->lock);
-#endif
        p = __pool_get_first(pool);
-#if !defined(CONFIG_HAP_LOCKLESS_POOLS) && !defined(CONFIG_HAP_NO_GLOBAL_POOLS)
-       HA_SPIN_UNLOCK(POOL_LOCK, &pool->lock);
-#endif
        if (!p)
                p = pool_alloc_nocache(pool);
  ret: