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