blob: 80ce2321a53f9dca271775f45778063cfb323ac4 [file] [log] [blame]
/* Copyright (c) 2015 Google Inc
* Davide Libenzi <dlibenzi@google.com>
* See LICENSE for details.
*/
#include <kthread.h>
#include <completion.h>
void completion_init(struct completion *comp, int count)
{
cv_init_irqsave(&comp->cv);
comp->count = count;
}
void completion_complete(struct completion *comp, int how_much)
{
int8_t state = 0;
cv_lock_irqsave(&comp->cv, &state);
comp->count -= how_much;
if (comp->count <= 0)
__cv_broadcast(&comp->cv);
cv_unlock_irqsave(&comp->cv, &state);
}
void completion_wait(struct completion *comp)
{
int8_t state = 0;
cv_lock_irqsave(&comp->cv, &state);
if (comp->count > 0) {
cv_wait_and_unlock(&comp->cv);
enable_irqsave(&state);
} else {
cv_unlock_irqsave(&comp->cv, &state);
}
}