CRYPTO_w_lock(CRYPTO_LOCK_ERR);
CRYPTO_r_lock(CRYPTO_LOCK_ERR);
ERR_STATE *ERR_get_state(void)	{	static ERR_STATE fallback;	ERR_STATE *ret=NULL,tmp,*tmpp=NULL;	int thread_state_exists;	int i;	unsigned long pid;	pid=(unsigned long)CRYPTO_thread_id();	CRYPTO_w_lock(CRYPTO_LOCK_ERR);	if (thread_hash != NULL)		{		tmp.pid=pid;		ret=(ERR_STATE *)lh_retrieve(thread_hash,&tmp);		}	CRYPTO_w_unlock(CRYPTO_LOCK_ERR);	/* ret == the error state, if NULL, make a new one */	if (ret == NULL)		{		ret=(ERR_STATE *)OPENSSL_malloc(sizeof(ERR_STATE));		if (ret == NULL) return(&fallback);		ret->pid=pid;		ret->top=0;		ret->bottom=0;		for (i=0; i<ERR_NUM_ERRORS; i++)			{			ret->err_data[i]=NULL;			ret->err_data_flags[i]=0;			}		CRYPTO_w_lock(CRYPTO_LOCK_ERR);		/* no entry yet in thread_hash for current thread -		 * thus, it may have changed since we last looked at it */		if (thread_hash == NULL)			thread_hash = lh_new(pid_hash, pid_cmp);		if (thread_hash == NULL)			thread_state_exists = 0; /* allocation error */		else			{			tmpp=(ERR_STATE *)lh_insert(thread_hash,ret);			thread_state_exists = 1;			}		CRYPTO_w_unlock(CRYPTO_LOCK_ERR);		if (!thread_state_exists)			{			ERR_STATE_free(ret); /* could not insert it */			return(&fallback);			}				if (tmpp != NULL) /* old entry - should not happen */			{			ERR_STATE_free(tmpp);			}		}	return(ret);	}