Am 21.09.2011 16:02, schrieb Jan Kiszka:
> On 2011-09-21 15:57, Kevin Wolf wrote:
>> Am 20.09.2011 18:53, schrieb Jan Kiszka:
>>> Although there is nothing to wrap for non-POSIX here, redirecting thread
>>> and synchronization services to our core simplifies managements jobs
>>> like scheduling parameter adjustment. It also frees compat AIO from some
>>> duplicate code (/wrt qemu-thread).
>>>
>>> CC: Kevin Wolf <kw...@redhat.com>
>>> Signed-off-by: Jan Kiszka <jan.kis...@siemens.com>
>>> ---
>>>  posix-aio-compat.c |  115 
>>> ++++++++++++++-------------------------------------
>>>  1 files changed, 32 insertions(+), 83 deletions(-)

>>> @@ -311,27 +279,22 @@ static void posix_aio_notify_event(void);
>>>  
>>>  static void *aio_thread(void *unused)
>>>  {
>>> -    mutex_lock(&lock);
>>> +    qemu_mutex_lock(&lock);
>>>      pending_threads--;
>>> -    mutex_unlock(&lock);
>>> +    qemu_mutex_unlock(&lock);
>>>      do_spawn_thread();
>>>  
>>>      while (1) {
>>>          struct qemu_paiocb *aiocb;
>>> -        ssize_t ret = 0;
>>> -        qemu_timeval tv;
>>> -        struct timespec ts;
>>> -
>>> -        qemu_gettimeofday(&tv);
>>> -        ts.tv_sec = tv.tv_sec + 10;
>>> -        ts.tv_nsec = 0;
>>> +        bool timed_out = false;
>>> +        ssize_t ret;
>>>  
>>> -        mutex_lock(&lock);
>>> +        qemu_mutex_lock(&lock);
>>>  
>>> -        while (QTAILQ_EMPTY(&request_list) &&
>>> -               !(ret == ETIMEDOUT)) {
>>> +        while (QTAILQ_EMPTY(&request_list) && !timed_out) {
>>>              idle_threads++;
>>> -            ret = cond_timedwait(&cond, &lock, &ts);
>>> +            timed_out = qemu_cond_timedwait(&cond, &lock,
>>> +                                            AIO_THREAD_IDLE_TIMEOUT) != 0;
>>
>> Maybe I'm confused by too many negations, but isn't this the wrong way
>> round?
> 
> You mean design-wise? Maybe. In any case, I think this code would also
> win if we just do
> 
>       if (timed_out)
>               break;
> 
> in the loop instead of testing the inverse on entry.

Design-wise I'm not sure. Maybe it would be more consistent if
qemu_cond_timedwait returned 0/ETIMEDOUT, maybe it doesn't really make a
difference. I just felt a bit confused when reading it.

What I really meant is that I think it should be == instead of !=:

timed_out = qemu_cond_timedwait(...) == 0;

>> +    err = pthread_cond_timedwait(&cond->cond, &mutex->lock, &ts);
>> +    if (err && err != ETIMEDOUT) {
>> +        error_exit(err, __func__);
>> +    }
>> +    return err == 0;
>>
>> So if there was an timeout, qemu_cond_timedwait returns 0 (should it
>> return a bool? Also documenting the return value wouldn't hurt) and
>> timed_out becomes false (0 != 0).
> 
> Will switch to a bool return code (and document it).

Ok.

Kevin

Reply via email to