fix progress bar deadlock
This commit is contained in:
		
							parent
							
								
									bd92bc47f2
								
							
						
					
					
						commit
						b3ddb92786
					
				
					 4 changed files with 1036 additions and 2 deletions
				
			
		
							
								
								
									
										3
									
								
								client.c
									
										
									
									
									
								
							
							
						
						
									
										3
									
								
								client.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -419,6 +419,7 @@ int main(int argc, const char *argv[]){
 | 
			
		|||
 | 
			
		||||
    init_bench_data();
 | 
			
		||||
    if(parse_arg(argc,argv) < 0) return EXIT_FAILURE;
 | 
			
		||||
    ready_progress_bar();
 | 
			
		||||
 | 
			
		||||
    err = getsockaddrbyname(AF_INET,SOCK_STREAM,0,cmd_args.server_name,(struct sockaddr *)&addr);
 | 
			
		||||
    if (err != 0){
 | 
			
		||||
| 
						 | 
				
			
			@ -480,6 +481,6 @@ int main(int argc, const char *argv[]){
 | 
			
		|||
        fprintf(stdout,"operation: %lf us/op\n",avg / 1000.0);
 | 
			
		||||
        fprintf(stdout,"resolution: %ld sec %ld ns\n",bench.resolution.tv_sec,bench.resolution.tv_nsec);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    quit_progress_bar();
 | 
			
		||||
    return retval;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -6,6 +6,9 @@
 | 
			
		|||
#include<unistd.h>
 | 
			
		||||
#include<termio.h>
 | 
			
		||||
#include<pthread.h>
 | 
			
		||||
#include<stdlib.h>
 | 
			
		||||
#include<unistd.h>
 | 
			
		||||
#include<fcntl.h>
 | 
			
		||||
 | 
			
		||||
#include "display_bar.h"
 | 
			
		||||
#include "timerhelper.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -25,15 +28,34 @@ enum{
 | 
			
		|||
 | 
			
		||||
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
 | 
			
		||||
static raw_progress_bar_t scrolled = 1;
 | 
			
		||||
static int tty_fd = STDIN_FILENO;
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
static int deadlock = 0;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void ready_progress_bar(){
 | 
			
		||||
    fflush(stdout);
 | 
			
		||||
    if(!isatty(STDIN_FILENO)){
 | 
			
		||||
        char * buf = ctermid(NULL);
 | 
			
		||||
        tty_fd = open(buf,O_RDONLY);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void lock_scrolled(){
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
    deadlock++;
 | 
			
		||||
    if (deadlock > 1)
 | 
			
		||||
    {
 | 
			
		||||
        fprintf(stderr,"deadlock occur\n");
 | 
			
		||||
        exit(EXIT_FAILURE);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
    pthread_mutex_lock(&mutex);
 | 
			
		||||
}
 | 
			
		||||
void unlock_scrolled(){
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
    deadlock--;
 | 
			
		||||
#endif
 | 
			
		||||
    pthread_mutex_unlock(&mutex);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -75,7 +97,10 @@ void RawDisplayProgressBar(raw_progress_bar_t bar,size_t offset,size_t total,con
 | 
			
		|||
    }//optimization.
 | 
			
		||||
    //if ioctl failed? what should i do...
 | 
			
		||||
    ioctl(STDIN_FILENO,TIOCGWINSZ,(char *)&wnd_size);
 | 
			
		||||
    if (wnd_size.ws_row < pos) return;
 | 
			
		||||
    if (wnd_size.ws_row < pos){
 | 
			
		||||
        unlock_scrolled();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    fprintf(stdout,"\x1b[%dA[%s]: %.2f%% %s bytes: %ld/%ld \x1b[%dB\r",pos,buf,cur_progress,filename,total,offset,pos);
 | 
			
		||||
    fflush(stdout);
 | 
			
		||||
    unlock_scrolled();
 | 
			
		||||
| 
						 | 
				
			
			@ -115,4 +140,10 @@ void DisplayProgressBar(progress_bar_t * bar,size_t offset,size_t total,const ch
 | 
			
		|||
    }
 | 
			
		||||
    bar->last_update = ts;
 | 
			
		||||
    RawDisplayProgressBar(bar->bar,offset,total,filename);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void quit_progress_bar(){
 | 
			
		||||
    if(tty_fd != STDIN_FILENO){
 | 
			
		||||
        close(tty_fd);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -13,6 +13,8 @@ void unlock_scrolled();
 | 
			
		|||
 | 
			
		||||
void ready_progress_bar();
 | 
			
		||||
 | 
			
		||||
void quit_progress_bar();
 | 
			
		||||
 | 
			
		||||
void add_scrolled_unlocked(unsigned int i);
 | 
			
		||||
 | 
			
		||||
raw_progress_bar_t create_raw_progress_bar();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										1000
									
								
								testdata/dlist.txt
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1000
									
								
								testdata/dlist.txt
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
		Loading…
	
	Add table
		
		Reference in a new issue