Home | History | Annotate | Download | only in libmicro
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms
      5  * of the Common Development and Distribution License
      6  * (the "License").  You may not use this file except
      7  * in compliance with the License.
      8  *
      9  * You can obtain a copy of the license at
     10  * src/OPENSOLARIS.LICENSE
     11  * or http://www.opensolaris.org/os/licensing.
     12  * See the License for the specific language governing
     13  * permissions and limitations under the License.
     14  *
     15  * When distributing Covered Code, include this CDDL
     16  * HEADER in each file and include the License file at
     17  * usr/src/OPENSOLARIS.LICENSE.  If applicable,
     18  * add the following below this CDDL HEADER, with the
     19  * fields enclosed by brackets "[]" replaced with your
     20  * own identifying information: Portions Copyright [yyyy]
     21  * [name of copyright owner]
     22  *
     23  * CDDL HEADER END
     24  */
     25 
     26 /*
     27  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
     28  * Use is subject to license terms.
     29  */
     30 
     31 /*
     32  * test file locking
     33  */
     34 
     35 #include <unistd.h>
     36 #include <stdlib.h>
     37 #include <stdio.h>
     38 #include <string.h>
     39 #include <errno.h>
     40 #include <fcntl.h>
     41 
     42 #include "libmicro.h"
     43 
     44 static int 			file;
     45 
     46 int
     47 block(int index)
     48 {
     49 	struct flock		fl;
     50 
     51 	fl.l_type = F_WRLCK;
     52 	fl.l_whence = SEEK_SET;
     53 	fl.l_start = index;
     54 	fl.l_len = 1;
     55 	return (fcntl(file, F_SETLKW, &fl) == -1);
     56 }
     57 
     58 int
     59 unblock(int index)
     60 {
     61 	struct flock		fl;
     62 
     63 	fl.l_type = F_UNLCK;
     64 	fl.l_whence = SEEK_SET;
     65 	fl.l_start = index;
     66 	fl.l_len = 1;
     67 	return (fcntl(file, F_SETLK, &fl) == -1);
     68 }
     69 int
     70 benchmark_init()
     71 {
     72 	char			fname[80];
     73 	int	errors = 0;
     74 
     75 	(void) sprintf(fname, "/tmp/oneflock.%ld", getpid());
     76 
     77 	file = open(fname, O_CREAT | O_TRUNC | O_RDWR, 0600);
     78 
     79 	if (file == -1) {
     80 		errors++;
     81 	}
     82 	if (unlink(fname)) {
     83 		errors++;
     84 	}
     85 
     86 	lm_tsdsize = 0;
     87 
     88 	return (errors);
     89 }
     90 
     91 /*ARGSUSED*/
     92 int
     93 benchmark(void *tsd, result_t *res)
     94 {
     95 	int			i;
     96 	int			e = 0;
     97 
     98 	for (i = 0; i < lm_optB; i ++) {
     99 		e += block(0);
    100 		e += unblock(0);
    101 	}
    102 	res->re_count = i;
    103 	res->re_errors = e;
    104 
    105 	return (0);
    106 }
    107