Added a shared memory test.

- libposix error printing now configurable via macro definition
- shmget/at/dt tested.
This commit is contained in:
Bahadir Balban
2009-05-12 18:16:25 +03:00
parent 324481a334
commit 33fcceb2b6
24 changed files with 126 additions and 76 deletions

View File

@@ -4,6 +4,7 @@
* Copyright (C) 2008 Bahadir Balban
*/
#include <shpage.h>
#include <libposix.h>
#include <errno.h>
#include <stdio.h>
#include <stdarg.h>
@@ -27,12 +28,12 @@ static inline int l4_chdir(const char *pathname)
/* Call pager with shmget() request. Check ipc error. */
if ((fd = l4_sendrecv(VFS_TID, VFS_TID, L4_IPC_TAG_CHDIR)) < 0) {
printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, fd);
print_err("%s: L4 IPC Error: %d.\n", __FUNCTION__, fd);
return fd;
}
/* Check if syscall itself was successful */
if ((fd = l4_get_retval()) < 0) {
printf("%s: MKDIR Error: %d.\n", __FUNCTION__, fd);
print_err("%s: MKDIR Error: %d.\n", __FUNCTION__, fd);
return fd;
}
return fd;

View File

@@ -12,6 +12,7 @@
#include <l4lib/utcb.h>
#include <l4/macros.h>
#include INC_GLUE(memory.h)
#include <libposix.h>
static inline int l4_close(int fd)
{
@@ -19,12 +20,12 @@ static inline int l4_close(int fd)
/* Call pager with close() request. Check ipc error. */
if ((fd = l4_sendrecv(PAGER_TID, PAGER_TID, L4_IPC_TAG_CLOSE)) < 0) {
printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, fd);
print_err("%s: L4 IPC Error: %d.\n", __FUNCTION__, fd);
return fd;
}
/* Check if syscall itself was successful */
if ((fd = l4_get_retval()) < 0) {
printf("%s: CLOSE Error: %d.\n", __FUNCTION__, fd);
print_err("%s: CLOSE Error: %d.\n", __FUNCTION__, fd);
return fd;
}
return fd;
@@ -50,12 +51,12 @@ static inline int l4_fsync(int fd)
/* Call pager with close() request. Check ipc error. */
if ((fd = l4_sendrecv(PAGER_TID, PAGER_TID, L4_IPC_TAG_FSYNC)) < 0) {
printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, fd);
print_err("%s: L4 IPC Error: %d.\n", __FUNCTION__, fd);
return fd;
}
/* Check if syscall itself was successful */
if ((fd = l4_get_retval()) < 0) {
printf("%s: CLOSE Error: %d.\n", __FUNCTION__, fd);
print_err("%s: CLOSE Error: %d.\n", __FUNCTION__, fd);
return fd;
}
return fd;

View File

@@ -5,6 +5,7 @@
*/
#include <string.h>
#include <stdlib.h>
#include <libposix.h>
char **__environ;

View File

@@ -1,11 +1,12 @@
#include <errno.h>
#include <stdio.h>
#include <libposix.h>
int errno_variable;
void perror(const char *str)
{
printf("%s: %d\n", str, errno);
print_err("%s: %d\n", str, errno);
}
int *__errno_location(void)

View File

