Adapt pthread implementation to recent changes
diff --git a/include/mbedtls/threading.h b/include/mbedtls/threading.h
index cde3940..d400abe 100644
--- a/include/mbedtls/threading.h
+++ b/include/mbedtls/threading.h
@@ -42,7 +42,11 @@
 
 #if defined(MBEDTLS_THREADING_PTHREAD)
 #include <pthread.h>
-typedef pthread_mutex_t mbedtls_threading_mutex_t;
+typedef struct
+{
+    pthread_mutex_t mutex;
+    char is_valid;
+} mbedtls_threading_mutex_t;
 #endif
 
 #if defined(MBEDTLS_THREADING_ALT)
diff --git a/library/threading.c b/library/threading.c
index 787efec..35388ca 100644
--- a/library/threading.c
+++ b/library/threading.c
@@ -31,34 +31,28 @@
 #include "mbedtls/threading.h"
 
 #if defined(MBEDTLS_THREADING_PTHREAD)
-static int threading_mutex_init_pthread( mbedtls_threading_mutex_t *mutex )
+static void threading_mutex_init_pthread( mbedtls_threading_mutex_t *mutex )
 {
     if( mutex == NULL )
-        return( MBEDTLS_ERR_THREADING_BAD_INPUT_DATA );
+        return;
 
-    if( pthread_mutex_init( mutex, NULL ) != 0 )
-        return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );
-
-    return( 0 );
+    mutex->is_valid = pthread_mutex_init( &mutex->mutex, NULL ) == 0;
 }
 
-static int threading_mutex_free_pthread( mbedtls_threading_mutex_t *mutex )
+static void threading_mutex_free_pthread( mbedtls_threading_mutex_t *mutex )
 {
     if( mutex == NULL )
-        return( MBEDTLS_ERR_THREADING_BAD_INPUT_DATA );
+        return;
 
-    if( pthread_mutex_destroy( mutex ) != 0 )
-        return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );
-
-    return( 0 );
+    (void) pthread_mutex_destroy( &mutex->mutex );
 }
 
 static int threading_mutex_lock_pthread( mbedtls_threading_mutex_t *mutex )
 {
-    if( mutex == NULL )
+    if( mutex == NULL || ! mutex->is_valid )
         return( MBEDTLS_ERR_THREADING_BAD_INPUT_DATA );
 
-    if( pthread_mutex_lock( mutex ) != 0 )
+    if( pthread_mutex_lock( &mutex->mutex ) != 0 )
         return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );
 
     return( 0 );
@@ -66,17 +60,17 @@
 
 static int threading_mutex_unlock_pthread( mbedtls_threading_mutex_t *mutex )
 {
-    if( mutex == NULL )
+    if( mutex == NULL || ! mutex->is_valid )
         return( MBEDTLS_ERR_THREADING_BAD_INPUT_DATA );
 
-    if( pthread_mutex_unlock( mutex ) != 0 )
+    if( pthread_mutex_unlock( &mutex->mutex ) != 0 )
         return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );
 
     return( 0 );
 }
 
-int (*mbedtls_mutex_init)( mbedtls_threading_mutex_t * ) = threading_mutex_init_pthread;
-int (*mbedtls_mutex_free)( mbedtls_threading_mutex_t * ) = threading_mutex_free_pthread;
+void (*mbedtls_mutex_init)( mbedtls_threading_mutex_t * ) = threading_mutex_init_pthread;
+void (*mbedtls_mutex_free)( mbedtls_threading_mutex_t * ) = threading_mutex_free_pthread;
 int (*mbedtls_mutex_lock)( mbedtls_threading_mutex_t * ) = threading_mutex_lock_pthread;
 int (*mbedtls_mutex_unlock)( mbedtls_threading_mutex_t * ) = threading_mutex_unlock_pthread;
 #endif /* MBEDTLS_THREADING_PTHREAD */
@@ -87,9 +81,14 @@
     ((void) mutex );
     return( MBEDTLS_ERR_THREADING_BAD_INPUT_DATA );
 }
+static void threading_mutex_dummy( mbedtls_threading_mutex_t *mutex )
+{
+    ((void) mutex );
+    return;
+}
 
-int (*mbedtls_mutex_init)( mbedtls_threading_mutex_t * ) = threading_mutex_fail;
-int (*mbedtls_mutex_free)( mbedtls_threading_mutex_t * ) = threading_mutex_fail;
+void (*mbedtls_mutex_init)( mbedtls_threading_mutex_t * ) = threading_mutex_dummy;
+void (*mbedtls_mutex_free)( mbedtls_threading_mutex_t * ) = threading_mutex_dummy;
 int (*mbedtls_mutex_lock)( mbedtls_threading_mutex_t * ) = threading_mutex_fail;
 int (*mbedtls_mutex_unlock)( mbedtls_threading_mutex_t * ) = threading_mutex_fail;
 
diff --git a/library/x509_crt.c b/library/x509_crt.c
index c3dfd57..529e96b 100644
--- a/library/x509_crt.c
+++ b/library/x509_crt.c
@@ -959,7 +959,10 @@
 }
 
 #if defined(MBEDTLS_THREADING_PTHREAD)
-static mbedtls_threading_mutex_t readdir_mutex = PTHREAD_MUTEX_INITIALIZER;
+static mbedtls_threading_mutex_t readdir_mutex = {
+    PTHREAD_MUTEX_INITIALIZER,
+    1
+};
 #endif
 
 int mbedtls_x509_crt_parse_path( mbedtls_x509_crt *chain, const char *path )