diff anagram/guisupport/resource.h @ 0:13d2b8934445

Import AnaGram (near-)release tree into Mercurial.
author David A. Holland
date Sat, 22 Dec 2007 17:52:45 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/anagram/guisupport/resource.h	Sat Dec 22 17:52:45 2007 -0500
@@ -0,0 +1,67 @@
+/*
+ * AnaGram, A System for Syntax Directed Programming
+ * Copyright 1993-2002 Parsifal Software. All Rights Reserved.
+ * See the file COPYING for license and usage terms.
+ *
+ * resource.h
+ */
+
+#ifndef RESOURCE_H
+#define RESOURCE_H
+
+#ifdef __IBMCPP__
+#include <ireslock.hpp>
+#endif
+
+
+#ifdef __IBMCPP__
+
+class AgResource {
+private:
+  class Resource : public IPrivateResource {
+  public:
+    void *operator new (size_t, void *s) { return s; }
+  };
+
+  void *storage;
+  IPrivateResource *resource;
+
+public:
+  AgResource() : storage(0), resource(0) {}
+  ~AgResource() { if (storage == 0) delete resource; }
+  void lock() {
+    if (resource == 0) {
+      resource = new IPrivateResource;
+    }
+    resource->lock();
+  }
+  void lock(void *s) {
+    if (resource == 0) {
+      resource = new(storage = s) Resource;
+    }
+    resource->lock();
+  }
+  void unlock() {
+    resource->unlock();
+  }
+};
+
+#endif /* __IBMCPP__ */
+
+
+class AgLock {
+private:
+  AgResource &resource;
+
+public:
+  AgLock(AgResource &r) : resource(r) {
+    resource.lock();
+  }
+  AgLock(AgResource &r, void *s) : resource(r) {
+    resource.lock(s);
+  }
+  ~AgLock() {resource.unlock();}
+};
+
+
+#endif /* RESOURCE_H */