Home | History | Annotate | Line # | Download | only in readhappy_mpsafe
      1 /*	$NetBSD: test_readhappy.c,v 1.1 2018/04/20 00:06:45 kamil Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 2018 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     17  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     18  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     19  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     26  * POSSIBILITY OF SUCH DAMAGE.
     27  */
     28 
     29 #include <err.h>
     30 #include <errno.h>
     31 #include <pthread.h>
     32 #include <stdio.h>
     33 #include <stdlib.h>
     34 
     35 /*
     36  * Compile this program with -pthread and run it to test the readhappy_mpsafe
     37  * module. This program should print out happy numbers read from /dev/happy_mpsafe.
     38  * Insert the module and make the /dev/happy_mpsafe node before executing this file.
     39  */
     40 
     41 
     42 static void* read_happy(void *);
     43 
     44 static FILE *fp;
     45 
     46 /*
     47  * thread function used to read /dev/happy_mpsafe and print them out.
     48  */
     49 static void *
     50 read_happy(void *unused)
     51 {
     52 	int line;
     53 
     54 	for (;;) {
     55 		fscanf(fp, "%d", &line);
     56 		printf("%d\n", line);
     57 		fflush(stdout);
     58 	}
     59 	/* NOTREACHED */
     60 	return NULL;
     61 }
     62 
     63 /*
     64  *  main function : opens /dev/happy_mpsafe and sets the global file descriptor
     65  *  creates 100 threads which try to use the file descriptor to read
     66  *  from /dev/happy_mpsafe.
     67  *  This function does not return anything and will run in an infinite loop.
     68  */
     69 int
     70 main(int argc, const char *argv[])
     71 {
     72 	pthread_t thr[100];
     73 
     74 	fp = fopen("/dev/happy_mpsafe","r");
     75 	if (fp == NULL)
     76 		err(EXIT_FAILURE, "open");
     77 	for (int i = 0; i < 100; i++)
     78 		pthread_create(&thr[i], NULL, read_happy, NULL);
     79 	(void)read_happy(NULL);
     80 	/* NOTREACHED */
     81 	return EXIT_SUCCESS;
     82 }
     83