diff --git a/src/lib/eina/eina_abi.c b/src/lib/eina/eina_abi.c index dfd9622760..cdf0f9f450 100644 --- a/src/lib/eina/eina_abi.c +++ b/src/lib/eina/eina_abi.c @@ -30,3 +30,40 @@ EAPI Eina_Unicode eina_unicode_utf8_get_next(const char *buf, int *iindex) return eina_unicode_utf8_next_get(buf, iindex); } +EAPI unsigned int +eina_mempool_alignof(unsigned int size) +{ + unsigned int align; + unsigned int mask; + + if (EINA_UNLIKELY(size <= 2)) + { + align = 1; + mask = 0x1; + } + else if (EINA_UNLIKELY(size < 8)) + { + align = 2; + mask = 0x3; + } + else +#if __WORDSIZE == 32 + { + align = 3; + mask = 0x7; + } +#else + if (EINA_UNLIKELY(size < 16)) + { + align = 3; + mask = 0x7; + } + else + { + align = 4; + mask = 0x15; + } +#endif + + return ((size >> align) + (size & mask ? 1 : 0)) << align; +} diff --git a/src/lib/eina/eina_inline_mempool.x b/src/lib/eina/eina_inline_mempool.x index 40cd7d5be1..fc3dd00add 100644 --- a/src/lib/eina/eina_inline_mempool.x +++ b/src/lib/eina/eina_inline_mempool.x @@ -142,6 +142,38 @@ eina_mempool_free(Eina_Mempool *mp, void *element) mp->backend.free(mp->backend_data, element); } +static inline unsigned int +eina_mempool_alignof(unsigned int size) +{ + unsigned int align; + + if (EINA_UNLIKELY(size <= 2)) + { + align = 2; + } + else if (EINA_UNLIKELY(size < 8)) + { + align = 4; + } + else +#if __WORDSIZE == 32 + { + align = 8; + } +#else + if (EINA_UNLIKELY(size < 16)) + { + align = 8; + } + else + { + align = 16; + } +#endif + + return ((size / align) + (size % align ? 1 : 0)) * align; +} + /** * @} */ diff --git a/src/lib/eina/eina_mempool.c b/src/lib/eina/eina_mempool.c index 46ea7f5312..55723a48c7 100644 --- a/src/lib/eina/eina_mempool.c +++ b/src/lib/eina/eina_mempool.c @@ -323,25 +323,3 @@ EAPI void eina_mempool_statistics(Eina_Mempool *mp) mp->backend.statistics(mp->backend_data); } -EAPI unsigned int -eina_mempool_alignof(unsigned int size) -{ - int align; - - if (size <= 2) - align = 2; - else if (size < 8) - align = 4; - else -#if __WORDSIZE == 32 - align = 8; - -#else - if (size < 16) - align = 8; - else - align = 16; -#endif - - return ((size / align) + (size % align ? 1 : 0)) * align; -} diff --git a/src/lib/eina/eina_mempool.h b/src/lib/eina/eina_mempool.h index 5ece88dd93..2dd4787972 100644 --- a/src/lib/eina/eina_mempool.h +++ b/src/lib/eina/eina_mempool.h @@ -94,7 +94,7 @@ EAPI void eina_mempool_statistics(Eina_Mempool *mp) EINA_ARG_NONNULL(1 EAPI Eina_Bool eina_mempool_register(Eina_Mempool_Backend *be) EINA_ARG_NONNULL(1); EAPI void eina_mempool_unregister(Eina_Mempool_Backend *be) EINA_ARG_NONNULL(1); -EAPI unsigned int eina_mempool_alignof(unsigned int size); +static inline unsigned int eina_mempool_alignof(unsigned int size); #include "eina_inline_mempool.x"