@@ -17,6 +17,7 @@
#include <fcntl.h>
#include <l4/macros.h>
#include INC_GLUE(memory.h)
#include <libposix.h>
struct sys_execve_args {
@@ -36,12 +37,12 @@ static inline int l4_execve(const char *pathname, char *const argv[], char *cons
/* Call pager with open() request. Check ipc error. */
if ((err = l4_sendrecv(PAGER_TID, PAGER_TID, L4_IPC_TAG_EXECVE)) < 0) {
printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, err);
print_err("%s: L4 IPC Error: %d.\n", __FUNCTION__, err);
return err;
}
/* Check if syscall itself was successful */
if ((err = l4_get_retval()) < 0) {
printf("%s: OPEN Error: %d.\n", __FUNCTION__, err);
print_err("%s: OPEN Error: %d.\n", __FUNCTION__, err);
return err;
}

View File

@@ -4,6 +4,7 @@
#include <l4lib/ipcdefs.h>
#include <unistd.h>
#include <l4/macros.h>
#include <libposix.h>
static inline void __attribute__ ((noreturn)) l4_exit(int status)
{
@@ -15,7 +16,7 @@ static inline void __attribute__ ((noreturn)) l4_exit(int status)
ret = l4_sendrecv(PAGER_TID, PAGER_TID, L4_IPC_TAG_EXIT);
/* This call should not fail or return */
printf("%s: L4 IPC returned: %d.\n", __FUNCTION__, ret);
print_err("%s: L4 IPC returned: %d.\n", __FUNCTION__, ret);
BUG();
}

View File

@@ -13,6 +13,7 @@
#include <l4/macros.h>
#include INC_GLUE(memory.h)
#include <shpage.h>
#include <libposix.h>
static inline int l4_fork(void)
{
@@ -20,12 +21,12 @@ static inline int l4_fork(void)
/* Call pager with open() request. Check ipc error. */
if ((err = l4_sendrecv(PAGER_TID, PAGER_TID, L4_IPC_TAG_FORK)) < 0) {
printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, err);
print_err("%s: L4 IPC Error: %d.\n", __FUNCTION__, err);
return err;
}
/* Check if syscall itself was successful */
if ((err = l4_get_retval()) < 0) {
printf("%s: OPEN Error: %d.\n", __FUNCTION__, err);
print_err("%s: OPEN Error: %d.\n", __FUNCTION__, err);
return err;
}
return err;
@@ -74,12 +75,12 @@ int clone(int (*fn)(void *), void *child_stack, int flags, void *arg, ...)
/* Perform an ipc but with different return logic. See implementation. */
if ((ret = arch_clone(PAGER_TID, PAGER_TID)) < 0) {
printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, ret);
print_err("%s: L4 IPC Error: %d.\n", __FUNCTION__, ret);
return ret;
}
if ((ret = l4_get_retval()) < 0) {
printf("%s: CLONE Error: %d.\n", __FUNCTION__, ret);
print_err("%s: CLONE Error: %d.\n", __FUNCTION__, ret);
return ret;
}
return ret;

View File

