[Issue 11695] std.net.curl https not thread-safe

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Sun Jul 19 18:15:24 PDT 2015


https://issues.dlang.org/show_bug.cgi?id=11695

brocolis <brocolis at eml.cc> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |brocolis at eml.cc

--- Comment #1 from brocolis <brocolis at eml.cc> ---
Just in case someone else get hit by this bug, here's a working example for
linux.

--
import std.net.curl;
import std.parallelism;
import std.range;
import std.stdio;

void main()
{
    init_locks();

    foreach(i; parallel(iota(0, 10, 1)))
    {
        writefln("Testing %d ...", i);
        get("https://...");
    }

    kill_locks();
}

import core.sync.mutex;
import core.stdc.config;
import core.sys.posix.pthread;
alias extern(C) c_ulong function() CRYPTO_set_id_callback_t;
alias extern(C) void function(int, int, const(char)*, int)
CRYPTO_set_locking_callback_t;
extern(C) int CRYPTO_num_locks();
extern(C) void CRYPTO_set_id_callback(CRYPTO_set_id_callback_t);
extern(C) void CRYPTO_set_locking_callback(CRYPTO_set_locking_callback_t);
enum CRYPTO_LOCK = 1;

__gshared Mutex[] mutex;

void init_locks()
{
    mutex.length = CRYPTO_num_locks();

    for (int i = 0; i < mutex.length; i++)
    {
        mutex[i] = new Mutex;
    }

    CRYPTO_set_id_callback(&thread_id);
    CRYPTO_set_locking_callback(&lock_callback);
}

void kill_locks()
{
    CRYPTO_set_id_callback(null);
    CRYPTO_set_locking_callback(null);

    foreach(m; mutex)
        destroy(m);

    mutex.length = 0;
}

extern(C) void lock_callback(int mode, int n, const(char)* file, int line)
{
    if (mode & CRYPTO_LOCK)
    {
        mutex[n].lock();
    }
    else
    {
        mutex[n].unlock();
    }
}

extern(C) c_ulong thread_id()
{
    return pthread_self();
}
--

--


More information about the Digitalmars-d-bugs mailing list