~m.ch/mysql-server/mysql-6.0-sigar-plugin

« back to all changes in this revision

Viewing changes to storage/falcon/RecoveryObjects.cpp

  • Committer: Davi Arnaut
  • Date: 2008-08-12 04:38:50 UTC
  • mfrom: (2764 mysql-6.0-to-merge)
  • mto: This revision was merged to the branch mainline in revision 2765.
  • Revision ID: davi.arnaut@sun.com-20080812043850-9tr1ojwrnv15r0gd
Merge mysql-6.0 into mysql-6.0-bugteam

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
#include "RecoveryObjects.h"
24
24
#include "RecoveryPage.h"
25
25
#include "SerialLog.h"
 
26
#include "SyncObject.h"
 
27
#include "Sync.h"
26
28
 
27
29
#ifdef _DEBUG
28
30
#undef THIS_FILE
38
40
{
39
41
        serialLog = log;
40
42
        memset(recoveryObjects, 0, sizeof(recoveryObjects));
 
43
        for (int n = 0; n < RPG_HASH_SIZE; n++)
 
44
                syncArray[n].setName("RecoveryObjects::syncArray");
41
45
}
42
46
 
43
47
RecoveryObjects::~RecoveryObjects()
95
99
        return object->pass1Count == object->currentCount;
96
100
}
97
101
 
 
102
 
 
103
static inline RecoveryPage * findInHashBucket(RecoveryPage *head, int objectNumber, int tableSpaceId)
 
104
{
 
105
        for (RecoveryPage *object = head ; object; object = object->collision)
 
106
                if (object->objectNumber == objectNumber && object->tableSpaceId == tableSpaceId)
 
107
                        return object;
 
108
 
 
109
        return NULL;
 
110
}
 
111
 
98
112
RecoveryPage* RecoveryObjects::findRecoveryObject(int objectNumber, int tableSpaceId)
99
113
{
100
114
        int slot = objectNumber % RPG_HASH_SIZE;
101
 
 
102
 
        for (RecoveryPage *object = recoveryObjects[slot]; object; object = object->collision)
103
 
                if (object->objectNumber == objectNumber && object->tableSpaceId == tableSpaceId)
104
 
                        return object;
105
 
 
106
 
        return NULL;
 
115
        Sync sync(&syncArray[slot], "RecoveryObjects::findRecoveryObject");
 
116
        sync.lock(Shared);
 
117
        return findInHashBucket(recoveryObjects[slot], objectNumber, tableSpaceId);
107
118
}
108
119
 
109
120
void RecoveryObjects::setActive(int objectNumber, int tableSpaceId)
129
140
        int slot = objectNumber % RPG_HASH_SIZE;
130
141
        RecoveryPage *object;
131
142
 
132
 
        for (object = recoveryObjects[slot]; object; object = object->collision)
133
 
                if (object->objectNumber == objectNumber && object->tableSpaceId == tableSpaceId)
134
 
                        return object;
135
 
 
 
143
        Sync sync(&syncArray[slot], "RecoveryObjects::getRecoveryObject");
 
144
        sync.lock(Shared);
 
145
        object = findInHashBucket(recoveryObjects[slot], objectNumber, tableSpaceId);
 
146
 
 
147
        if(object)
 
148
                return object;
 
149
 
 
150
        // Object not found, insert (need exlusive lock for this)
 
151
        sync.unlock();
 
152
        sync.lock(Exclusive);
 
153
 
 
154
        // We need to traverse the collision list once again. Another thread 
 
155
        // may have inserted the entry while current thread was waiting 
 
156
        // for exclusive lock.
 
157
        object = findInHashBucket(recoveryObjects[slot], objectNumber, tableSpaceId);
 
158
        if (object)
 
159
                return object;
 
160
 
 
161
        // Add object to the start of the collision list
136
162
        object = new RecoveryPage(objectNumber, tableSpaceId);
137
163
        object->collision = recoveryObjects[slot];
138
164
        recoveryObjects[slot] = object;
143
169
void RecoveryObjects::deleteObject(int objectNumber, int tableSpaceId)
144
170
{
145
171
        int slot = objectNumber % RPG_HASH_SIZE;
146
 
        
 
172
        Sync sync(&syncArray[slot], "RecoveryObjects::deleteObject");
 
173
        sync.lock(Exclusive);
 
174
 
147
175
        for (RecoveryPage **ptr = recoveryObjects + slot, *object; (object = *ptr); ptr = &object->collision)
148
176
                if (object->objectNumber == objectNumber && object->tableSpaceId == tableSpaceId)
149
177
                        {