@@ -3,6 +3,7 @@
#include <l4lib/arch/syslib.h>
#include <sys/types.h>
#include <unistd.h>
#include <libposix.h>
pid_t getpid(void)
{

View File

@@ -0,0 +1,13 @@
#ifndef __LIBPOSIX_H__
#define __LIBPOSIX_H__
/* Abort debugging conditions */
// #define LIBPOSIX_ERROR_MESSAGES
#if defined (LIBPOSIX_ERROR_MESSAGES)
#define print_err(...) printf(__VA_ARGS__)
#else
#define print_err(...)
#endif
#endif /* __LIBPOSIX_H__ */

View File

@@ -5,6 +5,7 @@
*/
#include <shpage.h>
#include <posix_init.h>
#include <libposix.h>
void posix_service_init(void)
{

View File

@@ -10,6 +10,7 @@
#include <l4lib/arch/syscalls.h>
#include <l4lib/arch/syslib.h>
#include <l4lib/ipcdefs.h>
#include <libposix.h>
static inline off_t l4_lseek(int fildes, off_t offset, int whence)
{
@@ -21,12 +22,12 @@ static inline off_t l4_lseek(int fildes, off_t offset, int whence)
/* Call pager with shmget() request. Check ipc error. */
if ((offres = l4_sendrecv(PAGER_TID, PAGER_TID, L4_IPC_TAG_LSEEK)) < 0) {
printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, offres);
print_err("%s: L4 IPC Error: %d.\n", __FUNCTION__, offres);
return offres;
}
/* Check if syscall itself was successful */
if ((offres = l4_get_retval()) < 0) {
printf("%s: OPEN Error: %d.\n", __FUNCTION__, (int)offres);
print_err("%s: OPEN Error: %d.\n", __FUNCTION__, (int)offres);
return offres;
}

View File

@@ -18,6 +18,7 @@
#include <fcntl.h>
#include <l4/macros.h>
#include INC_GLUE(memory.h)
#include <libposix.h>
static inline int l4_mkdir(const char *pathname, mode_t mode)
{
@@ -30,12 +31,12 @@ static inline int l4_mkdir(const char *pathname, mode_t mode)
/* Call pager with shmget() request. Check ipc error. */
if ((fd = l4_sendrecv(VFS_TID, VFS_TID, L4_IPC_TAG_MKDIR)) < 0) {
printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, fd);
print_err("%s: L4 IPC Error: %d.\n", __FUNCTION__, fd);
return fd;
}
/* Check if syscall itself was successful */
if ((fd = l4_get_retval()) < 0) {
printf("%s: MKDIR Error: %d.\n", __FUNCTION__, fd);
print_err("%s: MKDIR Error: %d.\n", __FUNCTION__, fd);
return fd;
}
return fd;

View File

@@ -11,6 +11,7 @@
#include <l4lib/arch/syscalls.h>
#include <l4lib/arch/syslib.h>
#include <l4lib/ipcdefs.h>
#include <libposix.h>
/* FIXME: Implement the same separation that is in read.c write.c etc. such that
* l4_syscall returns negative value and then the actual posix glue sets the errno
@@ -43,12 +44,12 @@ static inline void *l4_mmap(void *start, size_t length, int prot, int flags, int
/* Call pager with MMAP request. Check ipc error. */
if ((ret = l4_sendrecv(PAGER_TID, PAGER_TID, L4_IPC_TAG_MMAP)) < 0) {
printf("%s: IPC Error: %d.\n", __FUNCTION__, ret);
print_err("%s: IPC Error: %d.\n", __FUNCTION__, ret);
return PTR_ERR(ret);
}
if (IS_ERR(ret = l4_get_retval()))
printf("%s: MMAP Error: %d.\n", __FUNCTION__, ret);
print_err("%s: MMAP Error: %d.\n", __FUNCTION__, ret);
return (void *)ret;
}
@@ -79,13 +80,13 @@ int l4_munmap(void *start, size_t length)
/* Call pager with MMAP request. */
if ((err = l4_sendrecv(PAGER_TID, PAGER_TID, L4_IPC_TAG_MUNMAP)) < 0) {
printf("%s: IPC Error: %d.\n", __FUNCTION__, err);
print_err("%s: IPC Error: %d.\n", __FUNCTION__, err);
return err;
}
/* Check if syscall itself was successful */
if ((err = l4_get_retval()) < 0) {
printf("%s: MUNMAP Error: %d.\n", __FUNCTION__, err);
print_err("%s: MUNMAP Error: %d.\n", __FUNCTION__, err);
return err;
}
return 0;
@@ -111,12 +112,12 @@ int l4_msync(void *start, size_t length, int flags)
/* Call pager with MMAP request. */
if ((errno = l4_sendrecv(PAGER_TID, PAGER_TID, L4_IPC_TAG_MSYNC)) < 0) {
printf("%s: IPC Error: %d.\n", __FUNCTION__, errno);
print_err("%s: IPC Error: %d.\n", __FUNCTION__, errno);
return -1;
}
/* Check if syscall itself was successful */
if ((errno = l4_get_retval()) < 0) {
printf("%s: MSYNC Error: %d.\n", __FUNCTION__, errno);
print_err("%s: MSYNC Error: %d.\n", __FUNCTION__, errno);
return -1;
}
return 0;

View File

@@ -19,6 +19,7 @@
#include <l4/macros.h>
#include INC_GLUE(memory.h)
#include <shpage.h>
#include <libposix.h>
static inline int l4_open(const char *pathname, int flags, mode_t mode)
{
@@ -31,12 +32,12 @@ static inline int l4_open(const char *pathname, int flags, mode_t mode)
/* Call pager with open() request. Check ipc error. */
if ((fd = l4_sendrecv(VFS_TID, VFS_TID, L4_IPC_TAG_OPEN)) < 0) {
printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, fd);
print_err("%s: L4 IPC Error: %d.\n", __FUNCTION__, fd);
return fd;
}
/* Check if syscall itself was successful */
if ((fd = l4_get_retval()) < 0) {
printf("%s: OPEN Error: %d, for path %s\n",
print_err("%s: OPEN Error: %d, for path %s\n",
__FUNCTION__, fd, pathname);
return fd;
}

View File

@@ -16,6 +16,7 @@
#include <l4/macros.h>
#include INC_GLUE(memory.h)
#include <shpage.h>
#include <libposix.h>
static inline int l4_readdir(int fd, void *buf, size_t count)
{
@@ -27,12 +28,12 @@ static inline int l4_readdir(int fd, void *buf, size_t count)
/* Call pager with readdir() request. Check ipc error. */
if ((cnt = l4_sendrecv(VFS_TID, VFS_TID, L4_IPC_TAG_READDIR)) < 0) {
printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, cnt);
print_err("%s: L4 IPC Error: %d.\n", __FUNCTION__, cnt);
return cnt;
}
/* Check if syscall itself was successful */
if ((cnt = l4_get_retval()) < 0) {
printf("%s: READDIR Error: %d.\n", __FUNCTION__, (int)cnt);
print_err("%s: READDIR Error: %d.\n", __FUNCTION__, (int)cnt);
return cnt;
}
@@ -51,12 +52,12 @@ static inline int l4_read(int fd, void *buf, size_t count)
/* Call pager with read() request. Check ipc error. */
if ((cnt = l4_sendrecv(PAGER_TID, PAGER_TID, L4_IPC_TAG_READ)) < 0) {
printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, cnt);
print_err("%s: L4 IPC Error: %d.\n", __FUNCTION__, cnt);
return cnt;
}
/* Check if syscall itself was successful */
if ((cnt = l4_get_retval()) < 0) {
printf("%s: READ Error: %d.\n", __FUNCTION__, (int)cnt);
print_err("%s: READ Error: %d.\n", __FUNCTION__, (int)cnt);
return cnt;
}

View File

@@ -12,6 +12,7 @@
#include <l4lib/arch/syslib.h>
#include <l4lib/ipcdefs.h>
#include <l4/macros.h>
#include <libposix.h>
int l4_shmget(l4id_t key, int size, int shmflg)
{
@@ -23,12 +24,12 @@ int l4_shmget(l4id_t key, int size, int shmflg)
/* Call pager with shmget() request. Check ipc error. */
if ((err = l4_sendrecv(PAGER_TID, PAGER_TID, L4_IPC_TAG_SHMGET)) < 0) {
printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, err);
print_err("%s: L4 IPC Error: %d.\n", __FUNCTION__, err);
return err;
}
/* Check if syscall itself was successful */
if (IS_ERR(err = l4_get_retval())) {
printf("%s: SHMGET Error: %d.\n", __FUNCTION__, err);
print_err("%s: SHMGET Error: %d.\n", __FUNCTION__, err);
return err;
}
@@ -46,12 +47,12 @@ void *l4_shmat(l4id_t shmid, const void *shmaddr, int shmflg)
/* Call pager with shmget() request. Check ipc error. */
if ((err = l4_sendrecv(PAGER_TID, PAGER_TID, L4_IPC_TAG_SHMAT)) < 0) {
printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, err);
print_err("%s: L4 IPC Error: %d.\n", __FUNCTION__, err);
return PTR_ERR(err);
}
/* Check if syscall itself was successful */
if (IS_ERR(err = l4_get_retval())) {
printf("%s: SHMAT Error: %d.\n", __FUNCTION__, err);
print_err("%s: SHMAT Error: %d.\n", __FUNCTION__, err);
return PTR_ERR(err);
}
@@ -67,12 +68,12 @@ int l4_shmdt(const void *shmaddr)
/* Call pager with shmget() request. Check ipc error. */
if ((err = l4_sendrecv(PAGER_TID, PAGER_TID, L4_IPC_TAG_SHMDT)) < 0) {
printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, err);
print_err("%s: L4 IPC Error: %d.\n", __FUNCTION__, err);
return -1;
}
/* Check if syscall itself was successful */
if ((err = l4_get_retval()) < 0) {
printf("%s: SHMDT Error: %d.\n", __FUNCTION__, err);
print_err("%s: SHMDT Error: %d.\n", __FUNCTION__, err);
return -1;
}
return 0;

