/* * PGSemaphoreCreate * * Allocate a PGSemaphore structure with initial count 1 */ PGSemaphore PGSemaphoreCreate(void) { PGSemaphore 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 newsem = PosixSemaphoreCreate(); /* Remember new sema for ReleaseSemaphores */ mySemPointers[numSems] = newsem; sema = (PGSemaphore) newsem; #else sema = &sharedSemas[numSems]; newsem = PG_SEM_REF(sema); PosixSemaphoreCreate(newsem); #endif numSems++; return sema; }
/* * PGSemaphoreCreate * * Initialize a PGSemaphore structure to represent a sema with count 1 */ void PGSemaphoreCreate(PGSemaphore 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; }