#define PTHREAD_KERNEL
#include <pthread.h>
#include <stdio.h>

#define RSIZE (1024*1024*4)
pthread_mutex_t lock;


int Trip2 = 0;
int Skip = 0;
int M = 0, Idx = 0, S[1024*10];
int Bcnt = RSIZE, Cnt = 1200;
char buf[RSIZE];
char buf2[RSIZE];
int th1 = 0, th2 = 0;
int Finish = 0;
mypthread_yield()
{
static cnt = 0;
        if( ++cnt > 5) { cnt = 0; usleep(10);
        pthread_yield();
        };
        pthread_yield();
}
Reg( val)
int val;
{

       pthread_mutex_lock(&lock);
        S[Idx++] = val;
        pthread_mutex_unlock(&lock);

}
void* new_thread(void* arg)
{
        int i;
int Trip = 0;
FILE *fd;
char *dev=(char *) arg;
int cnt, rcnt;
int ll = 0;
int ii; 
int val;

int song;

printf("%s\n", dev);  
                song =  1024 *1024 * (1+Skip);


        if( (fd = fopen(dev, "r")) < 0) {
                printf("can not open %s\n", dev);
                return(NULL);
        }; 

printf("%s fd=%d\n", dev, fileno(fd));


        for(cnt=0; cnt < Cnt; cnt++) {

val = cnt;

printf("** read %d from %s %d song %d\n", cnt, dev, Bcnt, ii);

Reg(val); 

                rcnt = fread(buf, 1, Bcnt, fd);
printf("-- read %d from %s %d song %d\n", cnt, dev, Bcnt, rcnt);
mypthread_yield();
 
Reg(-val);

                if( rcnt < Bcnt ) {
                        fseek(fd, 0, 0);
                        Trip++;
cnt--;
                };
 
  
                ii = ((rand() % 100)) * 1024 + 1024;
                ii += song;
                fseek(fd, ii, 1);



        };

        printf("Trip %d\n", Trip);
        Finish++;
        return(NULL); 
} 

main(argc, argv)
char *argv[];
{

        pthread_t thread;
                
        int i;
        int finish=2;

        if(argc > 1) Bcnt = atoi(argv[1]) * 1024;
        if(argc > 2) Cnt = atoi(argv[2]);
        if(argc > 3) Skip = atoi(argv[3]);
        if(argc > 3) finish = atoi(argv[3]);

        srand(1);

        pthread_mutex_init(&lock, NULL);

        printf("Original thread stack at %x\n", &i);
        if (pthread_create(&thread, NULL, new_thread, (void *)"/vmunix")) {
                printf("Error: creating new thread\n");
        }
        new_thread("/vmunix"); 


        {
                int aa;
                for(aa=0; aa < 0; aa++) printf("-- %d %d\n", aa, S[aa]);
        };
        exit(NULL);
}

