On Monday, 21 January 2013 at 21:16:58 UTC, bearophile wrote:
Some more little changes, I have added counters, and I have used the faster Xorshift:

http://codepad.org/hIFPgSTd

Bye,
bearophile

I wouldn't mind seeing some "scope" in there. Keeps things safe. After all, those locks can throw exceptions... (can't they? I'm no mutex expert).

Anyways, something like this:


    public void transfer(in uint from, in uint to,
                         in TBucketValue amount) {
        auto low  = min(from, to);
        auto high = max(from, to);

        buckets[low].mtx.lock();
        scope(exit) buckets[low].mtx.unlock();
        buckets[high].mtx.lock();
        scope(exit) buckets[high].mtx.unlock();

        immutable realAmount = min(buckets[from].value, amount);
        buckets[from].value -= realAmount;
        buckets[to  ].value += realAmount;
    }


    void toString(in void delegate(const(char)[]) sink) {
        TBucketValue sum = 0;
        sink("(");
        size_t i;
        scope(exit) foreach (ref b; buckets[0 .. i]) {
            b.mtx.unlock().collectException();
        }
        foreach (ref b; buckets) {
            b.mtx.lock();
            ++i;
            sum += b.value;
            sink(text(b.value));
            sink(" ");
        }
        sink(") ");
        sink(text(sum));
    }

Reply via email to