Is it possible to request a code review?
IM
3di at gm.com
Sat Dec 16 05:35:54 UTC 2017
On Friday, 15 December 2017 at 21:34:48 UTC, Neia Neutuladh wrote:
> On Wednesday, 13 December 2017 at 03:15:11 UTC, IM wrote:
>> https://code.dlang.org/packages/libdtasks
>
> I'd get rid of the ITaskRunner interface and rename
> AbstractTaskRunner to TaskRunner. Interfaces are fine when you
> need them, but you rarely need them. You can just make
> PostTaskAndReply non-final and it's the same. It's slightly
> cheaper than calling the final method through an interface,
> even.
>
That's a fair point. Thanks.
> I'd also eliminate TaskSystem. You can use a thread-local
> TaskRunner pretty much the same way, and it's a bit weird to
> have policy based on thread ID. (Normally, you would have a
> threadpool-like thing for each type of task. Like one for
> serving web traffic, one for transcoding video, one for reading
> RSS feeds, etc.) Thread IDs can be reused, so if you forget to
> clean something up, you might end up reusing the wrong
> TaskRunner later. A thread-local variable also reduces the work
> you have to do to stop a thread.
>
> In any case, the TaskRunner-per-thread thing is a policy
> decision that's not really appropriate for a library to make.
> You generally try to leave that to applications.
>
Applications can instantiate multiple single thread task runners,
each for a specific type of tasks as you mentioned earlier. They
can also instantiate a thread pool task runners for tasks that
are independent, don't need to run sequentially or any order, or
on any particular thread.
> TaskQueue has a race condition, I think:
>
>> Thread 1 calls Pop(). It acquires the mutex.
>> Thread 1 observes there are no tasks available to pop. It
>> waits on the condition variable.
>> Thread 2 calls Push(). It tries to acquire the mutex, but the
>> mutex is taken. It blocks forever.
>
That's not true. Waiting on a condition variable should unlocked
the mutex first, the put the thread to sleep. That's how most
implementations are. See for example:
http://en.cppreference.com/w/cpp/thread/condition_variable/wait
> Reading code is generally easier when that code follows the
> style guide for the language. https://dlang.org/dstyle.html and
> maybe run dfmt on your code. For instance, when you write
> `atomicOp !"+="`, it takes me about a full second to connect
> that to the common style of `atomicOp!"+="`. If I worked with
> your code for an hour, that would go away, but it's a bit of a
> speedbump for new contributors.
>
Yeah, if you noticed, I use clang-format rather than dfmt. I
found dfmt to be very buggy, especially when using 80-character
line limit. It also produces formatted code that I don't like,
especially when there's multiple indentations. clang-format
doesn't support D unfortunately, so I have to add '//
clang-format off .. on' here and there. It is clang-format that
added that extra space after 'atomicOp!'. I wish it has full
support for D like it does for Java and Javascript, but hey it
mostly works, so fine.
> One other point of note about formatting: I never regret using
> braces around single-statement blocks. Like:
>
> while (!done && tasks.length == 0)
> {
> condition.wait;
> }
>
> I just so frequently need to add logging or extra bookkeeping
> to statements like that that it's not even worth the time to
> try to omit braces.
I believe less braces and less indentation is better. I like to
keep the code minimal with minimal whitespace around it, but
that's just my personal pereferance.
Thank you very much for your review.
More information about the Digitalmars-d
mailing list