Mercurial > ~dholland > hg > ag > index.cgi
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 */