View File

@@ -14,6 +14,7 @@
#include <sys/types.h>
#include <sys/shm.h>
#include <shpage.h>
#include <libposix.h>
/*
* Shared page initialisation of posix-like tasks.
@@ -47,13 +48,13 @@ static void *shared_page_address(void)
/* Call pager with utcb address request. Check ipc error. */
if ((err = l4_sendrecv(PAGER_TID, PAGER_TID,
L4_IPC_TAG_SHPAGE)) < 0) {
printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, err);
print_err("%s: L4 IPC Error: %d.\n", __FUNCTION__, err);
return PTR_ERR(err);
}
/* Check if syscall itself was successful */
if (IS_ERR(addr = (void *)l4_get_retval())) {
printf("%s: Request UTCB Address Error: %d.\n",
print_err("%s: Request UTCB Address Error: %d.\n",
__FUNCTION__, (int)addr);
return addr;
}
@@ -80,7 +81,7 @@ int shared_page_init(void)
/* Obtain our shared page address */
shared_page = shared_page_address();
//printf("%s: UTCB Read from mm0 as: 0x%x\n", __FUNCTION__,
//print_err("%s: UTCB Read from mm0 as: 0x%x\n", __FUNCTION__,
// (unsigned long)shared_page);
/* Use it as a key to create a shared memory region */

View File

@@ -19,6 +19,7 @@
#include <l4/macros.h>
#include INC_GLUE(memory.h)
#include <shpage.h>
#include <libposix.h>
static inline int l4_fstat(int fd, void *buffer)
{
@@ -30,12 +31,12 @@ static inline int l4_fstat(int fd, void *buffer)
/* Call pager with open() request. Check ipc error. */
if ((err = l4_sendrecv(VFS_TID, VFS_TID, L4_IPC_TAG_FSTAT)) < 0) {
printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, err);
print_err("%s: L4 IPC Error: %d.\n", __FUNCTION__, err);
return err;
}
/* Check if syscall itself was successful */
if ((err = l4_get_retval()) < 0) {
printf("%s: FSTAT Error: %d.\n", __FUNCTION__, err);
print_err("%s: FSTAT Error: %d.\n", __FUNCTION__, err);
return err;
}
return err;
@@ -73,13 +74,13 @@ static inline int l4_stat(const char *pathname, void *buffer)
/* Call vfs with stat() request. Check ipc error. */
if ((err = l4_sendrecv(VFS_TID, VFS_TID, L4_IPC_TAG_STAT)) < 0) {
printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, err);
print_err("%s: L4 IPC Error: %d.\n", __FUNCTION__, err);
return err;
}
/* Check if syscall itself was successful */
if ((err = l4_get_retval()) < 0) {
printf("%s: STAT Error: %d.\n", __FUNCTION__, err);
print_err("%s: STAT Error: %d.\n", __FUNCTION__, err);
return err;
}

