MCPcopy Create free account
hub / github.com/apache/cloudberry / GetSingleProcBlockerStatusData

Function GetSingleProcBlockerStatusData

src/backend/storage/lmgr/lock.c:4451–4537  ·  view source on GitHub ↗

Accumulate data about one possibly-blocked proc for GetBlockerStatusData */

Source from the content-addressed store, hash-verified

4449
4450/* Accumulate data about one possibly-blocked proc for GetBlockerStatusData */
4451static void
4452GetSingleProcBlockerStatusData(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

Callers 1

GetBlockerStatusDataFunction · 0.85

Calls 2

SHMQueueNextFunction · 0.85
repallocFunction · 0.50

Tested by

no test coverage detected