| 3323 | |
| 3324 | |
| 3325 | static void clear_precedence(thread_db* tdbb, BufferDesc* bdb) |
| 3326 | { |
| 3327 | /************************************** |
| 3328 | * |
| 3329 | * c l e a r _ p r e c e d e n c e |
| 3330 | * |
| 3331 | ************************************** |
| 3332 | * |
| 3333 | * Functional description |
| 3334 | * Clear precedence relationships to lower precedence block. |
| 3335 | * |
| 3336 | **************************************/ |
| 3337 | SET_TDBB(tdbb); |
| 3338 | |
| 3339 | if (QUE_EMPTY(bdb->bdb_lower)) |
| 3340 | return; |
| 3341 | |
| 3342 | BufferControl* const bcb = bdb->bdb_bcb; |
| 3343 | Sync precSync(&bcb->bcb_syncPrecedence, "clear_precedence"); |
| 3344 | if (!bcb->bcb_syncPrecedence.ourExclusiveLock()) |
| 3345 | precSync.lock(SYNC_EXCLUSIVE); |
| 3346 | |
| 3347 | // Loop thru lower precedence buffers. If any can be downgraded, |
| 3348 | // by all means down grade them. |
| 3349 | |
| 3350 | while (QUE_NOT_EMPTY(bdb->bdb_lower)) |
| 3351 | { |
| 3352 | QUE que_inst = bdb->bdb_lower.que_forward; |
| 3353 | Precedence* precedence = BLOCK(que_inst, Precedence, pre_lower); |
| 3354 | BufferDesc* low_bdb = precedence->pre_low; |
| 3355 | QUE_DELETE(precedence->pre_higher); |
| 3356 | QUE_DELETE(precedence->pre_lower); |
| 3357 | |
| 3358 | precedence->pre_hi = (BufferDesc*) bcb->bcb_free; |
| 3359 | bcb->bcb_free = precedence; |
| 3360 | if (!(precedence->pre_flags & PRE_cleared)) |
| 3361 | { |
| 3362 | if (low_bdb->bdb_ast_flags & BDB_blocking) |
| 3363 | PAGE_LOCK_RE_POST(tdbb, bcb, low_bdb->bdb_lock); |
| 3364 | } |
| 3365 | } |
| 3366 | } |
| 3367 | |
| 3368 | |
| 3369 | static void down_grade(thread_db* tdbb, BufferDesc* bdb, int high) |
no test coverage detected