Skip to content
This repository has been archived by the owner on Oct 12, 2022. It is now read-only.

Commit

Permalink
use reentrant qsort_r where available
Browse files Browse the repository at this point in the history
- this avoids one TLS access per comparison
  • Loading branch information
MartinNowak committed Mar 7, 2013
1 parent 45f1755 commit 8c66e03
Showing 1 changed file with 53 additions and 12 deletions.
65 changes: 53 additions & 12 deletions src/rt/qsort.d
Expand Up @@ -18,24 +18,65 @@ module rt.qsort;

private import core.stdc.stdlib;

struct Array
version (linux)
{
size_t length;
void* ptr;
}

private TypeInfo tiglobal;
alias extern (C) int function(const void *, const void *, void *) Cmp;
extern (C) void qsort_r(void *base, size_t nmemb, size_t size, Cmp cmp, void *arg);

extern (C) int cmp(in void* p1, in void* p2)
extern (C) void[] _adSort(void[] a, TypeInfo ti)
{
extern (C) int cmp(in void* p1, in void* p2, void* ti)
{
return (cast(TypeInfo)ti).compare(p1, p2);
}
qsort_r(a.ptr, a.length, ti.tsize, &cmp, cast(void*)ti);
return a;
}
}
else version (FreeBSD)
{
return tiglobal.compare(p1, p2);
alias extern (C) int function(void *, const void *, const void *) Cmp;
extern (C) void qsort_r(void *base, size_t nmemb, size_t size, void *thunk, Cmp cmp);

extern (C) void[] _adSort(void[] a, TypeInfo ti)
{
extern (C) int cmp(void* ti, in void* p1, in void* p2)
{
return (cast(TypeInfo)ti).compare(p1, p2);
}
qsort_r(a.ptr, a.length, ti.tsize, cast(void*)ti, &cmp);
return a;
}
}
else version (OSX)
{
alias extern (C) int function(void *, const void *, const void *) Cmp;
extern (C) void qsort_r(void *base, size_t nmemb, size_t size, void *thunk, Cmp cmp);

extern (C) void[] _adSort(void[] a, TypeInfo ti)
extern (C) void[] _adSort(void[] a, TypeInfo ti)
{
extern (C) int cmp(void* ti, in void* p1, in void* p2)
{
return (cast(TypeInfo)ti).compare(p1, p2);
}
qsort_r(a.ptr, a.length, ti.tsize, cast(void*)ti, &cmp);
return a;
}
}
else
{
tiglobal = ti;
qsort(a.ptr, a.length, cast(size_t)ti.tsize, &cmp);
return a;
private TypeInfo tiglobal;

extern (C) void[] _adSort(void[] a, TypeInfo ti)
{
extern (C) int cmp(in void* p1, in void* p2)
{
return tiglobal.compare(p1, p2);
}
tiglobal = ti;
qsort(a.ptr, a.length, ti.tsize, &cmp);
return a;
}
}


Expand Down

0 comments on commit 8c66e03

Please sign in to comment.