Accumulate data about one possibly-blocked proc for GetBlockerStatusData */
| 4449 | |
| 4450 | /* Accumulate data about one possibly-blocked proc for GetBlockerStatusData */ |
| 4451 | static void |
| 4452 | GetSingleProcBlockerStatusData(PGPROC *blocked_proc, BlockedProcsData *data) |
| 4453 | { |
| 4454 | LOCK *theLock = blocked_proc->waitLock; |
| 4455 | BlockedProcData *bproc; |
| 4456 | SHM_QUEUE *procLocks; |
| 4457 | PROCLOCK *proclock; |
| 4458 | PROC_QUEUE *waitQueue; |
| 4459 | PGPROC *proc; |
| 4460 | int queue_size; |
| 4461 | int i; |
| 4462 | |
| 4463 | /* Nothing to do if this proc is not blocked */ |
| 4464 | if (theLock == NULL) |
| 4465 | return; |
| 4466 | |
| 4467 | /* Set up a procs[] element */ |
| 4468 | bproc = &data->procs[data->nprocs++]; |
| 4469 | bproc->pid = blocked_proc->pid; |
| 4470 | bproc->first_lock = data->nlocks; |
| 4471 | bproc->first_waiter = data->npids; |
| 4472 | |
| 4473 | /* |
| 4474 | * We may ignore the proc's fast-path arrays, since nothing in those could |
| 4475 | * be related to a contended lock. |
| 4476 | */ |
| 4477 | |
| 4478 | /* Collect all PROCLOCKs associated with theLock */ |
| 4479 | procLocks = &(theLock->procLocks); |
| 4480 | proclock = (PROCLOCK *) SHMQueueNext(procLocks, procLocks, |
| 4481 | offsetof(PROCLOCK, lockLink)); |
| 4482 | while (proclock) |
| 4483 | { |
| 4484 | PGPROC *proc = proclock->tag.myProc; |
| 4485 | LOCK *lock = proclock->tag.myLock; |
| 4486 | LockInstanceData *instance; |
| 4487 | |
| 4488 | if (data->nlocks >= data->maxlocks) |
| 4489 | { |
| 4490 | data->maxlocks += MaxBackends; |
| 4491 | data->locks = (LockInstanceData *) |
| 4492 | repalloc(data->locks, sizeof(LockInstanceData) * data->maxlocks); |
| 4493 | } |
| 4494 | |
| 4495 | instance = &data->locks[data->nlocks]; |
| 4496 | memcpy(&instance->locktag, &lock->tag, sizeof(LOCKTAG)); |
| 4497 | instance->holdMask = proclock->holdMask; |
| 4498 | if (proc->waitLock == lock) |
| 4499 | instance->waitLockMode = proc->waitLockMode; |
| 4500 | else |
| 4501 | instance->waitLockMode = NoLock; |
| 4502 | instance->backend = proc->backendId; |
| 4503 | instance->lxid = proc->lxid; |
| 4504 | instance->pid = proc->pid; |
| 4505 | instance->leaderPid = proclock->groupLeader->pid; |
| 4506 | instance->fastpath = false; |
| 4507 | data->nlocks++; |
| 4508 |
no test coverage detected