else {
fdev->fd = fd;
fdev->refcount = 3; /* set autoclose by default */
- fdev->repeat = -1;
+ fdev->repeat = -1; /* always repeat by default */
}
return fdev;
}
if (fdev && __atomic_sub_fetch(&fdev->refcount, 2, __ATOMIC_RELAXED) <= 1) {
if (fdev->itf) {
fdev->itf->disable(fdev->closure_itf, fdev);
- fdev->itf->unref(fdev->closure_itf);
+ if (fdev->itf->unref)
+ fdev->itf->unref(fdev->closure_itf);
}
if (fdev->refcount)
close(fdev->fd);
if (events != fdev->events) {
fdev->events = events;
if (is_active(fdev))
- fdev->itf->enable(fdev->closure_itf, fdev);
+ fdev->itf->update(fdev->closure_itf, fdev);
}
}
void fdev_set_autoclose(struct fdev *fdev, int autoclose)
{
if (autoclose)
- fdev->refcount |= 1;
+ fdev->refcount |= (unsigned)1;
else
- fdev->refcount &= -2;
+ fdev->refcount &= ~(unsigned)1;
}