diff options
Diffstat (limited to 'src/backend/port/qnx')
-rw-r--r-- | src/backend/port/qnx/Makefile | 43 | ||||
-rw-r--r-- | src/backend/port/qnx/ipc.h | 30 | ||||
-rw-r--r-- | src/backend/port/qnx/isnan.c | 22 | ||||
-rw-r--r-- | src/backend/port/qnx/rint.c | 31 | ||||
-rw-r--r-- | src/backend/port/qnx/sem.c | 261 | ||||
-rw-r--r-- | src/backend/port/qnx/sem.h | 54 | ||||
-rw-r--r-- | src/backend/port/qnx/shm.c | 193 | ||||
-rw-r--r-- | src/backend/port/qnx/shm.h | 40 | ||||
-rw-r--r-- | src/backend/port/qnx/tstrint.c | 31 | ||||
-rw-r--r-- | src/backend/port/qnx/tstsem.c | 135 | ||||
-rw-r--r-- | src/backend/port/qnx/tstshm.c | 80 |
11 files changed, 920 insertions, 0 deletions
diff --git a/src/backend/port/qnx/Makefile b/src/backend/port/qnx/Makefile new file mode 100644 index 00000000000..1f8eed95879 --- /dev/null +++ b/src/backend/port/qnx/Makefile @@ -0,0 +1,43 @@ +#------------------------------------------------------------------------- +# +# Makefile-- +# Makefile for port/sparc +# +# IDENTIFICATION +# $Header: /cvsroot/pgsql/src/backend/port/qnx/Attic/Makefile,v 1.1 1999/12/16 01:25:06 momjian Exp $ +# +#------------------------------------------------------------------------- + +SRCDIR = ../../.. +include ../../../Makefile.global + +INCLUDE_OPT = -I../.. + +CFLAGS+=$(INCLUDE_OPT) + +OBJS = isnan.o rint.o sem.o shm.o + +all: SUBSYS.o tstrint tstsem tstshm + +SUBSYS.o: $(OBJS) + $(LD) $(LDREL) $(LDOUT) SUBSYS.o $(OBJS) + +tstrint: tstrint.o rint.o + $(CC) -o tstrint rint.o tstrint.o + +tstsem: tstsem.o sem.o + $(CC) -o tstsem sem.o tstsem.o + +tstshm: tstshm.o shm.o + $(CC) -o tstshm shm.o tstshm.o + +depend dep: + $(CC) -MM $(INCLUDE_OPT) *.c >depend + +clean: + rm -f SUBSYS.o $(OBJS) tstrint tstrint.o tstsem tstsem.o tstshm tstshm.o + +ifeq (depend,$(wildcard depend)) +include depend +endif + diff --git a/src/backend/port/qnx/ipc.h b/src/backend/port/qnx/ipc.h new file mode 100644 index 00000000000..6bce68a0edd --- /dev/null +++ b/src/backend/port/qnx/ipc.h @@ -0,0 +1,30 @@ +/*------------------------------------------------------------------------- + * + * ipc.h + * System V IPC Emulation + * + * Copyright (c) 1999, repas AEG Automation GmbH + * + * + * IDENTIFICATION + * $Header: /cvsroot/pgsql/src/backend/port/qnx/Attic/ipc.h,v 1.1 1999/12/16 01:25:06 momjian Exp $ + * + *------------------------------------------------------------------------- + */ + +#ifndef _SYS_IPC_H +#define _SYS_IPC_H + +/* Common IPC definitions. */ +/* Mode bits. */ +#define IPC_CREAT 0001000 /* create entry if key doesn't exist */ +#define IPC_EXCL 0002000 /* fail if key exists */ +#define IPC_NOWAIT 0004000 /* error if request must wait */ + +/* Keys. */ +#define IPC_PRIVATE (key_t)0 /* private key */ + +/* Control Commands. */ +#define IPC_RMID 0 /* remove identifier */ + +#endif /* _SYS_IPC_H */ diff --git a/src/backend/port/qnx/isnan.c b/src/backend/port/qnx/isnan.c new file mode 100644 index 00000000000..eb717d30483 --- /dev/null +++ b/src/backend/port/qnx/isnan.c @@ -0,0 +1,22 @@ +/*------------------------------------------------------------------------- + * + * isnan.c + * isnan() implementation + * + * Copyright (c) 1999, repas AEG Automation GmbH + * + * + * IDENTIFICATION + * $Header: /cvsroot/pgsql/src/backend/port/qnx/Attic/isnan.c,v 1.1 1999/12/16 01:25:06 momjian Exp $ + * + *------------------------------------------------------------------------- + */ + +#include "os.h" + +unsigned char __nan[8] = __nan_bytes; + +int isnan(double dsrc) +{ + return !memcmp( &dsrc, &NAN, sizeof( double ) ); +} diff --git a/src/backend/port/qnx/rint.c b/src/backend/port/qnx/rint.c new file mode 100644 index 00000000000..8d717425b2e --- /dev/null +++ b/src/backend/port/qnx/rint.c @@ -0,0 +1,31 @@ +/*------------------------------------------------------------------------- + * + * rint.c + * rint() implementation + * + * Copyright (c) 1999, repas AEG Automation GmbH + * + * + * IDENTIFICATION + * $Header: /cvsroot/pgsql/src/backend/port/qnx/Attic/rint.c,v 1.1 1999/12/16 01:25:06 momjian Exp $ + * + *------------------------------------------------------------------------- + */ + +#include <math.h> +#include "os.h" + +double rint(double x) +{ + double f, n = 0.; + + f = modf( x, &n ); + + if( x > 0. ) { + if( f > .5 ) n += 1.; + } + else if( x < 0. ) { + if( f < -.5 ) n -= 1.; + } + return n; +} diff --git a/src/backend/port/qnx/sem.c b/src/backend/port/qnx/sem.c new file mode 100644 index 00000000000..c93bc4cf528 --- /dev/null +++ b/src/backend/port/qnx/sem.c @@ -0,0 +1,261 @@ +/*------------------------------------------------------------------------- + * + * sem.c + * System V Semaphore Emulation + * + * Copyright (c) 1999, repas AEG Automation GmbH + * + * + * IDENTIFICATION + * $Header: /cvsroot/pgsql/src/backend/port/qnx/Attic/sem.c,v 1.1 1999/12/16 01:25:06 momjian Exp $ + * + *------------------------------------------------------------------------- + */ + +#include <errno.h> +#include <semaphore.h> +#include <string.h> +#include <sys/types.h> +#include <unistd.h> +#include <fcntl.h> +#include <sys/mman.h> +#include "postgres.h" +#include "storage/ipc.h" +#include <sys/sem.h> + + +#define SETMAX 32 +#define SEMMAX 16 + +#define MODE 0777 +#define SHM_INFO_NAME "SysV_Sem_Info" + + +struct sem_info { + sem_t sem; + struct { + key_t key; + int nsems; + sem_t sem[SEMMAX]; /* array of semaphores */ + pid_t pid[SEMMAX]; /* array of PIDs */ + } set[SETMAX]; +}; + +static struct sem_info *SemInfo = ( struct sem_info * )-1; + + +int semctl( int semid, int semnum, int cmd, /*...*/union semun arg ) +{ + int r; + + sem_wait( &SemInfo->sem ); + + if( semid < 0 || semid >= SETMAX || + semnum < 0 || semnum >= SemInfo->set[semid].nsems ) { + sem_post( &SemInfo->sem ); + errno = EINVAL; + return -1; + } + + switch( cmd ) { + case GETPID: + r = SemInfo->set[semid].pid[semnum]; + break; + + case GETVAL: + r = SemInfo->set[semid].sem[semnum].value; + break; + + case GETALL: + for( semnum = 0; semnum < SemInfo->set[semid].nsems; semnum++ ) { + arg.array[semnum] = SemInfo->set[semid].sem[semnum].value; + } + break; + + case SETVAL: + SemInfo->set[semid].sem[semnum].value = arg.val; + break; + + case SETALL: + for( semnum = 0; semnum < SemInfo->set[semid].nsems; semnum++ ) { + SemInfo->set[semid].sem[semnum].value = arg.array[semnum]; + } + break; + + case IPC_RMID: + for( semnum = 0; semnum < SemInfo->set[semid].nsems; semnum++ ) { + if( sem_destroy( &SemInfo->set[semid].sem[semnum] ) == -1 ) { + r = -1; + } + } + SemInfo->set[semid].key = -1; + SemInfo->set[semid].nsems = 0; + break; + + default: + sem_post( &SemInfo->sem ); + errno = EINVAL; + return -1; + } + + sem_post( &SemInfo->sem ); + + return r; +} + +int semget( key_t key, int nsems, int semflg ) +{ + int fd, semid, semnum/*, semnum1*/; + int exist = 0; + + if( nsems < 0 || nsems > SEMMAX ) { + errno = EINVAL; + return -1; + } + + /* open and map shared memory */ + if( SemInfo == ( struct sem_info * )-1 ) { + /* test if the shared memory already exists */ + fd = shm_open( SHM_INFO_NAME, O_RDWR | O_CREAT | O_EXCL, MODE ); + if( fd == -1 && errno == EEXIST ) { + exist = 1; + fd = shm_open( SHM_INFO_NAME, O_RDWR | O_CREAT, MODE ); + } + if( fd == -1 ) return fd; + /* The size may only be set once. Ignore errors. */ + ltrunc( fd, sizeof( struct sem_info ), SEEK_SET ); + SemInfo = mmap( NULL, sizeof( struct sem_info ), + PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0 ); + if( SemInfo == MAP_FAILED ) return -1; + if( !exist ) { + /* create semaphore for locking */ + sem_init( &SemInfo->sem, 1, 1 ); + sem_wait( &SemInfo->sem ); + /* initilize shared memory */ + memset( SemInfo->set, 0, sizeof( SemInfo->set ) ); + for( semid = 0; semid < SETMAX; semid++ ) { + SemInfo->set[semid].key = -1; + } + sem_post( &SemInfo->sem ); + } + } + + sem_wait( &SemInfo->sem ); + + if( key != IPC_PRIVATE ) { + /* search existing element */ + semid = 0; + while( semid < SETMAX && SemInfo->set[semid].key != key ) semid++; + if( !( semflg & IPC_CREAT ) && semid >= SETMAX ) { + sem_post( &SemInfo->sem ); + errno = ENOENT; + return -1; + } + else if( semid < SETMAX ) { + if( semflg & IPC_CREAT && semflg & IPC_EXCL ) { + sem_post( &SemInfo->sem ); + errno = EEXIST; + return -1; + } + else { + if( nsems != 0 && SemInfo->set[semid].nsems < nsems ) { + sem_post( &SemInfo->sem ); + errno = EINVAL; + return -1; + } + sem_post( &SemInfo->sem ); + return semid; + } + } + } + + /* search first free element */ + semid = 0; + while( semid < SETMAX && SemInfo->set[semid].key != -1 ) semid++; + if( semid >= SETMAX ) { + sem_post( &SemInfo->sem ); + errno = ENOSPC; + return -1; + } + + for( semnum = 0; semnum < nsems; semnum++ ) { + sem_init( &SemInfo->set[semid].sem[semnum], 1, 0 ); +/* Currently sem_init always returns -1. + if( sem_init( &SemInfo->set[semid].sem[semnum], 1, 0 ) == -1 ) { + for( semnum1 = 0; semnum1 < semnum; semnum1++ ) { + sem_destroy( &SemInfo->set[semid].sem[semnum1] ); + } + sem_post( &SemInfo->sem ); + return -1; + } +*/ + } + + SemInfo->set[semid].key = key; + SemInfo->set[semid].nsems = nsems; + + sem_post( &SemInfo->sem ); + + return 0; +} + +int semop( int semid, struct sembuf *sops, size_t nsops ) +{ + int i, j, r = 0, r1, errno1 = 0; + + sem_wait( &SemInfo->sem ); + + if( semid < 0 || semid >= SETMAX ) { + sem_post( &SemInfo->sem ); + errno = EINVAL; + return -1; + } + for( i = 0; i < nsops; i++ ) { + if( /*sops[i].sem_num < 0 ||*/ sops[i].sem_num >= SemInfo->set[semid].nsems ) { + sem_post( &SemInfo->sem ); + errno = EFBIG; + return -1; + } + } + + for( i = 0; i < nsops; i++ ) { + if( sops[i].sem_op < 0 ) { + if( sops[i].sem_flg & IPC_NOWAIT ) { + for( j = 0; j < -sops[i].sem_op; j++ ) { + if( sem_trywait( &SemInfo->set[semid].sem[sops[i].sem_num] ) ) { + errno1 = errno; + r = -1; + } + } + } + else { + for( j = 0; j < -sops[i].sem_op; j++ ) { + sem_post( &SemInfo->sem ); /* avoid deadlock */ + r1 = sem_wait( &SemInfo->set[semid].sem[sops[i].sem_num] ); + sem_wait( &SemInfo->sem ); + if( r1 ) { + errno1 = errno; + r = r1; + } + } + } + } + else if( sops[i].sem_op > 0 ) { + for( j = 0; j < sops[i].sem_op; j++ ) { + if( sem_post( &SemInfo->set[semid].sem[sops[i].sem_num] ) ) { + errno1 = errno; + r = -1; + } + } + } + else /* sops[i].sem_op == 0 */ { + /* not supported */ + } + SemInfo->set[semid].pid[sops[i].sem_num] = getpid( ); + } + + sem_post( &SemInfo->sem ); + + errno = errno1; + return r; +} diff --git a/src/backend/port/qnx/sem.h b/src/backend/port/qnx/sem.h new file mode 100644 index 00000000000..e9fd57ea351 --- /dev/null +++ b/src/backend/port/qnx/sem.h @@ -0,0 +1,54 @@ +/*------------------------------------------------------------------------- + * + * sem.h + * System V Semaphore Emulation + * + * Copyright (c) 1999, repas AEG Automation GmbH + * + * + * IDENTIFICATION + * $Header: /cvsroot/pgsql/src/backend/port/qnx/Attic/sem.h,v 1.1 1999/12/16 01:25:06 momjian Exp $ + * + *------------------------------------------------------------------------- + */ + +#ifndef _SYS_SEM_H +#define _SYS_SEM_H + +#include <sys/ipc.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* +* Semctl Command Definitions. + */ + +#define GETNCNT 3 /* get semncnt */ +#define GETPID 4 /* get sempid */ +#define GETVAL 5 /* get semval */ +#define GETALL 6 /* get all semval's */ +#define GETZCNT 7 /* get semzcnt */ +#define SETVAL 8 /* set semval */ +#define SETALL 9 /* set all semval's */ + +/* +* User semaphore template for semop system calls. + */ + +struct sembuf { + ushort_t sem_num; /* semaphore # */ + short sem_op; /* semaphore operation */ + short sem_flg; /* operation flags */ +}; + +extern int semctl( int semid, int semnum, int cmd, /*...*/union semun arg ); +extern int semget( key_t key, int nsems, int semflg ); +extern int semop( int semid, struct sembuf *sops, size_t nsops ); + +#ifdef __cplusplus +} +#endif + +#endif /* _SYS_SEM_H */ diff --git a/src/backend/port/qnx/shm.c b/src/backend/port/qnx/shm.c new file mode 100644 index 00000000000..293c901ac69 --- /dev/null +++ b/src/backend/port/qnx/shm.c @@ -0,0 +1,193 @@ +/*------------------------------------------------------------------------- + * + * shm.c + * System V Shared Memory Emulation + * + * Copyright (c) 1999, repas AEG Automation GmbH + * + * + * IDENTIFICATION + * $Header: /cvsroot/pgsql/src/backend/port/qnx/Attic/shm.c,v 1.1 1999/12/16 01:25:06 momjian Exp $ + * + *------------------------------------------------------------------------- + */ + +#include <errno.h> +#include <fcntl.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/mman.h> +#include <sys/shm.h> + + +#define MODE 0777 + +#define SHMMAX 1024 + + +struct shm_info { + int shmid; + key_t key; + size_t size; + void *addr; +}; + +static struct shm_info *ShmInfo; + + +static int shm_putinfo( struct shm_info *info ); +static int shm_updinfo( int i, struct shm_info *info ); +static int shm_getinfo( int shmid, struct shm_info *info ); +static int shm_getinfobyaddr( const void *addr, struct shm_info *info ); + + +static int shm_putinfo( struct shm_info *info ) +{ + int i; + + if( ShmInfo == NULL ) { + ShmInfo = calloc( SHMMAX, sizeof( struct shm_info ) ); + if( ShmInfo == NULL ) return -1; + /* initialize ShmInfo */ + for( i = 0; i < SHMMAX; i++ ) { + ShmInfo[i].shmid = -1; + } + } + + /* search first free element */ + i = 0; + while( i < SHMMAX && ShmInfo[i].shmid != -1 ) i++; + if( i >= SHMMAX ) { + errno = ENOSPC; + return -1; + } + + memcpy( &ShmInfo[i], info, sizeof( struct shm_info ) ); + + return i; +} + +static int shm_updinfo( int i, struct shm_info *info ) +{ + if( i >= SHMMAX ) return -1; + if( ShmInfo == NULL ) return -1; + + memcpy( &ShmInfo[i], info, sizeof( struct shm_info ) ); + + return i; +} + +static int shm_getinfo( int shmid, struct shm_info *info ) +{ + int i; + + if( ShmInfo == NULL ) return -1; + + /* search element */ + i = 0; + while( i < SHMMAX && ShmInfo[i].shmid != shmid ) i++; + if( i >= SHMMAX ) return -1; + + memcpy( info, &ShmInfo[i], sizeof( struct shm_info ) ); + + return i; +} + +static int shm_getinfobyaddr( const void *addr, struct shm_info *info ) +{ + int i; + + if( ShmInfo == ( struct shm_info * )-1 ) return -1; + + /* search element */ + i = 0; + while( i < SHMMAX && ShmInfo[i].addr != addr ) i++; + if( i >= SHMMAX ) return -1; + + memcpy( info, &ShmInfo[i], sizeof( struct shm_info ) ); + + return i; +} + + +void *shmat( int shmid, const void *shmaddr, int shmflg ) +{ + struct shm_info info; + int i; + + i = shm_getinfo( shmid, &info ); + if( i == -1 ) { + errno = EACCES; + return ( void * )-1; + } + + info.addr = mmap( ( void * )shmaddr, info.size, + PROT_READ | PROT_WRITE, MAP_SHARED, shmid, 0 ); + if( info.addr == MAP_FAILED ) return info.addr; + + if( shm_updinfo( i, &info ) == -1 ) { + errno = EACCES; + return ( void * )-1; + } + + return info.addr; +} + +int shmdt( const void *addr ) +{ + struct shm_info info; + + if( shm_getinfobyaddr( addr, &info ) == -1 ) { + errno = EACCES; + return -1; + } + + return munmap( ( void * )addr, info.size ); +} + +int shmctl( int shmid, int cmd, struct shmid_ds *buf ) +{ + struct shm_info info; + char name[NAME_MAX+1]; + + /* IPC_RMID supported only */ + if( cmd != IPC_RMID ) { + errno = EINVAL; + return -1; + } + + if( shm_getinfo( shmid, &info ) == -1 ) { + errno = EACCES; + return -1; + } + + return shm_unlink( itoa( info.key, name, 16 ) ); +} + +int shmget( key_t key, size_t size, int flags ) +{ + char name[NAME_MAX+1]; + int oflag = 0; + struct shm_info info; + + if( flags & IPC_CREAT ) oflag |= O_CREAT; + if( flags & IPC_EXCL ) oflag |= O_EXCL; + if( flags & SHM_R ) { + if( flags & SHM_W ) oflag |= O_RDWR; + else oflag |= O_RDONLY; + } + info.shmid = shm_open( itoa( key, name, 16 ), oflag, MODE ); + + /* store shared memory information */ + if( info.shmid != -1 ) { + info.key = key; + info.size = size; + info.addr = NULL; + if( shm_putinfo( &info ) == -1 ) return -1; + } + + /* The size may only be set once. Ignore errors. */ + ltrunc( info.shmid, size, SEEK_SET ); + + return info.shmid; +} diff --git a/src/backend/port/qnx/shm.h b/src/backend/port/qnx/shm.h new file mode 100644 index 00000000000..02c2eeb3df7 --- /dev/null +++ b/src/backend/port/qnx/shm.h @@ -0,0 +1,40 @@ +/*------------------------------------------------------------------------- + * + * shm.h + * System V Shared Memory Emulation + * + * Copyright (c) 1999, repas AEG Automation GmbH + * + * + * IDENTIFICATION + * $Header: /cvsroot/pgsql/src/backend/port/qnx/Attic/shm.h,v 1.1 1999/12/16 01:25:06 momjian Exp $ + * + *------------------------------------------------------------------------- + */ + +#ifndef _SYS_SHM_H +#define _SYS_SHM_H + +#include <sys/ipc.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#define SHM_R 0400 /* read permission */ +#define SHM_W 0200 /* write permission */ + +struct shmid_ds { + int dummy; +}; + +extern void *shmat( int shmid, const void *shmaddr, int shmflg ); +extern int shmdt( const void *addr ); +extern int shmctl( int shmid, int cmd, struct shmid_ds *buf ); +extern int shmget( key_t key, size_t size, int flags ); + +#ifdef __cplusplus +} +#endif + +#endif /* _SYS_SHM_H */ diff --git a/src/backend/port/qnx/tstrint.c b/src/backend/port/qnx/tstrint.c new file mode 100644 index 00000000000..82d04e1a735 --- /dev/null +++ b/src/backend/port/qnx/tstrint.c @@ -0,0 +1,31 @@ +/*------------------------------------------------------------------------- + * + * tstrint.c + * rint() test + * + * Copyright (c) 1999, repas AEG Automation GmbH + * + * + * IDENTIFICATION + * $Header: /cvsroot/pgsql/src/backend/port/qnx/Attic/tstrint.c,v 1.1 1999/12/16 01:25:06 momjian Exp $ + * + *------------------------------------------------------------------------- + */ + +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include "os.h" + + +int main( int argc, char **argv ) +{ + double x; + + if( argc != 2 ) exit( 1 ); + + x = strtod( argv[1], NULL ); + printf( "rint( %f ) = %f\n", x, rint( x ) ); + + return 0; +} diff --git a/src/backend/port/qnx/tstsem.c b/src/backend/port/qnx/tstsem.c new file mode 100644 index 00000000000..e0eccf7a44c --- /dev/null +++ b/src/backend/port/qnx/tstsem.c @@ -0,0 +1,135 @@ +/*------------------------------------------------------------------------- + * + * tstsem.c + * Test of System V Semaphore Emulation + * + * Copyright (c) 1999, repas AEG Automation GmbH + * + * + * IDENTIFICATION + * $Header: /cvsroot/pgsql/src/backend/port/qnx/Attic/tstsem.c,v 1.1 1999/12/16 01:25:06 momjian Exp $ + * + *------------------------------------------------------------------------- + */ + + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include "postgres.h" +#include "storage/ipc.h" +#include <sys/mman.h> +#include <sys/sem.h> + + +#define SEMMAX 1 +#define OPSMAX 1 + + +int main( int argc, char **argv ) +{ + int c, errflg = 0; + char s[80]; + key_t key = IPC_PRIVATE; + int nsems = SEMMAX; + int semflg = 0; + int unlink = 0; + int semid, i; + struct sembuf sops[OPSMAX]; + u_short array[SEMMAX]; + union semun arg; + + optarg = NULL; + while( !errflg && ( c = getopt( argc, argv, "k:n:cxu" ) ) != -1 ) { + switch( c ) { + case 'k': key = atoi( optarg ); break; + case 'n': nsems = atoi( optarg ); break; + case 'c': semflg |= IPC_CREAT; break; + case 'x': semflg |= IPC_EXCL; break; + case 'u': unlink = 1; break; + default: errflg++; + } + } + if( errflg ) { + printf( "usage: tstsem [-k key] [-n nsems] [-cxu]\n" ); + exit( 1 ); + } + + if( unlink ) { + i = shm_unlink( "SysV_Sem_Info" ); + if( i == -1 ) perror( "shm_unlink" ); + exit( i ); + } + + semid = semget( key, nsems, semflg ); + if( semid == -1 ) { + perror( "semget" ); + exit( semid ); + } + + do { + printf( "(-)sem_op, (+)sem_op, (G)ETVAL, (S)ETVAL, GET(P)ID, GET(A)LL, SETA(L)L, e(x)it: " ); + scanf( "%s", s ); + switch( s[0] ) { + case '-': + case '+': + sops[0].sem_num = 0; + sops[0].sem_op = atoi( s ); + if( sops[0].sem_op == 0 ) sops[0].sem_op = s[0] == '+' ? +1 : -1; + sops[0].sem_flg = 0; + if( semop( semid, sops, 1 ) == -1 ) perror( "semop" ); + break; + + case 'G': + case 'g': + i = semctl( semid, 0, GETVAL, arg ); + if( i == -1 ) perror( "semctl" ); + else printf( "semval = %d\n", i ); + break; + + case 'S': + case 's': + printf( "semval = " ); + scanf( "%d", &arg.val ); + if( semctl( semid, 0, SETVAL, arg ) == -1 ) perror( "semctl" ); + break; + + case 'P': + case 'p': + i = semctl( semid, 0, GETPID, arg ); + if( i == -1 ) perror( "semctl" ); + else printf( "PID = %d\n", i ); + break; + + case 'A': + case 'a': + arg.array = array; + i = semctl( semid, 0, GETALL, arg ); + if( i == -1 ) perror( "semctl" ); + else { + for( i = 0; i < nsems; i++ ) { + printf( "semval[%d] = %hu\n", i, arg.array[i] ); + } + } + break; + + case 'L': + case 'l': + arg.array = array; + for( i = 0; i < nsems; i++ ) { + printf( "semval[%d] = ", i ); + scanf( "%hu", &arg.array[i] ); + } + if( semctl( semid, 0, SETALL, arg ) == -1 )perror( "semctl" ); + break; + } + } + while( s[0] != 'x' ); + + if( semctl( semid, 0, IPC_RMID, arg ) == -1 ) { + perror( "semctl" ); + exit( -1 ); + } + + exit( 0 ); +} diff --git a/src/backend/port/qnx/tstshm.c b/src/backend/port/qnx/tstshm.c new file mode 100644 index 00000000000..4cd2110edde --- /dev/null +++ b/src/backend/port/qnx/tstshm.c @@ -0,0 +1,80 @@ +/*------------------------------------------------------------------------- + * + * tstshm.c + * Test of System V Shared Memory Emulation + * + * Copyright (c) 1999, repas AEG Automation GmbH + * + * + * IDENTIFICATION + * $Header: /cvsroot/pgsql/src/backend/port/qnx/Attic/tstshm.c,v 1.1 1999/12/16 01:25:06 momjian Exp $ + * + *------------------------------------------------------------------------- + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/shm.h> + + +int main( int argc, char **argv ) +{ + int c, errflg = 0; + char s[80]; + key_t key = 0x1000; + size_t size = 256; + int shmid = -1; + caddr_t addr = NULL; + + optarg = NULL; + while( !errflg && ( c = getopt( argc, argv, "k:s:" ) ) != -1 ) { + switch( c ) { + case 'k': key = atoi( optarg ); break; + case 's': size = atoi( optarg ); break; + default: errflg++; + } + } + if( errflg ) { + printf( "usage: tstshm [-k key] [-s size]\n" ); + exit( 1 ); + } + + do { + printf( "shm(g)et, shm(a)t, shm(d)t, shm(c)tl, (w)rite, (r)ead, e(x)it: " ); + scanf( "%s", s ); + switch( s[0] ) { + case 'g': + shmid = shmget( key, size, IPC_CREAT | SHM_R | SHM_W ); + if( shmid == -1 ) perror( "shmget" ); + break; + + case 'a': + addr = shmat( shmid, NULL, 0 ); + if( addr == ( void * )-1 ) perror( "shmat" ); + break; + + case 'd': + if( shmdt( addr ) == -1 ) perror( "shmdt" ); + else addr = NULL; + break; + + case 'c': + if( shmctl( shmid, IPC_RMID, NULL ) == -1 ) perror( "shmctl" ); + else shmid = -1; + break; + + case 'w': + printf( "String to write: " ); + scanf( "%s", addr ); + break; + + case 'r': + puts( addr ); + break; + } + } + while( s[0] != 'x' ); + + return 0; +} |