Home | History | Annotate | Download | only in locks
      1 /* *************************************************
      2  * *********** README ******************************
      3  * *************************************************
      4  *
      5  * COMPILE : make
      6  * RUN : ./locktests -n <number of concurent process> -f <test file> [-P]
      7  *
      8  * GOAL : This test tries to stress the fcntl locking functions.  A
      9  * master process sets a lock on a file region (this is called "byte
     10  * range locking").  Some slave processes try to perform operations on
     11  * this region, such as read, write, set a new lock ... The expected
     12  * results of these operations are known.  If the operation's result is
     13  * the same as the expected one, the test suceeds, else it fails.
     14  *
     15  * Slaves are either concurent processes or threads.
     16  * -n <num>  : Number of threads to use (mandatory).
     17  * -f <file> : Run the test on a test file defined by the -f option (mandatory).
     18  * -T        : Use threads instead of processes (optional).
     19  *
     20  * HISTORY : This program has been written to stress NFSv4 locks. -P
     21  * option was created to verify NFSv4 locking was thread-aware, and so,
     22  * locking behaviour over NFSv4 was POSIX correct both using threads and
     23  * process. This option may not be usefull to stress.
     24  *
     25  * EXAMPLE : ./locktests -n 50 -f /file/system/to/test
     26  *
     27  *
     28  * Vincent ROQUETA 2005 - vincent.roqueta (at) ext.bull.net
     29  * BULL S.A.
     30  */
     31 
     32 
     33 #include <stdio.h>
     34 #include <stdlib.h>
     35 #include <stdlib.h>
     36 #include <signal.h>
     37 #include <string.h>
     38 #include <unistd.h>
     39 #include <fcntl.h>
     40 #include <errno.h>
     41 #include <math.h>
     42 #ifdef STDARG
     43 #include <stdarg.h>
     44 #endif
     45 #include <sys/types.h>
     46 #include <sys/wait.h>
     47 #include <sys/param.h>
     48 #include <sys/times.h>
     49 #ifdef MMAP
     50 #include <sys/mman.h>
     51 #endif
     52 #include <inttypes.h>
     53 #include <pthread.h>
     54 #include <sys/socket.h>
     55 #include <netinet/in.h>
     56 #include <sys/select.h>
     57 
     58 #ifdef O_SYNC
     59 #define OPENFLAGS       (O_CREAT | O_RDWR | O_SYNC )
     60 #else
     61 #define OPENFLAGS       (O_CREAT | O_RDWR )
     62 #endif
     63 #define OPENMODES       (0600)
     64 #define MANDMODES       (0600)
     65 /*(02666)*/
     66 
     67 #define SUCCES 1
     68 #define ECHEC  0
     69 
     70 #define TRUE 1
     71 #define FALSE 0
     72 
     73 #define PROCESS 0
     74 #define THREAD 1
     75 
     76 
     77 //#define DEBUG
     78 #ifdef DEBUG
     79         #define E(a)  perror(a)
     80         #define P(a,b) printf(a,b)
     81 #else
     82         #define E(a)
     83         #define P(a,b)
     84 #endif
     85 
     86 
     87 
     88 #ifndef LOCKTESTS_H
     89 #define LOCKTESTS_H
     90 
     91 #define M_SIZE 512
     92 
     93 int writeToAllClients(char *foo);
     94 
     95 int serverReceiveNet();
     96 int clientReceiveNet();
     97 int serverReceiveClient(int n);
     98 int setupClients(int type, char *fname, int nThread);
     99 int serverCloseConnection();
    100 int getConfiguration(int *type, char *fname, int *nThread);
    101 int readFromServer(char *message);
    102 int serverSendClient(int n);
    103 
    104 
    105 enum state_t     {
    106                 CLEAN,
    107                 RDONLY,
    108                 RESULT,
    109                 WRONLY,
    110                 SELECT,
    111                 LOCK,
    112                 SYNC,
    113                 END,
    114                 READLOCK,
    115                 WRITELOCK,
    116                 BYTELOCK,
    117                 BYTELOCK_READ,
    118                 BYTELOCK_WRITE
    119 };
    120 
    121 /* Public data */
    122 struct dataPub {
    123     /* Number of clients */
    124     int nclnt;
    125     /* List of master to slave pipes */
    126     int **lclnt;
    127     /* Slave to master pipe */
    128     int master[2];
    129     /* Thread list */
    130     pthread_t *lthreads;
    131     /* test file name */
    132     char *fname;
    133     /* test file file-descriptor */
    134     int fd;
    135     /* Detailed error messages */
    136     int verbose;
    137 };
    138 
    139 /* private data */
    140 struct dataPriv {
    141     /* thread number */
    142     int whoami;
    143 };
    144 
    145 struct dataChild{
    146     struct dataPub *dp;
    147     struct dataPriv *dpr;
    148 };
    149 
    150 
    151 struct s_test {
    152     int test;
    153     int type;
    154     char *nom;
    155     int resAtt;
    156 
    157 };
    158 
    159 
    160 
    161 
    162 int configureServer(int  max);
    163 int configureClient(char *s);
    164 
    165 #endif
    166