1 /***************************************************************************
2 * Copyright (C) 2007 by www.databasecache.com *
3 * Contact: praba_tuty@databasecache.com *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 ***************************************************************************/
28 //-1 indicates write lock is taken
32 LockInfo() { noOfReaders_
= 0; waitReaders_
= 0; waitWriters_
= 0; }
44 printf("<Lock Node>\n");
45 printf(" <Tuple> %x </Tuple>\n", ptrToTuple_
);
46 printf(" <NoOfReaders> %d </NoOfReaders>\n", lInfo_
.noOfReaders_
);
47 printf(" <WaitReaders> %x </WaitReaders>\n", lInfo_
.waitReaders_
);
48 printf(" <WaitWriters> %x </WaitWriters>\n", lInfo_
.waitWriters_
);
49 printf("</Lock Node>\n");
56 Database
*systemDatabase_
;
58 //Each thread contains its own DatabaseManager object which inturn contains
59 //LockManager and which inturn contains LockTable. So this is thread
60 //specific and contains cached current bucket for which lock needs to be
61 //obtained or released
65 LockHashNode
* allocLockNode(LockInfo
&info
, void *tuple
, DbRetVal
*rv
);
66 DbRetVal
deallocLockNode(LockHashNode
*head
, Bucket
*bucket
);
67 void deallocLockNode(LockHashNode
*head
);
68 DbRetVal
addNewLockNode(void *tuple
, Transaction
**trans
,
70 DbRetVal
releaseLock(LockHashNode
*node
);
71 LockHashNode
* getLockNode(void *tuple
, DbRetVal
&rv
, bool takeLock
=true);
75 void setDb(Database
*sysDb
);
76 Bucket
* getLockBucket(void *tuple
);
78 DbRetVal
getBucketMutex();
79 void releaseBucketMutex();
80 void printUsageStatistics();
81 void printDebugInfo();
82 void printMutexInfo();
90 void print() { node_
->print(); }
93 class DatabaseManagerImpl
;
95 //DatabaseManager has this object and give reference to it to
96 //Table interface and so on.
97 class DllExport LockManager
100 Database
*systemDatabase_
;
104 LockHashNode
* allocLockNode(LockInfo
&info
, void *tuple
, DbRetVal
*rv
);
105 DbRetVal
deallocLockNode(LockHashNode
*head
, Bucket
*bucket
);
106 void deallocLockNode(LockHashNode
*head
);
107 Bucket
* getLockBucket(void *tuple
);
108 DbRetVal
createFirstNodeInBucket(void *tuple
, Transaction
**trans
,
109 Bucket
*bucket
, LockInfo
&info
);
110 DbRetVal
addNewNodeToBucket(void *tuple
, Transaction
**trans
,
111 Bucket
*bucket
, LockInfo
&info
);
112 DbRetVal
retrySharedLock(Transaction
**trans
,
114 DbRetVal
retryExclusiveLock(Transaction
**trans
,
116 DbRetVal
takeXLockNotInUse(Transaction
**trans
, LockHashNode
*node
);
117 bool takeXLockOneReader(Transaction
**trans
, LockHashNode
*node
);
118 bool takeXLockOneWriter(Transaction
**trans
, LockHashNode
*node
);
119 DbRetVal
releaseLock(Bucket
*bucket
, LockHashNode
*node
);
123 LockManager(Database
*sysDb_
);
124 DbRetVal
getSharedLock(void *tuple
, Transaction
**trans
);
125 DbRetVal
getExclusiveLock(void * tuple
, Transaction
**trans
);
126 DbRetVal
releaseLock(void *tuple
);
127 DbRetVal
isExclusiveLocked(void *tuple
, Transaction
**trans
, bool &status
);
128 DbRetVal
getBucketMutex(Bucket
*bucket
, int procslot
);
129 void printUsageStatistics();
130 void printDebugInfo();
131 void printMutexInfo();