+#include "zserver.h"
+
+static ZebraLockHandle server_lock_main = NULL;
+static ZebraLockHandle server_lock_cmt = NULL;
+static ZebraLockHandle server_lock_org = NULL;
+
+int zebraIndexWait (ZebraHandle zh, int commitPhase)
+{
+ ZebraLockHandle h;
+
+ if (server_lock_cmt)
+ zebra_unlock (server_lock_cmt);
+ else
+ {
+ char path[1024];
+
+ zebra_lock_prefix (zh->service->res, path);
+ strcat (path, FNAME_COMMIT_LOCK);
+ server_lock_cmt = zebra_lock_create (path, 1);
+ if (!server_lock_cmt)
+ {
+ logf (LOG_WARN|LOG_ERRNO, "cannot create lock %s", path);
+ return -1;
+ }
+ }
+ if (server_lock_org)
+ zebra_unlock (server_lock_org);
+ else
+ {
+ char path[1024];
+
+ zebra_lock_prefix (zh->service->res, path);
+ strcat (path, FNAME_ORG_LOCK);
+ server_lock_org = zebra_lock_create (path, 1);
+ if (!server_lock_org)
+ {
+ logf (LOG_WARN|LOG_ERRNO, "cannot create lock %s", path);
+ return -1;
+ }
+ }
+ if (commitPhase)
+ h = server_lock_cmt;
+ else
+ h = server_lock_org;
+ if (zebra_lock_nb (h))
+ {
+#ifndef WIN32
+ if (errno != EWOULDBLOCK)
+ {
+ logf (LOG_FATAL|LOG_ERRNO, "flock");
+ exit (1);
+ }
+#endif
+ if (commitPhase)
+ logf (LOG_LOG, "Waiting for lock cmt");
+ else
+ logf (LOG_LOG, "Waiting for lock org");
+ if (zebra_lock (h) == -1)
+ {
+ logf (LOG_FATAL, "flock");
+ exit (1);
+ }
+ }
+ zebra_unlock (h);
+ return 0;
+}