View File

@@ -2,6 +2,7 @@
#include <l4lib/arch/syscalls.h>
#include <sys/time.h>
#include <errno.h>
#include <libposix.h>
int gettimeofday(struct timeval *tv, struct timezone *tz)
{

View File

@@ -10,6 +10,7 @@
#include <l4lib/arch/syscalls.h>
#include <l4lib/arch/syslib.h>
#include <l4lib/ipcdefs.h>
#include <libposix.h>
static inline int l4_write(int fd, const void *buf, size_t count)
{
@@ -21,12 +22,12 @@ static inline int l4_write(int fd, const void *buf, size_t count)
/* Call pager with write() request. Check ipc error. */
if ((wrcnt = l4_sendrecv(PAGER_TID, PAGER_TID, L4_IPC_TAG_WRITE)) < 0) {
printf("%s: L4 IPC Error: %d.\n", __FUNCTION__, wrcnt);
print_err("%s: L4 IPC Error: %d.\n", __FUNCTION__, wrcnt);
return wrcnt;
}
/* Check if syscall itself was successful */
if ((wrcnt = l4_get_retval()) < 0) {
printf("%s: WRITE Error: %d.\n", __FUNCTION__, (int)wrcnt);
print_err("%s: WRITE Error: %d.\n", __FUNCTION__, (int)wrcnt);
return wrcnt;
}

View File

@@ -155,17 +155,11 @@ int do_shmdt(struct tcb *task, struct vm_file *shm)
int sys_shmdt(struct tcb *task, const void *shmaddr)
{
struct vm_file *shm_file, *n;
int err;
list_for_each_entry_safe(shm_file, n, &global_vm_files.list, list) {
list_for_each_entry_safe(shm_file, n, &global_vm_files.list, list)
if (shm_file->type == VM_FILE_SHM &&
shm_file_to_desc(shm_file)->shm_addr == shmaddr) {
if ((err = do_shmdt(task, shm_file) < 0))
return err;
else
break;
}
}
shm_file_to_desc(shm_file)->shm_addr == shmaddr)
return do_shmdt(task, shm_file);
return -EINVAL;
}

View File

@@ -22,9 +22,14 @@ void wait_pager(l4id_t partner)
// printf("Pager synced with us.\n");
}
pid_t parent_of_all;
void main(void)
{
printf("\n%s: Started with thread id %d\n", __TASKNAME__, self_tid());
printf("\n%s: Started with thread id %d\n", __TASKNAME__, getpid());
parent_of_all = getpid();
wait_pager(0);
@@ -34,6 +39,8 @@ void main(void)
mmaptest();
shmtest();
forktest();
fileio();

View File

@@ -10,13 +10,11 @@
int global = 0;
pid_t parent_of_all;
int forktest(void)
{
pid_t myid;
parent_of_all = getpid();
/* 16 forks */
for (int i = 0; i < 4; i++)

View File

@@ -9,6 +9,7 @@
#include <fcntl.h>
#include <stdio.h>
#include <tests.h>
#include <unistd.h>
int shmtest(void)
{
@@ -17,35 +18,53 @@ int shmtest(void)
void *bases[2] = { 0 , 0 };
int shmids[2];
printf("Initiating shmget()\n");
test_printf("Initiating shmget()\n");
for (int i = 0; i < 2; i++) {
if ((shmids[i] = shmget(keys[i], 27, IPC_CREAT | 0666)) < 0) {
printf("Call failed.\n");
perror("SHMGET");
test_printf("SHMGET", errno);
goto out_err;
} else
printf("SHMID returned: %d\n", shmids[i]);
test_printf("SHMID returned: %d\n", shmids[i]);
}
printf("Now shmat()\n");
test_printf("Now shmat()\n");
for (int i = 0; i < 2; i++) {
if ((int)(bases[i] = shmat(shmids[i], NULL, 0)) == -1)
perror("SHMAT");
else
printf("SHM base address returned: %p\n", bases[i]);
if ((int)(bases[i] = shmat(shmids[i], NULL, 0)) == -1) {
test_printf("SHMAT", errno);
goto out_err;
} else
test_printf("SHM base address returned: %p\n", bases[i]);
}
printf("Now shmdt()\n");
/* Write to the bases */
*((unsigned int *)bases[0]) = 0xDEADBEEF;
*((unsigned int *)bases[1]) = 0xFEEDBEEF;
test_printf("Now shmdt()\n");
for (int i = 0; i < 2; i++) {
if (shmdt(bases[i]) < 0)
perror("SHMDT");
else
printf("SHM detached OK.\n");
if (shmdt(bases[i]) < 0) {
test_printf("SHMDT", errno);
goto out_err;
} else
test_printf("SHM detached OK.\n");
}
printf("Now shmat() again\n");
test_printf("Now shmat() again\n");
for (int i = 0; i < 2; i++) {
if ((int)(bases[i] = shmat(shmids[i], NULL, 0)) == -1)
perror("SHMAT");
else
printf("SHM base address returned: %p\n", bases[i]);
bases[i] = shmat(shmids[i], NULL, 0);
/* SHMAT should fail since no refs were left in last detach */
if ((int)bases[i] != -1) {
test_printf("SHM base address returned: %p, "
"but it should have failed\n", bases[i]);
goto out_err;
}
}
if (getpid() == parent_of_all)
printf("SHM TEST -- PASSED --\n");
return 0;
out_err:
printf("SHM TEST -- FAILED --\n");
return 0;
}