00001
00029 #include "abacus/master.h"
00030 #include "abacus/id.h"
00031 #include "abacus/hash.h"
00032
00033 template <class Type>
00034 ABA_IDMAP<Type>::ABA_IDMAP(ABA_MASTER *master, int size, int index)
00035 :
00036 master_(master),
00037 map_(master, size),
00038 sequence_(1),
00039 index_(index)
00040 {
00041 proc_ = master->parmaster()->hostId();
00042 }
00043
00044 template <class Type>
00045 ABA_IDMAP<Type>::~ABA_IDMAP()
00046 {
00047 }
00048
00049 template <class Type>
00050 ostream& operator<<(ostream &out, const ABA_IDMAP<Type> &idmap)
00051 {
00052 idmap.mp_.acquire();
00053
00054 out << "ABA_IDMAP: proc=" << idmap.proc_
00055 << ", sequence=" << idmap.sequence_
00056 << endl;
00057 out << idmap.map_;
00058
00059 idmap.mp_.release();
00060 return out;
00061 }
00062
00063 template<class Type>
00064 Type *ABA_IDMAP<Type>::find(const ABA_ID &id)
00065 {
00066 mp_.acquire();
00067
00068 const Type **ptr = map_.find(id);
00069
00070 mp_.release();
00071 return ptr ? (Type*)(*ptr) : 0;
00072 }
00073
00074 template<class Type>
00075 void ABA_IDMAP<Type>::insert(const ABA_ID &id, const Type *obj)
00076 {
00077 mp_.acquire();
00078
00079 #ifdef ABACUSSAFE
00080 if (map_.find(id)) {
00081 master_->err() << "ABA_IDMAP::insert(): tried to insert ABA_ID "
00082 << id << " more than once.";
00083 exit(Fatal);
00084 }
00085 #endif
00086
00087 map_.insert(id, obj);
00088
00089 mp_.release();
00090 }
00091
00092 extern "C" {
00093 #include <limits.h>
00094 }
00095 template<class Type>
00096 void ABA_IDMAP<Type>::insertWithNewId(ABA_ID &id, const Type *obj)
00097 {
00098 mp_.acquire();
00099
00100 if (sequence_ == ULONG_MAX) {
00101 master_->err() << "ABA_IDMAP::insertWithNewId(): insertion failed, "
00102 "maximum sequence number ULONG_MAX = "
00103 << ULONG_MAX << " reached";
00104 exit (Fatal);
00105 }
00106 id.initialize(sequence_++, proc_, index_);
00107
00108 #ifdef ABACUSSAFE
00109 if (map_.find(id)) {
00110 master_->err() << "ABA_IDMAP::insertWithNewId(): tried to insert ABA_ID "
00111 << id << " more than once.";
00112 exit(Fatal);
00113 }
00114 #endif
00115
00116 map_.insert(id, obj);
00117 mp_.release();
00118 }
00119
00120 template<class Type>
00121 int ABA_IDMAP<Type>::remove(const ABA_ID &id)
00122 {
00123 mp_.acquire();
00124 int status = map_.remove(id);
00125 mp_.release();
00126 return status;
00127 }