I have check the libcurl code and it is calling Curl_ssl_init()  only once
on call from curl_global_init() and Curl_ssl_cleanup() once on call from
curl_global_cleanup().

On Mon, Feb 27, 2012 at 10:31 PM, Keyoor Khristi
<[email protected]>wrote:

> Is it multithreaded curl? one version of the curl i used was doing
> openssl_init and cleanup in its init and cleanup routines and it was not
> multithreaded. result was my code would not work properly if curl_cleanup
> is called before.
>
>
> On Mon, Feb 27, 2012 at 7:52 PM, Anurag Shukla 
> <[email protected]>wrote:
>
>> I am facing some random crash issues using libcurl with openssl in a
>> Multi threaded program. I wrote a sample code to create 2 threads that will
>> ping to https://www.google.com.
>> Using [libcurl- 7.21.7]  [openssl- 1.0.0d]
>>
>> I have implemented the two callbacks function required by openssl
>>
>>     #include <nspr.h>
>>     #include "curl.h"
>>     #include "openssl/crypto.h"
>>     static PRRWLock *lockarray[CRYPTO_NUM_LOCKS];
>>
>>     static void ChangeLockStatus(int mode, int lock_index, const char*
>> file_name, int   line_num) {
>>       if (mode & CRYPTO_LOCK) {
>>         if(mode & CRYPTO_WRITE) {
>>           PR_RWLock_Wlock(lockarray[lock_index]);
>>         } else if (mode & CRYPTO_READ) {
>>           PR_RWLock_Rlock(lockarray[lock_index]);
>>         }
>>       } else {
>>        PR_RWLock_Unlock(lockarray[lock_index]);
>>       }
>>     }
>>     static unsigned long ID_Callback(void) {
>>       unsigned long td = ::GetCurrentThreadId();
>>       return td;
>>     }
>>     static void Initialize() {
>>       int i;
>>       for (i = 0; i < CRYPTO_NUM_LOCKS; i++) {
>>         lockarray[i] = PR_NewRWLock(PR_RWLOCK_RANK_NONE, "a");
>>       }
>>       CRYPTO_set_locking_callback(ChangeLockStatus);
>>       CRYPTO_set_id_callback(ID_Callback);
>>     }
>>     void Test(void *arg) {
>>       int error_code;
>>       FILE *fd = fopen("a.txt", "w");
>>       while(1) {
>>       CURL * curl_connection = curl_easy_init();
>>       curl_easy_setopt(curl_connection, CURLOPT_TIMEOUT, 300);
>>       curl_easy_setopt(curl_connection, CURLOPT_CONNECTTIMEOUT, 60);
>>       curl_easy_setopt(curl_connection, CURLOPT_FOLLOWLOCATION, 1);
>>       curl_easy_setopt(curl_connection, CURLOPT_VERBOSE, 0);
>>       curl_easy_setopt(curl_connection, CURLOPT_SSL_VERIFYPEER, 0);
>>       error_code = curl_easy_setopt(curl_connection, CURLOPT_PROXY, "
>> 192.168.1.1:8000");
>>       curl_easy_setopt(curl_connection, CURLOPT_FILE, fd);
>>       curl_easy_setopt(curl_connection, CURLOPT_URL, "
>> https://www.google.com";);
>>       error_code  = curl_easy_perform(curl_connection);
>>       curl_easy_cleanup(curl_connection);
>>       Sleep(3000);
>>       }
>>     }
>>     int main(int argc, char** argv) {
>>       curl_global_init(CURL_GLOBAL_ALL);
>>       Initialize();
>>       PRThread *threads[2];
>>      for(int i=0; i<2; i++) {
>>         threads[i] = PR_CreateThread(PR_USER_THREAD, Test, NULL,
>> PR_PRIORITY_LOW,
>>       PR_GLOBAL_THREAD, PR_JOINABLE_THREAD, 1024*10);
>>      }
>>      Sleep(3600000);
>>      curl_global_cleanup();
>>       for (int i = 0; i < CRYPTO_NUM_LOCKS; i++) {
>>         PR_DestroyRWLock(lockarray[i]);
>>       }
>>    }
>>
>> When i ran this under Intel Parallel Studio to check for race conditions
>> ,it gave a lot of race conditions in ssluse.c
>>
>>
>> View Source
>>
>>     BIO *bio_out = BIO_new(BIO_s_mem());
>>
>>     ssl_seeded = TRUE;
>>
>>
>> Any idea what am i doing wrong?
>>
>> Thanks,<br>
>> Anurag Shukla
>>
>>
>>
>>
>>
>>
>>   [1]: http://i.stack.imgur.com/hMuss.png
>
>
>

Reply via email to