#include "postgres.h"
#include "miscadmin.h"
#include "storage/ipc.h"
#include "storage/pg_sema.h"
Go to the source code of this file.
Functions | |
static void | ReleaseSemaphores (int code, Datum arg) |
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) |
Variables | |
static HANDLE * | mySemSet |
static int | numSems |
static int | maxSems |
void PGReserveSemaphores | ( | int | maxSemas, | |
int | port | |||
) |
Definition at line 36 of file win32_sema.c.
References elog, malloc, maxSems, mySemPointers, mySemSet, nextSemKey, NULL, numSems, on_shmem_exit(), PANIC, and ReleaseSemaphores().
{ mySemSet = (HANDLE *) malloc(maxSemas * sizeof(HANDLE)); if (mySemSet == NULL) elog(PANIC, "out of memory"); numSems = 0; maxSems = maxSemas; on_shmem_exit(ReleaseSemaphores, 0); }
void PGSemaphoreCreate | ( | PGSemaphore | sema | ) |
Definition at line 68 of file win32_sema.c.
References Assert, elog, ereport, errmsg(), IsUnderPostmaster, maxSems, mySemPointers, mySemSet, NULL, numSems, PANIC, and PosixSemaphoreCreate().
{ HANDLE cur_handle; SECURITY_ATTRIBUTES sec_attrs; /* Can't do this in a backend, because static state is postmaster's */ Assert(!IsUnderPostmaster); if (numSems >= maxSems) elog(PANIC, "too many semaphores created"); ZeroMemory(&sec_attrs, sizeof(sec_attrs)); sec_attrs.nLength = sizeof(sec_attrs); sec_attrs.lpSecurityDescriptor = NULL; sec_attrs.bInheritHandle = TRUE; /* We don't need a named semaphore */ cur_handle = CreateSemaphore(&sec_attrs, 1, 32767, NULL); if (cur_handle) { /* Successfully done */ *sema = cur_handle; mySemSet[numSems++] = cur_handle; } else ereport(PANIC, (errmsg("could not create semaphore: error code %lu", GetLastError()))); }
void PGSemaphoreLock | ( | PGSemaphore | sema, | |
bool | interruptOK | |||
) |
Definition at line 119 of file win32_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.
{ DWORD ret; HANDLE wh[2]; /* * Note: pgwin32_signal_event should be first to ensure that it will be * reported when multiple events are set. We want to guarantee that * pending signals are serviced. */ wh[0] = pgwin32_signal_event; wh[1] = *sema; /* * As in other implementations of PGSemaphoreLock, we need to check for * cancel/die interrupts each time through the loop. But here, there is * no hidden magic about whether the syscall will internally service a * signal --- we do that ourselves. */ do { ImmediateInterruptOK = interruptOK; CHECK_FOR_INTERRUPTS(); ret = WaitForMultipleObjectsEx(2, wh, FALSE, INFINITE, TRUE); if (ret == WAIT_OBJECT_0) { /* Signal event is set - we have a signal to deliver */ pgwin32_dispatch_queued_signals(); errno = EINTR; } else if (ret == WAIT_OBJECT_0 + 1) { /* We got it! */ errno = 0; } else /* Otherwise we are in trouble */ errno = EIDRM; ImmediateInterruptOK = false; } while (errno == EINTR); if (errno != 0) ereport(FATAL, (errmsg("could not lock semaphore: error code %lu", GetLastError()))); }
void PGSemaphoreReset | ( | PGSemaphore | sema | ) |
Definition at line 103 of file win32_sema.c.
References EAGAIN, EINTR, elog, FATAL, PG_SEM_REF, and PGSemaphoreTryLock().
{ /* * There's no direct API for this in Win32, so we have to ratchet the * semaphore down to 0 with repeated trylock's. */ while (PGSemaphoreTryLock(sema)); }
bool PGSemaphoreTryLock | ( | PGSemaphore | sema | ) |
Definition at line 187 of file win32_sema.c.
References EAGAIN, EINTR, elog, ereport, errmsg(), FATAL, and PG_SEM_REF.
{ DWORD ret; ret = WaitForSingleObject(*sema, 0); if (ret == WAIT_OBJECT_0) { /* We got it! */ return true; } else if (ret == WAIT_TIMEOUT) { /* Can't get it */ errno = EAGAIN; return false; } /* Otherwise we are in trouble */ ereport(FATAL, (errmsg("could not try-lock semaphore: error code %lu", GetLastError()))); /* keep compiler quiet */ return false; }
void PGSemaphoreUnlock | ( | PGSemaphore | sema | ) |
static void ReleaseSemaphores | ( | int | code, | |
Datum | arg | |||
) | [static] |
int maxSems [static] |
Definition at line 22 of file win32_sema.c.
Referenced by PGReserveSemaphores(), and PGSemaphoreCreate().
HANDLE* mySemSet [static] |
Definition at line 20 of file win32_sema.c.
Referenced by PGReserveSemaphores(), PGSemaphoreCreate(), and ReleaseSemaphores().
int numSems [static] |
Definition at line 21 of file win32_sema.c.
Referenced by PGReserveSemaphores(), PGSemaphoreCreate(), and ReleaseSemaphores().