blob: 278d1250422b7e43e85a52e13fb21cc8dd773a06 [file] [log] [blame]
//===------- LockedMap.h - A thread-safe map implementation ---------------===//
//
// JnJVM
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef JNJVM_LOCKED_MAP_H
#define JNJVM_LOCKED_MAP_H
#include <map>
#include <string.h>
#include "types.h"
#include "mvm/Object.h"
#include "mvm/PrintBuffer.h"
#include "mvm/Threads/Locks.h"
#include "JavaArray.h"
#include "JavaClass.h"
#include "JavaTypes.h"
#include "JavaString.h"
#include "Zip.h"
namespace jnjvm {
class JavaObject;
class Allocator;
struct ltutf8
{
bool operator()(const UTF8* s1, const UTF8* s2) const
{
return s1->lessThan(s2);
}
};
template<class Key, class Container, class Compare, class Meta>
class LockedMap : public mvm::Object {
public:
typedef typename std::map<const Key, Container, Compare>::iterator iterator;
typedef Container (*funcCreate)(Key& V, Meta meta);
mvm::Lock* lock;
std::map<const Key, Container, Compare,
gc_allocator<std::pair<const Key, Container> > > map;
inline Container lookupOrCreate(Key& V, Meta meta, funcCreate func) {
lock->lock();
iterator End = map.end();
iterator I = map.find(V);
if (I == End) {
Container res = func(V, meta);
map.insert(std::make_pair(V, res));
lock->unlock();
return res;
} else {
lock->unlock();
return ((Container)(I->second));
}
}
inline void remove(Key V) {
lock->lock();
map.erase(V);
lock->unlock();
}
inline Container lookup(Key V) {
lock->lock();
iterator End = map.end();
iterator I = map.find(V);
lock->unlock();
return I != End ? ((Container)(I->second)) : 0;
}
inline void hash(Key k, Container c) {
lock->lock();
map.insert(std::make_pair(k, c));
lock->unlock();
}
virtual void print(mvm::PrintBuffer* buf) const {
buf->write("Hashtable<>");
}
};
class UTF8Map {
public:
typedef std::multimap<const uint32, const UTF8*>::iterator iterator;
mvm::Lock* lock;
JavaAllocator* allocator;
UserClassArray* array;
std::multimap<const uint32, const UTF8*> map;
const UTF8* lookupOrCreateAsciiz(const char* asciiz);
const UTF8* lookupOrCreateReader(const uint16* buf, uint32 size);
const UTF8* lookupAsciiz(const char* asciiz);
const UTF8* lookupReader(const uint16* buf, uint32 size);
UTF8Map(JavaAllocator* A, UserClassArray* cl) {
lock = mvm::Lock::allocNormal();
allocator = A;
array = cl;
}
~UTF8Map() {
delete lock;
for (iterator i = map.begin(), e = map.end(); i!= e; ++i) {
delete(i->second);
}
}
void copy(UTF8Map* newMap) {
for (iterator i = map.begin(), e = map.end(); i!= e; ++i) {
newMap->map.insert(*i);
}
}
void replace(const UTF8* oldUTF8, const UTF8* newUTF8);
void insert(const UTF8* val);
};
class ClassMap :
public LockedMap<const UTF8*, UserCommonClass*, ltutf8, JnjvmClassLoader* > {
public:
static VirtualTable* VT;
ClassMap() {
lock = mvm::Lock::allocNormal();
}
~ClassMap() {
delete lock;
}
virtual void TRACER;
};
class StringMap {
public:
mvm::Lock* lock;
typedef std::map<const UTF8*, JavaString*, ltutf8>::iterator iterator;
std::map<const UTF8*, JavaString*, ltutf8 > map;
typedef JavaString* (*funcCreate)(const UTF8*& V, Jnjvm *vm);
StringMap() {
lock = mvm::Lock::allocNormal();
}
~StringMap() {
delete lock;
for (iterator i = map.begin(), e = map.end(); i!= e; ++i) {
free(i->second);
}
}
inline JavaString* lookupOrCreate(const UTF8*& V, Jnjvm *vm, funcCreate func) {
lock->lock();
iterator End = map.end();
iterator I = map.find(V);
if (I == End) {
JavaString* res = func(V, vm);
map.insert(std::make_pair(V, res));
lock->unlock();
return res;
} else {
lock->unlock();
return I->second;
}
}
};
class TypeMap {
public:
mvm::Lock* lock;
std::map<const UTF8*, Typedef*, ltutf8> map;
typedef std::map<const UTF8*, Typedef*, ltutf8>::iterator iterator;
inline Typedef* lookup(const UTF8* V) {
lock->lock();
iterator End = map.end();
iterator I = map.find(V);
lock->unlock();
return I != End ? I->second : 0;
}
inline void hash(const UTF8* k, Typedef* c) {
lock->lock();
map.insert(std::make_pair(k, c));
lock->unlock();
}
TypeMap() {
lock = mvm::Lock::allocRecursive();
}
~TypeMap() {
for (iterator i = map.begin(), e = map.end(); i!= e; ++i) {
delete i->second;
}
delete lock;
}
};
class SignMap {
public:
mvm::Lock* lock;
std::map<const UTF8*, Signdef*, ltutf8> map;
typedef std::map<const UTF8*, Signdef*, ltutf8>::iterator iterator;
inline Signdef* lookup(const UTF8* V) {
lock->lock();
iterator End = map.end();
iterator I = map.find(V);
lock->unlock();
return I != End ? I->second : 0;
}
inline void hash(const UTF8* k, Signdef* c) {
lock->lock();
map.insert(std::make_pair(k, c));
lock->unlock();
}
SignMap() {
lock = mvm::Lock::allocRecursive();
}
~SignMap() {
for (iterator i = map.begin(), e = map.end(); i!= e; ++i) {
delete i->second;
}
delete lock;
}
};
} // end namespace jnjvm
#endif