@@ -822,42 +822,63 @@ nc_server_keylog_file_open(void)
822822
823823#endif
824824
825- API int
826- nc_server_init (void )
825+ /**
826+ * @brief Initialize a rwlock.
827+ *
828+ * @param[in] rwlock RW lock to initialize.
829+ * @return errno.
830+ */
831+ static int
832+ nc_server_init_rwlock (pthread_rwlock_t * rwlock )
827833{
828- pthread_rwlockattr_t * attr_p = NULL ;
829- int r ;
830-
831- ATOMIC_STORE_RELAXED (server_opts .new_session_id , 1 );
832- ATOMIC_STORE_RELAXED (server_opts .new_client_id , 1 );
833-
834834#ifdef HAVE_PTHREAD_RWLOCKATTR_SETKIND_NP
835+ int rc = 0 ;
835836 pthread_rwlockattr_t attr ;
836837
837- if ((r = pthread_rwlockattr_init (& attr ))) {
838- ERR (NULL , "%s: failed init attribute (%s)." , __func__ , strerror (r ));
839- goto error ;
838+ if ((rc = pthread_rwlockattr_init (& attr ))) {
839+ ERR (NULL , "%s: failed to init attribute (%s)." , __func__ , strerror (rc ));
840+ return rc ;
840841 }
841- attr_p = & attr ;
842- if ((r = pthread_rwlockattr_setkind_np (& attr , PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP ))) {
843- ERR (NULL , "%s: failed set attribute (%s)." , __func__ , strerror (r ));
844- goto error ;
842+
843+ if ((rc = pthread_rwlockattr_setkind_np (& attr , PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP ))) {
844+ ERR (NULL , "%s: failed to set attribute (%s)." , __func__ , strerror (rc ));
845+ goto cleanup ;
846+ }
847+
848+ if ((rc = pthread_rwlock_init (rwlock , & attr ))) {
849+ ERR (NULL , "%s: failed to init rwlock (%s)." , __func__ , strerror (rc ));
850+ goto cleanup ;
851+ }
852+
853+ cleanup :
854+ pthread_rwlockattr_destroy (& attr );
855+ return rc ;
856+ #else
857+ int rc = 0 ;
858+
859+ if ((rc = pthread_rwlock_init (rwlock , NULL ))) {
860+ ERR (NULL , "%s: failed to init rwlock (%s)." , __func__ , strerror (rc ));
845861 }
862+
863+ return rc ;
846864#endif
865+ }
847866
848- if ((r = pthread_rwlock_init (& server_opts .config_lock , attr_p ))) {
849- ERR (NULL , "%s: failed to init rwlock(%s)." , __func__ , strerror (r ));
867+ API int
868+ nc_server_init (void )
869+ {
870+ int r ;
871+
872+ ATOMIC_STORE_RELAXED (server_opts .new_session_id , 1 );
873+ ATOMIC_STORE_RELAXED (server_opts .new_client_id , 1 );
874+
875+ if (nc_server_init_rwlock (& server_opts .config_lock )) {
850876 goto error ;
851877 }
852- if ((r = pthread_rwlock_init (& server_opts .ch_client_lock , attr_p ))) {
853- ERR (NULL , "%s: failed to init rwlock(%s)." , __func__ , strerror (r ));
878+ if (nc_server_init_rwlock (& server_opts .ch_client_lock )) {
854879 goto error ;
855880 }
856881
857- if (attr_p ) {
858- pthread_rwlockattr_destroy (attr_p );
859- }
860-
861882#ifdef NC_ENABLED_SSH_TLS
862883 if (curl_global_init (CURL_GLOBAL_SSL | CURL_GLOBAL_ACK_EINTR )) {
863884 ERR (NULL , "%s: failed to init CURL." , __func__ );
@@ -898,9 +919,6 @@ nc_server_init(void)
898919 return 0 ;
899920
900921error :
901- if (attr_p ) {
902- pthread_rwlockattr_destroy (attr_p );
903- }
904922 return -1 ;
905923}
906924
0 commit comments