From 366682fb668d20d0874961e6421edbc96e3d1ac1 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sat, 29 Apr 2006 20:52:56 +0000 Subject: [PATCH] Remove sema.c, superseded by win32_sema.c. --- src/backend/port/win32/Makefile | 6 +- src/backend/port/win32/sema.c | 270 -------------------------------- 2 files changed, 3 insertions(+), 273 deletions(-) delete mode 100644 src/backend/port/win32/sema.c diff --git a/src/backend/port/win32/Makefile b/src/backend/port/win32/Makefile index bb12ae375c..67d6df8f0e 100644 --- a/src/backend/port/win32/Makefile +++ b/src/backend/port/win32/Makefile @@ -1,10 +1,10 @@ #------------------------------------------------------------------------- # # Makefile-- -# Makefile for port/win32 +# Makefile for backend/port/win32 # # IDENTIFICATION -# $PostgreSQL: pgsql/src/backend/port/win32/Makefile,v 1.6 2004/08/29 00:38:03 momjian Exp $ +# $PostgreSQL: pgsql/src/backend/port/win32/Makefile,v 1.7 2006/04/29 20:52:56 tgl Exp $ # #------------------------------------------------------------------------- @@ -12,7 +12,7 @@ subdir = src/backend/port/win32 top_builddir = ../../../.. include $(top_builddir)/src/Makefile.global -OBJS = sema.o shmem.o timer.o socket.o signal.o security.o error.o +OBJS = shmem.o timer.o socket.o signal.o security.o error.o all: SUBSYS.o diff --git a/src/backend/port/win32/sema.c b/src/backend/port/win32/sema.c deleted file mode 100644 index 03e0cfd995..0000000000 --- a/src/backend/port/win32/sema.c +++ /dev/null @@ -1,270 +0,0 @@ -/*------------------------------------------------------------------------- - * - * sema.c - * Microsoft Windows Win32 Semaphores Emulation - * - * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group - * - * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/port/win32/sema.c,v 1.13 2006/04/09 19:21:34 tgl Exp $ - * - *------------------------------------------------------------------------- - */ - -#include "postgres.h" -#include "storage/shmem.h" - -#include - -typedef struct -{ - int m_numSems; - off_t m_semaphoreHandles; - /* offset from beginning of header */ - off_t m_semaphoreCounts; - /* offset from beginning of header */ -} win32_sem_set_hdr; - -/* Control of a semaphore pool. The pool is an area in which we stored all -** the semIds of the pool. The first long is the number of semaphore -** allocated in the pool followed by semaphore handles -*/ - -int -semctl(int semId, int semNum, int flag, union semun semun) -{ - win32_sem_set_hdr *the_set = (win32_sem_set_hdr *) MAKE_PTR(semId); - - /* semNum might be 0 */ - /* semun.array contains the sem initial values */ - int *sem_counts = (int *) ((off_t) the_set + the_set->m_semaphoreCounts); - - /* Fix the count of all sem of the pool to semun.array */ - if (flag == SETALL) - { - int i; - struct sembuf sops; - - sops.sem_flg = IPC_NOWAIT; - - for (i = 0; i < the_set->m_numSems; ++i) - { - if (semun.array[i] == sem_counts[i]) - continue; /* Nothing to do */ - - if (semun.array[i] < sem_counts[i]) - sops.sem_op = -1; - else - sops.sem_op = 1; - - sops.sem_num = i; - - /* Quickly lock/unlock the semaphore (if we can) */ - if (semop(semId, &sops, 1) < 0) - return -1; - } - return 1; - } - - /* Fix the count of one semaphore to semun.val */ - else if (flag == SETVAL) - { - if (semun.val != sem_counts[semNum]) - { - struct sembuf sops; - - sops.sem_flg = IPC_NOWAIT; - sops.sem_num = semNum; - - if (semun.val < sem_counts[semNum]) - sops.sem_op = -1; - else - sops.sem_op = 1; - - /* Quickly lock/unlock the semaphore (if we can) */ - if (semop(semId, &sops, 1) < 0) - return -1; - } - - return 1; - } - - /* Delete the pool */ - else if (flag == IPC_RMID) - { - int i; - HANDLE *sem_handles = (HANDLE *) ((off_t) the_set + the_set->m_semaphoreHandles); - - /* Loop over all semaphore to delete them */ - for (i = 0; i < the_set->m_numSems; ++i) - CloseHandle(sem_handles[i]); - - return 1; - } - - /* Get the current semaphore count */ - else if (flag == GETNCNT) - return the_set->m_numSems; - - /* Get the current semaphore count of the first semaphore in the pool */ - else if (flag == GETVAL) - return sem_counts[semNum]; - - /* Other commands not yet supported */ - else - { - errno = EINVAL; - return -1; - } -} - -/* Find a pool id based on IPC key */ -int -semget(int semKey, int semNum, int flags) -{ - char semname[32]; - char cur_num[20]; - DWORD last_error; - char *num_part; - bool ans = true; - SECURITY_ATTRIBUTES sec_attrs; - HANDLE cur_handle; - bool found = false; - Size sem_set_size = sizeof(win32_sem_set_hdr) + semNum * (sizeof(HANDLE) + sizeof(int)); - HANDLE *sem_handles = NULL; - int *sem_counts = NULL; - int i; - win32_sem_set_hdr *new_set; - - sec_attrs.nLength = sizeof(sec_attrs); - sec_attrs.lpSecurityDescriptor = NULL; - sec_attrs.bInheritHandle = TRUE; - - sprintf(semname, "PG_SEMSET.%d.", semKey); - num_part = semname + strlen(semname); - - strcpy(num_part, _itoa(_getpid() * -1, cur_num, 10)); /* For shared memory, - * include the pid */ - new_set = (win32_sem_set_hdr *) ShmemInitStruct(semname, sem_set_size, &found); - - if (found) - { - /* This should *never* happen */ - errno = EEXIST; - return -1; - } - - new_set->m_numSems = semNum; - new_set->m_semaphoreHandles = sizeof(win32_sem_set_hdr); - /* array starts after header */ - new_set->m_semaphoreCounts = new_set->m_semaphoreHandles + (sizeof(HANDLE) * semNum); - - sem_handles = (HANDLE *) ((off_t) new_set + new_set->m_semaphoreHandles); - sem_counts = (int *) ((off_t) new_set + new_set->m_semaphoreCounts); - - for (i = 0; i < semNum && ans; ++i) - { - strcpy(num_part, _itoa(i, cur_num, 10)); - - if (flags & IPC_CREAT) - cur_handle = CreateSemaphore(&sec_attrs, 0, 1, semname); - else - cur_handle = OpenSemaphore(SEMAPHORE_ALL_ACCESS, TRUE, semname); - - sem_handles[i] = cur_handle; - - last_error = GetLastError(); - if (!cur_handle) - { - errno = EACCES; - ans = false; - } - else if (last_error == ERROR_ALREADY_EXISTS && (flags & (IPC_CREAT | IPC_EXCL))) - { - errno = EEXIST; - ans = false; - } - } - - if (ans) - return MAKE_OFFSET(new_set); - else - { - int i; - - /* Blow away what we've got right now... */ - for (i = 0; i < semNum; ++i) - { - if (sem_handles[i]) - CloseHandle(sem_handles[i]); - else - break; - } - - return -1; - } -} - -/* Acquire or release in the semaphore pool */ -int -semop(int semId, struct sembuf * sops, int nsops) -{ - win32_sem_set_hdr *the_set = (win32_sem_set_hdr *) MAKE_PTR(semId); - HANDLE *sem_handles = (HANDLE *) ((off_t) the_set + the_set->m_semaphoreHandles); - int *sem_counts = (int *) ((off_t) the_set + the_set->m_semaphoreCounts); - HANDLE cur_handle; - - if (nsops != 1) - { - /* - * Not supported (we return on 1st success, and don't cancel earlier - * ops) - */ - errno = E2BIG; - return -1; - } - - cur_handle = sem_handles[sops[0].sem_num]; - - if (sops[0].sem_op == -1) - { - DWORD ret; - HANDLE wh[2]; - - wh[0] = cur_handle; - wh[1] = pgwin32_signal_event; - - ret = WaitForMultipleObjectsEx(2, wh, FALSE, (sops[0].sem_flg & IPC_NOWAIT) ? 0 : INFINITE, TRUE); - - if (ret == WAIT_OBJECT_0) - { - /* We got it! */ - sem_counts[sops[0].sem_num]--; - return 0; - } - else if (ret == WAIT_OBJECT_0 + 1 || ret == WAIT_IO_COMPLETION) - { - /* Signal event is set - we have a signal to deliver */ - pgwin32_dispatch_queued_signals(); - errno = EINTR; - } - else if (ret == WAIT_TIMEOUT) - /* Couldn't get it */ - errno = EAGAIN; - else - errno = EIDRM; - } - else if (sops[0].sem_op > 0) - { - /* Don't want the lock anymore */ - sem_counts[sops[0].sem_num]++; - ReleaseSemaphore(cur_handle, sops[0].sem_op, NULL); - return 0; - } - else - /* Not supported */ - errno = ERANGE; - - /* If we get down here, then something is wrong */ - return -1; -} -- 2.40.0