diff options
Diffstat (limited to 'dev.c')
-rw-r--r-- | dev.c | 30 |
1 files changed, 29 insertions, 1 deletions
@@ -23,13 +23,17 @@ static struct mog_dev *mog_dev_new(struct mog_svc *svc, uint32_t mog_devid) memcpy(dev->prefix, devprefix, len); free(devprefix); + dev->cur_max = dev->max_active = 1; + CHECK(int, 0, sem_init(&dev->sem, 0, 1)); + dev->devid = mog_devid; dev->st_dev = sb.st_dev; return dev; } -struct mog_dev *mog_dev_for(struct mog_svc *svc, uint32_t mog_devid) +struct mog_dev * +mog_dev_for(struct mog_svc *svc, uint32_t mog_devid, bool update) { struct mog_dev finder; struct mog_dev *ret; @@ -41,6 +45,9 @@ struct mog_dev *mog_dev_for(struct mog_svc *svc, uint32_t mog_devid) if (ret) { struct stat sb; + if (!update) + goto out; + /* * devXXX dir existed before, but is no longer readable * Possible FS/device error, it could come back, so do @@ -216,3 +223,24 @@ out: } while (0)); return errno ? -1 : 0; } + + +void mog_dev_wait(struct mog_dev *dev) +{ + if (dev) + CHECK(int, 0, sem_wait(&dev->sem)); +} + +void mog_dev_post(struct mog_dev *dev) +{ + if (dev) + CHECK(int, 0, sem_post(&dev->sem)); +} + +void mog_dev_free(void *ptr) +{ + struct mog_dev *dev = ptr; + + CHECK(int, 0, sem_destroy(&dev->sem)); + free(dev); +} |