about summary refs log tree commit homepage
path: root/dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'dev.c')
-rw-r--r--dev.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/dev.c b/dev.c
index 7454b2d..551b15c 100644
--- a/dev.c
+++ b/dev.c
@@ -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);
+}