#include <pthread.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <time.h>



#define MAX_SIZE 2000000









struct Data{

       char name[20];

       int value;

       };



Data *sort (Data *data , int numOfData)    ;           // insert sort using struct-datatype , ranked by the value)



 pthread_t tid1,tid2;

 pthread_mutex_t lock;



 int numOfData =0;

 FILE *rank;

 Data *data  = (Data*)malloc(sizeof(Data)*MAX_SIZE);                  // use struct datastructure ( char name[20] , int value)                        

 char nameData[20];       // two temp data for scanning from the file

 int valueData;  

 int count = 0;





void *rankP (void *param){                                         //   <------ pthread 



    while(!feof(rank)){ 

    pthread_mutex_lock(&lock);         



    if(fscanf(rank,"%s",nameData)== EOF)

    break;

    else      

    strcpy(data[numOfData].name,nameData);          

    fscanf(rank,"%d",&valueData);               // get  userID(%s) and userScore(%d)   

    data[numOfData].value = valueData;   

    numOfData++;            

    printf(" working ........  count = %d  \n",count++);



    pthread_mutex_unlock(&lock);

    

    }

    

}





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

    



    rank = fopen(argv[1],"r");

    time_t t1,t2;

    t1 = time(NULL);

    if(pthread_mutex_init(&lock, NULL) != 0)

    {

        printf("\n mutex init failed\n");

        return 1;

    }



    

    pthread_attr_t attr1 , attr2;  

    pthread_attr_init(&attr1);

    pthread_attr_init(&attr2);

    pthread_create(&tid1,&attr1,rankP,NULL);

    pthread_create(&tid2,&attr2,rankP,NULL);

    pthread_join(tid1,NULL);

    pthread_join(tid2,NULL);

    

    t2 = time(NULL);

    printf(" sorted after %d seconds \n", t2-t1);

    





    //  <----------------   parent process

    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");



     char ch[5];

     Data *t = sort(data,numOfData);   



    FILE *result = fopen(argv[2],"w");        // write in the data to file

    for(int i=0 ; i<=numOfData-1 ; i++){

            sprintf(ch,"%d",t[i].value);

            fprintf(result,t[i].name);

            fprintf(result,"\t");

            fprintf(result,ch);

            fprintf(result,"\n");

            

            

       