diff options
Diffstat (limited to 'src/backend/port/qnx4')
-rw-r--r-- | src/backend/port/qnx4/ipc.h | 16 | ||||
-rw-r--r-- | src/backend/port/qnx4/isnan.c | 7 | ||||
-rw-r--r-- | src/backend/port/qnx4/rint.c | 28 | ||||
-rw-r--r-- | src/backend/port/qnx4/sem.c | 557 | ||||
-rw-r--r-- | src/backend/port/qnx4/sem.h | 56 | ||||
-rw-r--r-- | src/backend/port/qnx4/shm.c | 289 | ||||
-rw-r--r-- | src/backend/port/qnx4/shm.h | 31 | ||||
-rw-r--r-- | src/backend/port/qnx4/tstrint.c | 16 | ||||
-rw-r--r-- | src/backend/port/qnx4/tstsem.c | 298 | ||||
-rw-r--r-- | src/backend/port/qnx4/tstshm.c | 120 |
10 files changed, 782 insertions, 636 deletions
diff --git a/src/backend/port/qnx4/ipc.h b/src/backend/port/qnx4/ipc.h index 00681a71886..0911cc35273 100644 --- a/src/backend/port/qnx4/ipc.h +++ b/src/backend/port/qnx4/ipc.h @@ -7,24 +7,24 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/port/qnx4/Attic/ipc.h,v 1.1 1999/12/16 16:52:52 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/port/qnx4/Attic/ipc.h,v 1.2 2000/04/12 17:15:30 momjian Exp $ * *------------------------------------------------------------------------- */ -#ifndef _SYS_IPC_H -#define _SYS_IPC_H +#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 */ +#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 */ +#define IPC_PRIVATE (key_t)0 /* private key */ /* Control Commands. */ -#define IPC_RMID 0 /* remove identifier */ +#define IPC_RMID 0 /* remove identifier */ -#endif /* _SYS_IPC_H */ +#endif /* _SYS_IPC_H */ diff --git a/src/backend/port/qnx4/isnan.c b/src/backend/port/qnx4/isnan.c index 2c001bb2c19..a0afb3d1849 100644 --- a/src/backend/port/qnx4/isnan.c +++ b/src/backend/port/qnx4/isnan.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/port/qnx4/Attic/isnan.c,v 1.1 1999/12/16 16:52:52 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/port/qnx4/Attic/isnan.c,v 1.2 2000/04/12 17:15:30 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -16,7 +16,8 @@ unsigned char __nan[8] = __nan_bytes; -int isnan(double dsrc) +int +isnan(double dsrc) { - return !memcmp( &dsrc, &NAN, sizeof( double ) ); + return !memcmp(&dsrc, &NAN, sizeof(double)); } diff --git a/src/backend/port/qnx4/rint.c b/src/backend/port/qnx4/rint.c index 2683ce849b7..4450d8c0567 100644 --- a/src/backend/port/qnx4/rint.c +++ b/src/backend/port/qnx4/rint.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/port/qnx4/Attic/rint.c,v 1.1 1999/12/16 16:52:52 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/port/qnx4/Attic/rint.c,v 1.2 2000/04/12 17:15:30 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -15,17 +15,23 @@ #include <math.h> #include "os.h" -double rint(double x) +double +rint(double x) { - double f, n = 0.; + double f, + n = 0.; - f = modf( x, &n ); + f = modf(x, &n); - if( x > 0. ) { - if( f > .5 ) n += 1.; - } - else if( x < 0. ) { - if( f < -.5 ) n -= 1.; - } - return 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/qnx4/sem.c b/src/backend/port/qnx4/sem.c index 426329469ff..bcd784e6c21 100644 --- a/src/backend/port/qnx4/sem.c +++ b/src/backend/port/qnx4/sem.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/port/qnx4/Attic/sem.c,v 1.2 2000/03/14 18:12:06 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/port/qnx4/Attic/sem.c,v 1.3 2000/04/12 17:15:30 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -29,282 +29,321 @@ #define SEMMAX (PROC_NSEMS_PER_SET) #define OPMAX 8 -#define MODE 0700 -#define SHM_INFO_NAME "SysV_Sem_Info" +#define MODE 0700 +#define SHM_INFO_NAME "SysV_Sem_Info" -struct pending_ops { - int op[OPMAX]; /* array of pending operations */ - int idx; /* index of first free array member */ +struct pending_ops +{ + int op[OPMAX]; /* array of pending operations */ + int idx; /* index of first free array member */ }; -struct sem_info { - sem_t sem; - struct { - key_t key; - int nsems; - sem_t sem[SEMMAX]; /* array of POSIX semaphores */ - struct sem semV[SEMMAX]; /* array of System V semaphore structures */ - struct pending_ops pendingOps[SEMMAX]; /* array of pending operations */ - } set[SETMAX]; +struct sem_info +{ + sem_t sem; + struct + { + key_t key; + int nsems; + sem_t sem[SEMMAX];/* array of POSIX semaphores */ + struct sem semV[SEMMAX]; /* array of System V semaphore + * structures */ + struct pending_ops pendingOps[SEMMAX]; /* array of pending + * operations */ + } set[SETMAX]; }; -static struct sem_info *SemInfo = ( struct sem_info * )-1; +static struct sem_info *SemInfo = (struct sem_info *) - 1; -int semctl( int semid, int semnum, int cmd, /*...*/union semun arg ) +int +semctl(int semid, int semnum, int cmd, /* ... */ union semun arg) { - int r = 0; - - 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 GETNCNT: - r = SemInfo->set[semid].semV[semnum].semncnt; - break; - - case GETPID: - r = SemInfo->set[semid].semV[semnum].sempid; - break; - - case GETVAL: - r = SemInfo->set[semid].semV[semnum].semval; - break; - - case GETALL: - for( semnum = 0; semnum < SemInfo->set[semid].nsems; semnum++ ) { - arg.array[semnum] = SemInfo->set[semid].semV[semnum].semval; - } - break; - - case SETVAL: - SemInfo->set[semid].semV[semnum].semval = arg.val; - break; - - case SETALL: - for( semnum = 0; semnum < SemInfo->set[semid].nsems; semnum++ ) { - SemInfo->set[semid].semV[semnum].semval = arg.array[semnum]; - } - break; - - case GETZCNT: - r = SemInfo->set[semid].semV[semnum].semzcnt; - 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 r = 0; + + 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 GETNCNT: + r = SemInfo->set[semid].semV[semnum].semncnt; + break; + + case GETPID: + r = SemInfo->set[semid].semV[semnum].sempid; + break; + + case GETVAL: + r = SemInfo->set[semid].semV[semnum].semval; + break; + + case GETALL: + for (semnum = 0; semnum < SemInfo->set[semid].nsems; semnum++) + arg.array[semnum] = SemInfo->set[semid].semV[semnum].semval; + break; + + case SETVAL: + SemInfo->set[semid].semV[semnum].semval = arg.val; + break; + + case SETALL: + for (semnum = 0; semnum < SemInfo->set[semid].nsems; semnum++) + SemInfo->set[semid].semV[semnum].semval = arg.array[semnum]; + break; + + case GETZCNT: + r = SemInfo->set[semid].semV[semnum].semzcnt; + 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 +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 ); + 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; - } + 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; + SemInfo->set[semid].key = key; + SemInfo->set[semid].nsems = nsems; - sem_post( &SemInfo->sem ); + sem_post(&SemInfo->sem); - return semid; + return semid; } -int semop( int semid, struct sembuf *sops, size_t nsops ) +int +semop(int semid, struct sembuf * sops, size_t nsops) { - int i, r = 0, r1, errno1 = 0, op; - - 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( SemInfo->set[semid].semV[sops[i].sem_num].semval < -sops[i].sem_op ) { - if( sops[i].sem_flg & IPC_NOWAIT ) { - sem_post( &SemInfo->sem ); - errno = EAGAIN; - return -1; - } - SemInfo->set[semid].semV[sops[i].sem_num].semncnt++; - if( SemInfo->set[semid].pendingOps[sops[i].sem_num].idx >= OPMAX ) { - /* pending operations array overflow */ - sem_post( &SemInfo->sem ); - errno = ERANGE; - return -1; - } - SemInfo->set[semid].pendingOps[sops[i].sem_num].op[SemInfo->set[semid].pendingOps[sops[i].sem_num].idx++] = sops[i].sem_op; - /* suspend */ - 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; - /* remove pending operation */ - SemInfo->set[semid].pendingOps[sops[i].sem_num].op[--SemInfo->set[semid].pendingOps[sops[i].sem_num].idx] = 0; - } - else { - SemInfo->set[semid].semV[sops[i].sem_num].semval -= -sops[i].sem_op; - } - SemInfo->set[semid].semV[sops[i].sem_num].semncnt--; - } - else { - SemInfo->set[semid].semV[sops[i].sem_num].semval -= -sops[i].sem_op; - } - } - else if( sops[i].sem_op > 0 ) { - SemInfo->set[semid].semV[sops[i].sem_num].semval += sops[i].sem_op; - op = sops[i].sem_op; - while( op > 0 && SemInfo->set[semid].pendingOps[sops[i].sem_num].idx > 0 ) { /* operations pending */ - if( SemInfo->set[semid].pendingOps[sops[i].sem_num].op[SemInfo->set[semid].pendingOps[sops[i].sem_num].idx-1] + op >= 0 ) { - /* unsuspend processes */ - if( sem_post( &SemInfo->set[semid].sem[sops[i].sem_num] ) ) { - errno1 = errno; - r = -1; - } - /* adjust pending operations */ - op += SemInfo->set[semid].pendingOps[sops[i].sem_num].op[--SemInfo->set[semid].pendingOps[sops[i].sem_num].idx]; - SemInfo->set[semid].pendingOps[sops[i].sem_num].op[SemInfo->set[semid].pendingOps[sops[i].sem_num].idx] = 0; - } - else { - /* adjust pending operations */ - SemInfo->set[semid].pendingOps[sops[i].sem_num].op[SemInfo->set[semid].pendingOps[sops[i].sem_num].idx-1] += op; - op = 0; - } - } - } - else /* sops[i].sem_op == 0 */ { - /* not supported */ - sem_post( &SemInfo->sem ); - errno = ENOSYS; - return -1; - } - SemInfo->set[semid].semV[sops[i].sem_num].sempid = getpid( ); - } - - sem_post( &SemInfo->sem ); - - errno = errno1; - return r; + int i, + r = 0, + r1, + errno1 = 0, + op; + + 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 (SemInfo->set[semid].semV[sops[i].sem_num].semval < -sops[i].sem_op) + { + if (sops[i].sem_flg & IPC_NOWAIT) + { + sem_post(&SemInfo->sem); + errno = EAGAIN; + return -1; + } + SemInfo->set[semid].semV[sops[i].sem_num].semncnt++; + if (SemInfo->set[semid].pendingOps[sops[i].sem_num].idx >= OPMAX) + { + /* pending operations array overflow */ + sem_post(&SemInfo->sem); + errno = ERANGE; + return -1; + } + SemInfo->set[semid].pendingOps[sops[i].sem_num].op[SemInfo->set[semid].pendingOps[sops[i].sem_num].idx++] = sops[i].sem_op; + /* suspend */ + 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; + /* remove pending operation */ + SemInfo->set[semid].pendingOps[sops[i].sem_num].op[--SemInfo->set[semid].pendingOps[sops[i].sem_num].idx] = 0; + } + else + SemInfo->set[semid].semV[sops[i].sem_num].semval -= -sops[i].sem_op; + SemInfo->set[semid].semV[sops[i].sem_num].semncnt--; + } + else + SemInfo->set[semid].semV[sops[i].sem_num].semval -= -sops[i].sem_op; + } + else if (sops[i].sem_op > 0) + { + SemInfo->set[semid].semV[sops[i].sem_num].semval += sops[i].sem_op; + op = sops[i].sem_op; + while (op > 0 && SemInfo->set[semid].pendingOps[sops[i].sem_num].idx > 0) + { /* operations pending */ + if (SemInfo->set[semid].pendingOps[sops[i].sem_num].op[SemInfo->set[semid].pendingOps[sops[i].sem_num].idx - 1] + op >= 0) + { + /* unsuspend processes */ + if (sem_post(&SemInfo->set[semid].sem[sops[i].sem_num])) + { + errno1 = errno; + r = -1; + } + /* adjust pending operations */ + op += SemInfo->set[semid].pendingOps[sops[i].sem_num].op[--SemInfo->set[semid].pendingOps[sops[i].sem_num].idx]; + SemInfo->set[semid].pendingOps[sops[i].sem_num].op[SemInfo->set[semid].pendingOps[sops[i].sem_num].idx] = 0; + } + else + { + /* adjust pending operations */ + SemInfo->set[semid].pendingOps[sops[i].sem_num].op[SemInfo->set[semid].pendingOps[sops[i].sem_num].idx - 1] += op; + op = 0; + } + } + } + else + /* sops[i].sem_op == 0 */ + { + /* not supported */ + sem_post(&SemInfo->sem); + errno = ENOSYS; + return -1; + } + SemInfo->set[semid].semV[sops[i].sem_num].sempid = getpid(); + } + + sem_post(&SemInfo->sem); + + errno = errno1; + return r; } diff --git a/src/backend/port/qnx4/sem.h b/src/backend/port/qnx4/sem.h index a42d7fdf86e..c9fd18a05a6 100644 --- a/src/backend/port/qnx4/sem.h +++ b/src/backend/port/qnx4/sem.h @@ -7,59 +7,63 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/port/qnx4/Attic/sem.h,v 1.2 2000/03/14 18:12:06 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/port/qnx4/Attic/sem.h,v 1.3 2000/04/12 17:15:30 momjian Exp $ * *------------------------------------------------------------------------- */ -#ifndef _SYS_SEM_H -#define _SYS_SEM_H +#ifndef _SYS_SEM_H +#define _SYS_SEM_H #include <sys/ipc.h> #ifdef __cplusplus -extern "C" { +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 */ +#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 */ /* * There is one semaphore structure for each semaphore in the system. */ -struct sem { - ushort_t semval; /* semaphore text map address */ - pid_t sempid; /* pid of last operation */ - ushort_t semncnt; /* # awaiting semval > cval */ - ushort_t semzcnt; /* # awaiting semval = 0 */ -}; + struct sem + { + ushort_t semval; /* semaphore text map address */ + pid_t sempid; /* pid of last operation */ + ushort_t semncnt; /* # awaiting semval > cval */ + ushort_t semzcnt; /* # awaiting semval = 0 */ + }; /* * User semaphore template for semop system calls. */ -struct sembuf { - ushort_t sem_num; /* semaphore # */ - short sem_op; /* semaphore operation */ - short sem_flg; /* operation flags */ -}; + 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 ); + 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 */ +#endif /* _SYS_SEM_H */ diff --git a/src/backend/port/qnx4/shm.c b/src/backend/port/qnx4/shm.c index 5df3ebc8c28..4cf0486544b 100644 --- a/src/backend/port/qnx4/shm.c +++ b/src/backend/port/qnx4/shm.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/port/qnx4/Attic/shm.c,v 1.1 1999/12/16 16:52:52 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/port/qnx4/Attic/shm.c,v 1.2 2000/04/12 17:15:30 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -25,169 +25,202 @@ #define SHMMAX 1024 -struct shm_info { - int shmid; - key_t key; - size_t size; - void *addr; +struct shm_info +{ + int shmid; + key_t key; + size_t size; + void *addr; }; -static struct shm_info *ShmInfo; +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); +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 ) +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; + 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 ) +static int +shm_updinfo(int i, struct shm_info * info) { - if( i >= SHMMAX ) return -1; - if( ShmInfo == NULL ) return -1; + if (i >= SHMMAX) + return -1; + if (ShmInfo == NULL) + return -1; + + memcpy(&ShmInfo[i], info, sizeof(struct shm_info)); - memcpy( &ShmInfo[i], info, sizeof( struct shm_info ) ); - - return i; + return i; } -static int shm_getinfo( int shmid, struct shm_info *info ) +static int +shm_getinfo(int shmid, struct shm_info * info) { - int i; + int i; + + if (ShmInfo == NULL) + return -1; - if( ShmInfo == NULL ) return -1; + /* search element */ + i = 0; + while (i < SHMMAX && ShmInfo[i].shmid != shmid) + i++; + if (i >= SHMMAX) + 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)); - memcpy( info, &ShmInfo[i], sizeof( struct shm_info ) ); - - return i; + return i; } -static int shm_getinfobyaddr( const void *addr, struct shm_info *info ) +static int +shm_getinfobyaddr(const void *addr, struct shm_info * info) { - int i; + int i; - if( ShmInfo == ( struct shm_info * )-1 ) return -1; + 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; + /* 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; + memcpy(info, &ShmInfo[i], sizeof(struct shm_info)); + + return i; } -void *shmat( int shmid, const void *shmaddr, int shmflg ) +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; + 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 ) +int +shmdt(const void *addr) { - struct shm_info info; + struct shm_info info; - if( shm_getinfobyaddr( addr, &info ) == -1 ) { - errno = EACCES; - return -1; - } + if (shm_getinfobyaddr(addr, &info) == -1) + { + errno = EACCES; + return -1; + } - return munmap( ( void * )addr, info.size ); + return munmap((void *) addr, info.size); } -int shmctl( int shmid, int cmd, struct shmid_ds *buf ) +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 ) ); + 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 ) +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; + 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/qnx4/shm.h b/src/backend/port/qnx4/shm.h index e66cd6327d0..6fafb223785 100644 --- a/src/backend/port/qnx4/shm.h +++ b/src/backend/port/qnx4/shm.h @@ -7,34 +7,37 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/port/qnx4/Attic/shm.h,v 1.1 1999/12/16 16:52:52 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/port/qnx4/Attic/shm.h,v 1.2 2000/04/12 17:15:30 momjian Exp $ * *------------------------------------------------------------------------- */ -#ifndef _SYS_SHM_H -#define _SYS_SHM_H +#ifndef _SYS_SHM_H +#define _SYS_SHM_H #include <sys/ipc.h> #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif -#define SHM_R 0400 /* read permission */ -#define SHM_W 0200 /* write permission */ +#define SHM_R 0400 /* read permission */ +#define SHM_W 0200 /* write permission */ -struct shmid_ds { - int dummy; -}; + 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 ); + 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 */ +#endif /* _SYS_SHM_H */ diff --git a/src/backend/port/qnx4/tstrint.c b/src/backend/port/qnx4/tstrint.c index f91ca7c1379..222051692a8 100644 --- a/src/backend/port/qnx4/tstrint.c +++ b/src/backend/port/qnx4/tstrint.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/port/qnx4/Attic/tstrint.c,v 1.1 1999/12/16 16:52:52 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/port/qnx4/Attic/tstrint.c,v 1.2 2000/04/12 17:15:30 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -18,14 +18,16 @@ #include "os.h" -int main( int argc, char **argv ) +int +main(int argc, char **argv) { - double x; + double x; - if( argc != 2 ) exit( 1 ); + if (argc != 2) + exit(1); - x = strtod( argv[1], NULL ); - printf( "rint( %f ) = %f\n", x, rint( x ) ); + x = strtod(argv[1], NULL); + printf("rint( %f ) = %f\n", x, rint(x)); - return 0; + return 0; } diff --git a/src/backend/port/qnx4/tstsem.c b/src/backend/port/qnx4/tstsem.c index a604d950178..dc697ceaed5 100644 --- a/src/backend/port/qnx4/tstsem.c +++ b/src/backend/port/qnx4/tstsem.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/port/qnx4/Attic/tstsem.c,v 1.2 2000/03/14 18:12:06 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/port/qnx4/Attic/tstsem.c,v 1.3 2000/04/12 17:15:30 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -26,137 +26,177 @@ #define SEMMAX 16 #define OPSMAX 1 -static int semid; +static int semid; -static void sig_handler( int sig_no ) +static void +sig_handler(int sig_no) { - union semun arg; - int i = semctl( semid, 0, GETNCNT, arg ); - if( i == -1 ) perror( "semctl" ); - else printf( "semval = %d\n", i ); + union semun arg; + int i = semctl(semid, 0, GETNCNT, arg); + + if (i == -1) + perror("semctl"); + else + printf("semval = %d\n", i); } -int main( int argc, char **argv ) +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 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 ); - } - - /* test signal interrupts */ - signal( SIGTERM, sig_handler ); - - do { - printf( "(-)sem_op, (+)sem_op, (G)ETVAL, (S)ETVAL, GET(P)ID, GET(A)LL, SETA(L)L, GET(N)CNT, GET(Z)CNT, 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; - - case 'N': - case 'n': - i = semctl( semid, 0, GETNCNT, arg ); - if( i == -1 ) perror( "semctl" ); - else printf( "semval = %d\n", i ); - break; - - case 'Z': - case 'z': - i = semctl( semid, 0, GETZCNT, arg ); - if( i == -1 ) perror( "semctl" ); - else printf( "semval = %d\n", i ); - break; - } - } - while( s[0] != 'x' ); - - if( semctl( semid, 0, IPC_RMID, arg ) == -1 ) { - perror( "semctl" ); - exit( -1 ); - } - - exit( 0 ); + int c, + errflg = 0; + char s[80]; + key_t key = IPC_PRIVATE; + int nsems = SEMMAX; + int semflg = 0; + int unlink = 0; + int 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); + } + + /* test signal interrupts */ + signal(SIGTERM, sig_handler); + + do + { + printf("(-)sem_op, (+)sem_op, (G)ETVAL, (S)ETVAL, GET(P)ID, GET(A)LL, SETA(L)L, GET(N)CNT, GET(Z)CNT, 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; + + case 'N': + case 'n': + i = semctl(semid, 0, GETNCNT, arg); + if (i == -1) + perror("semctl"); + else + printf("semval = %d\n", i); + break; + + case 'Z': + case 'z': + i = semctl(semid, 0, GETZCNT, arg); + if (i == -1) + perror("semctl"); + else + printf("semval = %d\n", i); + 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/qnx4/tstshm.c b/src/backend/port/qnx4/tstshm.c index e7421f5f87b..d6e577f2924 100644 --- a/src/backend/port/qnx4/tstshm.c +++ b/src/backend/port/qnx4/tstshm.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/port/qnx4/Attic/tstshm.c,v 1.1 1999/12/16 16:52:52 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/port/qnx4/Attic/tstshm.c,v 1.2 2000/04/12 17:15:30 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -18,63 +18,81 @@ #include <sys/shm.h> -int main( int argc, char **argv ) +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; + 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 ); - } + 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; + 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 '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 '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 '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 'w': + printf("String to write: "); + scanf("%s", addr); + break; - case 'r': - puts( addr ); - break; - } - } - while( s[0] != 'x' ); + case 'r': + puts(addr); + break; + } + } + while (s[0] != 'x'); - return 0; + return 0; } |