ofp-util: Work on decoding OF1.1 flow_mods.
[openvswitch] / lib / lockfile.c
index 9bb7c6b18af76a08b8159cb0a57c4a9e04208102..e0f6328710bd6ab52e4cd0e7a81428f923d8a720 100644 (file)
@@ -1,4 +1,4 @@
- /* Copyright (c) 2008, 2009 Nicira Networks
+ /* Copyright (c) 2008, 2009, 2010, 2011 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 #include "hmap.h"
 #include "timeval.h"
 #include "util.h"
-
-#define THIS_MODULE VLM_lockfile
 #include "vlog.h"
 
+VLOG_DEFINE_THIS_MODULE(lockfile);
+
+COVERAGE_DEFINE(lockfile_lock);
+COVERAGE_DEFINE(lockfile_timeout);
+COVERAGE_DEFINE(lockfile_error);
+COVERAGE_DEFINE(lockfile_unlock);
+
 struct lockfile {
     struct hmap_node hmap_node;
     char *name;
@@ -84,6 +89,7 @@ lockfile_lock(const char *file, int timeout, struct lockfile **lockfilep)
      * because the Open vSwitch code that currently uses lock files does so in
      * stylized ways such that any number of readers may access a file while it
      * is being written. */
+    long long int warn_elapsed = 1000;
     long long int start, elapsed;
     char *lock_name;
     int error;
@@ -98,19 +104,19 @@ lockfile_lock(const char *file, int timeout, struct lockfile **lockfilep)
         error = lockfile_try_lock(lock_name, timeout > 0, lockfilep);
         time_refresh();
         elapsed = time_msec() - start;
-    } while (error == EINTR && (timeout == INT_MAX || elapsed < timeout));
-
-    if (!error) {
-        if (elapsed) {
-            VLOG_WARN("%s: waited %lld ms for lock file",
+        if (elapsed > warn_elapsed) {
+            warn_elapsed *= 2;
+            VLOG_WARN("%s: waiting for lock file, %lld ms elapsed",
                       lock_name, elapsed);
         }
-    } else if (error == EINTR) {
+    } while (error == EINTR && (timeout == INT_MAX || elapsed < timeout));
+
+    if (error == EINTR) {
         COVERAGE_INC(lockfile_timeout);
         VLOG_WARN("%s: giving up on lock file after %lld ms",
                   lock_name, elapsed);
         error = ETIMEDOUT;
-    } else {
+    } else if (error) {
         COVERAGE_INC(lockfile_error);
         if (error == EACCES) {
             error = EAGAIN;
@@ -145,7 +151,7 @@ lockfile_postfork(void)
 {
     struct lockfile *lockfile;
 
-    HMAP_FOR_EACH (lockfile, struct lockfile, hmap_node, &lock_table) {
+    HMAP_FOR_EACH (lockfile, hmap_node, &lock_table) {
         if (lockfile->fd >= 0) {
             VLOG_WARN("%s: child does not inherit lock", lockfile->name);
             lockfile_unhash(lockfile);
@@ -165,7 +171,7 @@ lockfile_find(dev_t device, ino_t inode)
 {
     struct lockfile *lockfile;
 
-    HMAP_FOR_EACH_WITH_HASH (lockfile, struct lockfile, hmap_node,
+    HMAP_FOR_EACH_WITH_HASH (lockfile, hmap_node,
                              lockfile_hash(device, inode), &lock_table) {
         if (lockfile->device == device && lockfile->inode == inode) {
             return lockfile;