
Go to the source code of this file.
Typedefs | |
| typedef PGSemaphoreData * | PGSemaphore |
Functions | |
| void | PGReserveSemaphores (int maxSemas, int port) |
| void | PGSemaphoreCreate (PGSemaphore sema) |
| void | PGSemaphoreReset (PGSemaphore sema) |
| void | PGSemaphoreLock (PGSemaphore sema, bool interruptOK) |
| void | PGSemaphoreUnlock (PGSemaphore sema) |
| bool | PGSemaphoreTryLock (PGSemaphore sema) |
| typedef PGSemaphoreData* PGSemaphore |
| void PGReserveSemaphores | ( | int | maxSemas, | |
| int | port | |||
| ) |
Definition at line 154 of file posix_sema.c.
References elog, malloc, maxSemaSets, maxSems, mySemaSets, mySemPointers, mySemSet, nextSemaKey, nextSemaNumber, nextSemKey, NULL, numSemaSets, numSems, on_shmem_exit(), PANIC, ReleaseSemaphores(), and SEMAS_PER_SET.
Referenced by CreateSharedMemoryAndSemaphores(), and main().
{
mySemPointers = (sem_t **) malloc(maxSemas * sizeof(sem_t *));
if (mySemPointers == NULL)
elog(PANIC, "out of memory");
numSems = 0;
maxSems = maxSemas;
nextSemKey = port * 1000;
on_shmem_exit(ReleaseSemaphores, 0);
}
| void PGSemaphoreCreate | ( | PGSemaphore | sema | ) |
Definition at line 187 of file posix_sema.c.
References Assert, elog, ereport, errmsg(), IpcSemaphoreCreate(), IpcSemaphoreInitialize(), IsUnderPostmaster, maxSemaSets, maxSems, mySemaSets, mySemPointers, mySemSet, nextSemaNumber, NULL, numSemaSets, numSems, PANIC, PosixSemaphoreCreate(), and SEMAS_PER_SET.
Referenced by InitProcGlobal(), main(), and s_init_lock_sema().
{
sem_t *newsem;
/* Can't do this in a backend, because static state is postmaster's */
Assert(!IsUnderPostmaster);
if (numSems >= maxSems)
elog(PANIC, "too many semaphores created");
#ifdef USE_NAMED_POSIX_SEMAPHORES
*sema = newsem = PosixSemaphoreCreate();
#else
PosixSemaphoreCreate(sema);
newsem = sema;
#endif
/* Remember new sema for ReleaseSemaphores */
mySemPointers[numSems++] = newsem;
}
| void PGSemaphoreLock | ( | PGSemaphore | sema, | |
| bool | interruptOK | |||
| ) |
Definition at line 239 of file posix_sema.c.
References CHECK_FOR_INTERRUPTS, EINTR, elog, ereport, errmsg(), FALSE, FATAL, ImmediateInterruptOK, PG_SEM_REF, pgwin32_dispatch_queued_signals(), pgwin32_signal_event, and TRUE.
Referenced by LWLockAcquire(), LWLockAcquireOrWait(), main(), ProcSleep(), and ProcWaitForSignal().
{
int errStatus;
/*
* See notes in sysv_sema.c's implementation of PGSemaphoreLock. Just as
* that code does for semop(), we handle both the case where sem_wait()
* returns errno == EINTR after a signal, and the case where it just keeps
* waiting.
*/
do
{
ImmediateInterruptOK = interruptOK;
CHECK_FOR_INTERRUPTS();
errStatus = sem_wait(PG_SEM_REF(sema));
ImmediateInterruptOK = false;
} while (errStatus < 0 && errno == EINTR);
if (errStatus < 0)
elog(FATAL, "sem_wait failed: %m");
}
| void PGSemaphoreReset | ( | PGSemaphore | sema | ) |
Definition at line 214 of file posix_sema.c.
References EAGAIN, EINTR, elog, FATAL, IpcSemaphoreInitialize(), PG_SEM_REF, and PGSemaphoreTryLock().
Referenced by InitAuxiliaryProcess(), InitProcess(), and main().
{
/*
* There's no direct API for this in POSIX, so we have to ratchet the
* semaphore down to 0 with repeated trywait's.
*/
for (;;)
{
if (sem_trywait(PG_SEM_REF(sema)) < 0)
{
if (errno == EAGAIN || errno == EDEADLK)
break; /* got it down to 0 */
if (errno == EINTR)
continue; /* can this happen? */
elog(FATAL, "sem_trywait failed: %m");
}
}
}
| bool PGSemaphoreTryLock | ( | PGSemaphore | sema | ) |
Definition at line 292 of file posix_sema.c.
References EAGAIN, EINTR, elog, ereport, errmsg(), EWOULDBLOCK, FATAL, and PG_SEM_REF.
Referenced by main(), PGSemaphoreReset(), and tas_sema().
{
int errStatus;
/*
* Note: if errStatus is -1 and errno == EINTR then it means we returned
* from the operation prematurely because we were sent a signal. So we
* try and lock the semaphore again.
*/
do
{
errStatus = sem_trywait(PG_SEM_REF(sema));
} while (errStatus < 0 && errno == EINTR);
if (errStatus < 0)
{
if (errno == EAGAIN || errno == EDEADLK)
return false; /* failed to lock it */
/* Otherwise we got trouble */
elog(FATAL, "sem_trywait failed: %m");
}
return true;
}
| void PGSemaphoreUnlock | ( | PGSemaphore | sema | ) |
Definition at line 267 of file posix_sema.c.
References EINTR, elog, ereport, errmsg(), FATAL, NULL, and PG_SEM_REF.
Referenced by CheckDeadLock(), IpcSemaphoreCreate(), LWLockAcquire(), LWLockAcquireOrWait(), LWLockRelease(), main(), ProcSendSignal(), ProcWakeup(), and s_unlock_sema().
{
int errStatus;
/*
* Note: if errStatus is -1 and errno == EINTR then it means we returned
* from the operation prematurely because we were sent a signal. So we
* try and unlock the semaphore again. Not clear this can really happen,
* but might as well cope.
*/
do
{
errStatus = sem_post(PG_SEM_REF(sema));
} while (errStatus < 0 && errno == EINTR);
if (errStatus < 0)
elog(FATAL, "sem_post failed: %m");
}
1.7.1