<p>Chris Savinovich has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/10939">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">force_inline: remove all force_inline from asterisk.<br><br>A bug in GCC causes arithmetic calculations to fail if the<br>following conditions are met:<br>1. TEST_FRAMEWORK on<br>2. DONT_OPTIMIZE off<br>3. Fedora and Ubuntu<br>4. GCC 8.2.1<br>5. There must exist a certain combination of multithreading.<br>6. Optimization level -O2 and -O3<br>7. Flag -fpartial-inline activated (happens automatically when -O2)<br>Forcing inlining in our code is the actual error trigger.  The new<br>concensus is that it is best to leave it to the compiler to determine<br>what to inline.  Therefore this fix removes all instances of custom<br>type force_inline wherever possible throughout the Asterisk code.<br><br>Change-Id: I2a90249763a7139fd12c54ad4e0e8d5cbbed14f9<br>---<br>M include/asterisk/sem.h<br>M include/asterisk/strings.h<br>M include/asterisk/utils.h<br>M main/audiohook.c<br>M main/sem.c<br>M main/strings.c<br>6 files changed, 185 insertions(+), 150 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/39/10939/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/asterisk/sem.h b/include/asterisk/sem.h</span><br><span>index 6d655d6..436c249 100644</span><br><span>--- a/include/asterisk/sem.h</span><br><span>+++ b/include/asterisk/sem.h</span><br><span>@@ -39,35 +39,12 @@</span><br><span> </span><br><span> /* These are thin wrappers; might as well inline them */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static force_inline int ast_sem_init(struct ast_sem *sem, int pshared, unsigned int value)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        return sem_init(&sem->real_sem, pshared, value);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static force_inline int ast_sem_destroy(struct ast_sem *sem)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   return sem_destroy(&sem->real_sem);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static force_inline int ast_sem_post(struct ast_sem *sem)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   return sem_post(&sem->real_sem);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static force_inline int ast_sem_wait(struct ast_sem *sem)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      return sem_wait(&sem->real_sem);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static force_inline int ast_sem_timedwait(struct ast_sem *sem, const struct timespec *abs_timeout)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     return sem_timedwait(&sem->real_sem, abs_timeout);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static force_inline int ast_sem_getvalue(struct ast_sem *sem, int *sval)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     return sem_getvalue(&sem->real_sem, sval);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(120, 100%, 40%);">+int ast_sem_init(struct ast_sem *sem, int pshared, unsigned int value);</span><br><span style="color: hsl(120, 100%, 40%);">+int ast_sem_destroy(struct ast_sem *sem);</span><br><span style="color: hsl(120, 100%, 40%);">+int ast_sem_post(struct ast_sem *sem);</span><br><span style="color: hsl(120, 100%, 40%);">+int ast_sem_wait(struct ast_sem *sem);</span><br><span style="color: hsl(120, 100%, 40%);">+int ast_sem_timedwait(struct ast_sem *sem, const struct timespec *abs_timeout);</span><br><span style="color: hsl(120, 100%, 40%);">+int ast_sem_getvalue(struct ast_sem *sem, int *sval);</span><br><span> </span><br><span> #else</span><br><span> /* Unnamed semaphores don't work. Rolling our own, I guess... */</span><br><span>diff --git a/include/asterisk/strings.h b/include/asterisk/strings.h</span><br><span>index 2d66716..94d5314 100644</span><br><span>--- a/include/asterisk/strings.h</span><br><span>+++ b/include/asterisk/strings.h</span><br><span>@@ -91,16 +91,7 @@</span><br><span>   \param prefix Prefix to look for.</span><br><span>   \param 1 if \a str begins with \a prefix, 0 otherwise.</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-static int force_inline attribute_pure ast_begins_with(const char *str, const char *prefix)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     ast_assert(str != NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-        ast_assert(prefix != NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-     while (*str == *prefix && *prefix != '\0') {</span><br><span style="color: hsl(0, 100%, 40%);">-            ++str;</span><br><span style="color: hsl(0, 100%, 40%);">-          ++prefix;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-       return *prefix == '\0';</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(120, 100%, 40%);">+int attribute_pure ast_begins_with(const char *str, const char *prefix);</span><br><span> </span><br><span> /*</span><br><span>   \brief Checks whether a string ends with another.</span><br><span>@@ -109,22 +100,7 @@</span><br><span>   \param suffix Suffix to look for.</span><br><span>   \param 1 if \a str ends with \a suffix, 0 otherwise.</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-static int force_inline attribute_pure ast_ends_with(const char *str, const char *suffix)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    size_t str_len;</span><br><span style="color: hsl(0, 100%, 40%);">- size_t suffix_len;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      ast_assert(str != NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-        ast_assert(suffix != NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-     str_len = strlen(str);</span><br><span style="color: hsl(0, 100%, 40%);">-  suffix_len = strlen(suffix);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if (suffix_len > str_len) {</span><br><span style="color: hsl(0, 100%, 40%);">-          return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return strcmp(str + str_len - suffix_len, suffix) == 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(120, 100%, 40%);">+int attribute_pure ast_ends_with(const char *str, const char *suffix);</span><br><span> </span><br><span> /*!</span><br><span>  * \brief return Yes or No depending on the argument.</span><br><span>@@ -1182,10 +1158,7 @@</span><br><span>  * (signed) int values.  This function restricts an unsigned int hash</span><br><span>  * value to the positive half of the (signed) int values.</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-static force_inline int attribute_pure ast_str_hash_restrict(unsigned int hash)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      return (int) (hash & (unsigned int) INT_MAX);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(120, 100%, 40%);">+int attribute_pure ast_str_hash_restrict(unsigned int hash);</span><br><span> </span><br><span> /*!</span><br><span>  * \brief Compute a hash value on a string</span><br><span>@@ -1195,16 +1168,7 @@</span><br><span>  *</span><br><span>  * http://www.cse.yorku.ca/~oz/hash.html</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-static force_inline int attribute_pure ast_str_hash(const char *str)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        unsigned int hash = 5381;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       while (*str) {</span><br><span style="color: hsl(0, 100%, 40%);">-          hash = hash * 33 ^ (unsigned char) *str++;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return ast_str_hash_restrict(hash);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(120, 100%, 40%);">+int attribute_pure ast_str_hash(const char *str);</span><br><span> </span><br><span> /*!</span><br><span>  * \brief Compute a hash value on a string</span><br><span>@@ -1221,16 +1185,7 @@</span><br><span>  *</span><br><span>  * \sa http://www.cse.yorku.ca/~oz/hash.html</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-static force_inline int ast_str_hash_add(const char *str, int seed)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      unsigned int hash = (unsigned int) seed;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        while (*str) {</span><br><span style="color: hsl(0, 100%, 40%);">-          hash = hash * 33 ^ (unsigned char) *str++;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return ast_str_hash_restrict(hash);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(120, 100%, 40%);">+int ast_str_hash_add(const char *str, int seed);</span><br><span> </span><br><span> /*!</span><br><span>  * \brief Compute a hash value on a case-insensitive string</span><br><span>@@ -1239,16 +1194,7 @@</span><br><span>  * all characters to lowercase prior to computing a hash. This</span><br><span>  * allows for easy case-insensitive lookups in a hash table.</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-static force_inline int attribute_pure ast_str_case_hash(const char *str)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    unsigned int hash = 5381;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       while (*str) {</span><br><span style="color: hsl(0, 100%, 40%);">-          hash = hash * 33 ^ (unsigned char) tolower(*str++);</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return ast_str_hash_restrict(hash);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(120, 100%, 40%);">+int attribute_pure ast_str_case_hash(const char *str);</span><br><span> </span><br><span> /*!</span><br><span>  * \brief Convert a string to all lower-case</span><br><span>@@ -1266,19 +1212,7 @@</span><br><span>  *</span><br><span>  * \retval str for convenience</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-static force_inline char *attribute_pure ast_str_to_upper(char *str)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    char *str_orig = str;</span><br><span style="color: hsl(0, 100%, 40%);">-   if (!str) {</span><br><span style="color: hsl(0, 100%, 40%);">-             return str;</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       for (; *str; ++str) {</span><br><span style="color: hsl(0, 100%, 40%);">-           *str = toupper(*str);</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return str_orig;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(120, 100%, 40%);">+char *attribute_pure ast_str_to_upper(char *str);</span><br><span> </span><br><span> /*!</span><br><span>  * \since 12</span><br><span>diff --git a/include/asterisk/utils.h b/include/asterisk/utils.h</span><br><span>index bcd73aa..d8c076c 100644</span><br><span>--- a/include/asterisk/utils.h</span><br><span>+++ b/include/asterisk/utils.h</span><br><span>@@ -336,49 +336,11 @@</span><br><span>  */</span><br><span> void ast_unescape_quoted(char *quote_str);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static force_inline void ast_slinear_saturated_add(short *input, short *value)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    int res;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    res = (int) *input + *value;</span><br><span style="color: hsl(0, 100%, 40%);">-    if (res > 32767)</span><br><span style="color: hsl(0, 100%, 40%);">-             *input = 32767;</span><br><span style="color: hsl(0, 100%, 40%);">- else if (res < -32768)</span><br><span style="color: hsl(0, 100%, 40%);">-               *input = -32768;</span><br><span style="color: hsl(0, 100%, 40%);">-        else</span><br><span style="color: hsl(0, 100%, 40%);">-            *input = (short) res;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static force_inline void ast_slinear_saturated_subtract(short *input, short *value)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      int res;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        res = (int) *input - *value;</span><br><span style="color: hsl(0, 100%, 40%);">-    if (res > 32767)</span><br><span style="color: hsl(0, 100%, 40%);">-             *input = 32767;</span><br><span style="color: hsl(0, 100%, 40%);">- else if (res < -32768)</span><br><span style="color: hsl(0, 100%, 40%);">-               *input = -32768;</span><br><span style="color: hsl(0, 100%, 40%);">-        else</span><br><span style="color: hsl(0, 100%, 40%);">-            *input = (short) res;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static force_inline void ast_slinear_saturated_multiply(short *input, short *value)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      int res;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        res = (int) *input * *value;</span><br><span style="color: hsl(0, 100%, 40%);">-    if (res > 32767)</span><br><span style="color: hsl(0, 100%, 40%);">-             *input = 32767;</span><br><span style="color: hsl(0, 100%, 40%);">- else if (res < -32768)</span><br><span style="color: hsl(0, 100%, 40%);">-               *input = -32768;</span><br><span style="color: hsl(0, 100%, 40%);">-        else</span><br><span style="color: hsl(0, 100%, 40%);">-            *input = (short) res;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static force_inline void ast_slinear_saturated_divide(short *input, short *value)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        *input /= *value;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(120, 100%, 40%);">+void ast_slinear_saturated_add(short *input, short *value);</span><br><span style="color: hsl(120, 100%, 40%);">+void ast_slinear_saturated_subtract(short *input, short *value);</span><br><span style="color: hsl(120, 100%, 40%);">+void ast_slinear_saturated_multiply(short *input, short *value);</span><br><span style="color: hsl(120, 100%, 40%);">+void ast_slinear_saturated_divide(short *input, short *value);</span><br><span> </span><br><span> #ifdef localtime_r</span><br><span> #undef localtime_r</span><br><span>@@ -867,12 +829,7 @@</span><br><span>           return __VA_ARGS__; \</span><br><span>        }\</span><br><span> })</span><br><span style="color: hsl(0, 100%, 40%);">-static void force_inline _ast_assert(int condition, const char *condition_str, const char *file, int line, const char *function)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       if (__builtin_expect(!condition, 1)) {</span><br><span style="color: hsl(0, 100%, 40%);">-          __ast_assert_failed(condition, condition_str, file, line, function);</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(120, 100%, 40%);">+void _ast_assert(int condition, const char *condition_str, const char *file, int line, const char *function);</span><br><span> #else</span><br><span> #define ast_assert(a)</span><br><span> #define ast_assert_return(a, ...) \</span><br><span>diff --git a/main/audiohook.c b/main/audiohook.c</span><br><span>index cb3c4bc..f4e4958 100644</span><br><span>--- a/main/audiohook.c</span><br><span>+++ b/main/audiohook.c</span><br><span>@@ -1424,3 +1424,57 @@</span><br><span> </span><br><span>         return (audiohook ? 0 : -1);</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void ast_slinear_saturated_add(short *input, short *value)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    int res;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    res = (int) *input + *value;</span><br><span style="color: hsl(120, 100%, 40%);">+  if (res > 32767)</span><br><span style="color: hsl(120, 100%, 40%);">+           *input = 32767;</span><br><span style="color: hsl(120, 100%, 40%);">+       else if (res < -32768)</span><br><span style="color: hsl(120, 100%, 40%);">+             *input = -32768;</span><br><span style="color: hsl(120, 100%, 40%);">+      else</span><br><span style="color: hsl(120, 100%, 40%);">+          *input = (short) res;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void ast_slinear_saturated_subtract(short *input, short *value)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        int res;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    res = (int) *input - *value;</span><br><span style="color: hsl(120, 100%, 40%);">+  if (res > 32767)</span><br><span style="color: hsl(120, 100%, 40%);">+           *input = 32767;</span><br><span style="color: hsl(120, 100%, 40%);">+       else if (res < -32768)</span><br><span style="color: hsl(120, 100%, 40%);">+             *input = -32768;</span><br><span style="color: hsl(120, 100%, 40%);">+      else</span><br><span style="color: hsl(120, 100%, 40%);">+          *input = (short) res;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void ast_slinear_saturated_multiply(short *input, short *value)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        int res;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    res = (int) *input * *value;</span><br><span style="color: hsl(120, 100%, 40%);">+  if (res > 32767)</span><br><span style="color: hsl(120, 100%, 40%);">+           *input = 32767;</span><br><span style="color: hsl(120, 100%, 40%);">+       else if (res < -32768)</span><br><span style="color: hsl(120, 100%, 40%);">+             *input = -32768;</span><br><span style="color: hsl(120, 100%, 40%);">+      else</span><br><span style="color: hsl(120, 100%, 40%);">+          *input = (short) res;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void ast_slinear_saturated_divide(short *input, short *value)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  *input /= *value;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef AST_DEVMODE</span><br><span style="color: hsl(120, 100%, 40%);">+void _ast_assert(int condition, const char *condition_str, const char *file, int line, const char *function)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   if (__builtin_expect(!condition, 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                __ast_assert_failed(condition, condition_str, file, line, function);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/main/sem.c b/main/sem.c</span><br><span>index 7315165..d79a3eb 100644</span><br><span>--- a/main/sem.c</span><br><span>+++ b/main/sem.c</span><br><span>@@ -144,4 +144,36 @@</span><br><span>   return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int ast_sem_init(struct ast_sem *sem, int pshared, unsigned int value)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        return sem_init(&sem->real_sem, pshared, value);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int ast_sem_destroy(struct ast_sem *sem)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     return sem_destroy(&sem->real_sem);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int ast_sem_post(struct ast_sem *sem)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     return sem_post(&sem->real_sem);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int ast_sem_wait(struct ast_sem *sem)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        return sem_wait(&sem->real_sem);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int ast_sem_timedwait(struct ast_sem *sem, const struct timespec *abs_timeout)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       return sem_timedwait(&sem->real_sem, abs_timeout);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int ast_sem_getvalue(struct ast_sem *sem, int *sval)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       return sem_getvalue(&sem->real_sem, sval);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #endif</span><br><span>diff --git a/main/strings.c b/main/strings.c</span><br><span>index 43fbca4..0100ae7 100644</span><br><span>--- a/main/strings.c</span><br><span>+++ b/main/strings.c</span><br><span>@@ -405,3 +405,84 @@</span><br><span> </span><br><span>     return str_orig;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int attribute_pure ast_begins_with(const char *str, const char *prefix)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   ast_assert(str != NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+      ast_assert(prefix != NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+   while (*str == *prefix && *prefix != '\0') {</span><br><span style="color: hsl(120, 100%, 40%);">+          ++str;</span><br><span style="color: hsl(120, 100%, 40%);">+                ++prefix;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     return *prefix == '\0';</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int attribute_pure ast_ends_with(const char *str, const char *suffix)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        size_t str_len;</span><br><span style="color: hsl(120, 100%, 40%);">+       size_t suffix_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  ast_assert(str != NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+      ast_assert(suffix != NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+   str_len = strlen(str);</span><br><span style="color: hsl(120, 100%, 40%);">+        suffix_len = strlen(suffix);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (suffix_len > str_len) {</span><br><span style="color: hsl(120, 100%, 40%);">+                return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return strcmp(str + str_len - suffix_len, suffix) == 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int attribute_pure ast_str_hash_restrict(unsigned int hash)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  return (int) (hash & (unsigned int) INT_MAX);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int attribute_pure ast_str_hash(const char *str)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   unsigned int hash = 5381;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   while (*str) {</span><br><span style="color: hsl(120, 100%, 40%);">+                hash = hash * 33 ^ (unsigned char) *str++;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return ast_str_hash_restrict(hash);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int ast_str_hash_add(const char *str, int seed)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  unsigned int hash = (unsigned int) seed;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    while (*str) {</span><br><span style="color: hsl(120, 100%, 40%);">+                hash = hash * 33 ^ (unsigned char) *str++;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return ast_str_hash_restrict(hash);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int attribute_pure ast_str_case_hash(const char *str)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    unsigned int hash = 5381;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   while (*str) {</span><br><span style="color: hsl(120, 100%, 40%);">+                hash = hash * 33 ^ (unsigned char) tolower(*str++);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return ast_str_hash_restrict(hash);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+char *attribute_pure ast_str_to_upper(char *str)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ char *str_orig = str;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!str) {</span><br><span style="color: hsl(120, 100%, 40%);">+           return str;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   for (; *str; ++str) {</span><br><span style="color: hsl(120, 100%, 40%);">+         *str = toupper(*str);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return str_orig;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/10939">change 10939</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/10939"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: 13 </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I2a90249763a7139fd12c54ad4e0e8d5cbbed14f9 </div>
<div style="display:none"> Gerrit-Change-Number: 10939 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Chris Savinovich <csavinovich@digium.com> </div>