[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