/* * Copyright (c) 1997 X/Open Company Ltd., A member of The Open Group * * All rights reserved. No part of this source code may be reproduced, * stored in a retrieval system, or transmitted, in any form or by any * means, electronic, mechanical, photocopying, recording or otherwise, * except as stated in the end-user licence agreement, without the prior * permission of the copyright owners. * * Motif, OSF/1 and UNIX are registered trademarks and X/Open, * the "X Device" and The Open Group are trademarks of The Open Group. * * Developed for X/Open by Applied Testing and Technology, Inc. * * Project: VSRT * * File: tset/rt.os/mlock/mlockall/mlockall2.c * * Modifications: * $Log: mlockall2.c,v $ * Revision 2.0 1997/06/15 19:45:58 andy * Branch point for Release 5.0.0b1 * * Revision 1.2 1997/06/10 21:33:16 andy * Editorial * */ /*Exec-ed by mlockall.c to test locking as it requires privilege to lock memory*/ #ifndef lint #define MAIN #ifdef MAIN static char sccsid[] = "@(#)rt.os/mlock/mlockall - mlockall2 Rel 4.3.1 (05/18/93)"; char *copyright[] = { "(C) Copyright 1997 X/Open Company Limited", "All Rights Reserved." }; #endif /* MAIN */ #endif /* lint */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include private int tb_mlockall(); private void checkids(); private void subtest2(); int errors = 0; /*from vsrtlib/mkmmap.c*/ extern int vsrt_got_sigsegv; extern int vsrt_got_sigbus; extern int vsrt_got_sig; extern unsigned long vsrt_pgsz; extern unsigned long vsrt_ipgsz; extern int vsrt_setjmp_called; #define test_file "vsrt_mlockall" public int tet_main(argc, argv) int argc; char **argv; { subtest2(); return 0; } #define TESTPAGES 10 private void subtest2() { int fd; int err; int i; int pathok = 0; char *addr; char *addr1; char *addr2; DBUG_ENTER("subtest2"); if (setprv(PRV_MEMLOCK) != 0) { xx_rpt(FAILURE); in_rpt("setprv(PRV_MEMLOCK) failed"); DBUG_VOID_RETURN } if (vsrt_mmap_setup() == -1) DBUG_VOID_RETURN else PATH_TRACE; fd = vsrt_open_file(test_file, O_RDWR, (mode_t)VSRT_PROT_ALL); if (fd == -1) DBUG_VOID_RETURN else PATH_TRACE; /*map pages*/ if ((addr = (char *)mmap(0, vsrt_pgsz*TESTPAGES, PROT_READ, MAP_SHARED, fd, 0)) == (char *)MAP_FAILED) { vsrt_sysfail("mmap"); DBUG_VOID_RETURN } else PATH_TRACE; /*lock pages*/ if (tb_mlockall(MCL_FUTURE) != 0) { vsrt_sysfail("mlockall"); xx_rpt(FAILURE); DBUG_VOID_RETURN } if ((addr1 = (char *)mmap(0, vsrt_pgsz*TESTPAGES, PROT_READ, MAP_SHARED, fd, vsrt_pgsz*TESTPAGES)) == (char *)MAP_FAILED) { vsrt_sysfail("mmap"); DBUG_VOID_RETURN } else PATH_TRACE; if ((addr2 = (char *)mmap(0, vsrt_pgsz*TESTPAGES, PROT_READ, MAP_SHARED, fd, vsrt_pgsz*TESTPAGES*2)) == (char *)MAP_FAILED) { vsrt_sysfail("mmap"); DBUG_VOID_RETURN } else PATH_TRACE; /*check each page mapped before mlockall to see it is still unlocked*/ for (i = 0; i < TESTPAGES; i++) { if (msync((void *)(addr+(vsrt_pgsz*i)), vsrt_pgsz, MS_INVALIDATE) != 0) { err = errno; in_rpt("msync(.., MS_INVALIDATE) failed on page %d of first area of memory mapped before mlockall, errno = %d (%s)", i, err, errname(err)); xx_rpt(FAILURE); errors++; } } /*check each page mapped after mlockall to see it is locked*/ for (i = 0; i < TESTPAGES; i++) { if (msync((void *)(addr1+(vsrt_pgsz*i)), vsrt_pgsz, MS_INVALIDATE) == 0) { in_rpt("msync(.., MS_INVALIDATE) succeeded on page %d of first area of mapped memory", i); xx_rpt(FAILURE); errors++; } else if (errno != EBUSY) { err = errno; in_rpt("msync(.., MS_INVALIDATE) failed on page %d of first area of mapped memory, but errno = %d (%s)", i, err, errname(err)); xx_rpt(FAILURE); errors++; } } for (i = 0; i < TESTPAGES; i++) { if (msync((void *)(addr2+(vsrt_pgsz*i)), vsrt_pgsz, MS_INVALIDATE) == 0) { in_rpt("msync(.., MS_INVALIDATE) succeeded on page %d of second area of mapped memory", i); xx_rpt(FAILURE); errors++; } else if (errno != EBUSY) { err = errno; in_rpt("msync(.., MS_INVALIDATE) failed on page %d of second area of mapped memory, but errno = %d (%s)", i, err, errname(err)); xx_rpt(FAILURE); errors++; } } (void)munlock((void *)addr, vsrt_pgsz*TESTPAGES); (void)munlock((void *)addr1, vsrt_pgsz*TESTPAGES); (void)munlock((void *)addr2, vsrt_pgsz*TESTPAGES); (void)close(fd); (void)unlink(test_file); if (errors == 0) xs_rpt(); DBUG_VOID_RETURN } private int tb_mlockall(flags) int flags; { int retval; retval = mlockall(flags); #ifdef TESTBED errno++; return -1; #else return retval; #endif }