| 1226 | */ |
| 1227 | |
| 1228 | static void unlink_block(KEY_CACHE *keycache, BLOCK_LINK *block) |
| 1229 | { |
| 1230 | DBUG_ASSERT((block->status & ~BLOCK_CHANGED) == (BLOCK_READ | BLOCK_IN_USE)); |
| 1231 | DBUG_ASSERT(block->hash_link); /*backptr to block NULL from free_block()*/ |
| 1232 | DBUG_ASSERT(!block->requests); |
| 1233 | DBUG_ASSERT(block->prev_changed && *block->prev_changed == block); |
| 1234 | DBUG_ASSERT(block->next_used && block->prev_used && |
| 1235 | (block->next_used->prev_used == &block->next_used) && |
| 1236 | (*block->prev_used == block)); |
| 1237 | if (block->next_used == block) |
| 1238 | /* The list contains only one member */ |
| 1239 | keycache->used_last= keycache->used_ins= NULL; |
| 1240 | else |
| 1241 | { |
| 1242 | block->next_used->prev_used= block->prev_used; |
| 1243 | *block->prev_used= block->next_used; |
| 1244 | if (keycache->used_last == block) |
| 1245 | keycache->used_last= STRUCT_PTR(BLOCK_LINK, next_used, block->prev_used); |
| 1246 | if (keycache->used_ins == block) |
| 1247 | keycache->used_ins=STRUCT_PTR(BLOCK_LINK, next_used, block->prev_used); |
| 1248 | } |
| 1249 | block->next_used= NULL; |
| 1250 | #if !defined(DBUG_OFF) |
| 1251 | /* |
| 1252 | This makes it easier to see it's not in a chain during debugging. |
| 1253 | And some DBUG_ASSERT() rely on it. |
| 1254 | */ |
| 1255 | block->prev_used= NULL; |
| 1256 | #endif |
| 1257 | |
| 1258 | KEYCACHE_THREAD_TRACE("unlink_block"); |
| 1259 | #if defined(KEYCACHE_DEBUG) |
| 1260 | KEYCACHE_DBUG_ASSERT(keycache->blocks_available != 0); |
| 1261 | keycache->blocks_available--; |
| 1262 | KEYCACHE_DBUG_PRINT("unlink_block", |
| 1263 | ("unlinked block %u status=%x #requests=%u #available=%u", |
| 1264 | BLOCK_NUMBER(block), block->status, |
| 1265 | block->requests, keycache->blocks_available)); |
| 1266 | #endif |
| 1267 | } |
| 1268 | |
| 1269 | |
| 1270 | /* |
no outgoing calls
no test coverage detected