Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | /* * shared_memory_tests.c * xnu_quick_test * * Created by Jerry Cottingham on 6/2/2005. * Copyright 2005 Apple Computer Inc. All rights reserved. * */ #include "tests.h" #include <sys/ipc.h> #include <sys/mman.h> #include <sys/shm.h> extern char g_target_path[ PATH_MAX ]; /* ************************************************************************************************************** * Test shmat, shmctl, shmdt, shmget system calls. * ************************************************************************************************************** */ int shm_tests( void * the_argp ) { int my_err; int my_shm_id; void * my_shm_addr = NULL; struct shmid_ds my_shmid_ds; my_shm_id = shmget( IPC_PRIVATE, 4096, (IPC_CREAT | IPC_R | IPC_W) ); if ( my_shm_id == -1 ) { printf( "shmget failed with error %d - \"%s\" \n", errno, strerror( errno) ); goto test_failed_exit; } my_shm_addr = shmat( my_shm_id, NULL, SHM_RND ); if ( my_shm_addr == (void *) -1 ) { my_shm_addr = NULL; printf( "shmat failed with error %d - \"%s\" \n", errno, strerror( errno) ); goto test_failed_exit; } /* try writing to the shared segment */ *((char *) my_shm_addr) = 'A'; my_err = shmctl( my_shm_id, IPC_STAT, &my_shmid_ds ); if ( my_err == -1 ) { printf( "shmctl failed with error %d - \"%s\" \n", errno, strerror( errno) ); goto test_failed_exit; } if ( my_shmid_ds.shm_segsz != 4096 ) { printf( "shmctl failed get correct shared segment size \n" ); goto test_failed_exit; } if ( getpid( ) != my_shmid_ds.shm_cpid ) { printf( "shmctl failed get correct creator pid \n" ); goto test_failed_exit; } my_err = shmdt( my_shm_addr ); if ( my_err == -1 ) { printf( "shmdt failed with error %d - \"%s\" \n", errno, strerror( errno) ); goto test_failed_exit; } my_shm_addr = NULL; my_err = 0; goto test_passed_exit; test_failed_exit: my_err = -1; test_passed_exit: if ( my_shm_addr != NULL ) { shmdt( my_shm_addr ); } return( my_err ); } /* ************************************************************************************************************** * Test BSD shared memory system calls. * ************************************************************************************************************** */ int bsd_shm_tests( void * the_argp ) { int my_err, i; int my_fd = -1; char * my_addr = NULL; char my_name[ 64 ]; for ( i = 0; i < 100; i++ ) { sprintf( &my_name[0], "bsd_shm_tests_%d", i ); my_fd = shm_open( &my_name[0], (O_RDWR | O_CREAT | O_EXCL), S_IRWXU ); if ( my_fd != -1 ) break; my_err = errno; if ( my_err != EEXIST ) { printf( "shm_open failed with error %d - \"%s\" \n", my_err, strerror( my_err) ); goto test_failed_exit; } } if ( my_fd == -1 ) { printf( "shm_open failed to open a shared memory object with name \"%s\" \n", &my_name[0] ); goto test_failed_exit; } /* grow shared memory object */ my_err = ftruncate( my_fd, 4096 ); if ( my_err == -1 ) { printf( "ftruncate call failed with error %d - \"%s\" \n", errno, strerror( errno) ); goto test_failed_exit; } my_err = shm_unlink( &my_name[0] ); if ( my_err == -1 ) { printf( "shm_unlink failed with error %d - \"%s\" \n", errno, strerror( errno) ); goto test_failed_exit; } my_addr = (char *) mmap( NULL, 4096, (PROT_READ | PROT_WRITE), (MAP_FILE | MAP_SHARED), my_fd, 0 ); if ( my_addr == (char *) -1 ) { printf( "mmap call failed with error %d - \"%s\" \n", errno, strerror( errno) ); goto test_failed_exit; } my_err = 0; goto test_passed_exit; test_failed_exit: my_err = -1; test_passed_exit: if ( my_fd != -1 ) close( my_fd ); return( my_err ); } |