add comment
This commit is contained in:
parent
aeb60a7537
commit
ad881333e0
@ -24,9 +24,13 @@ bool isatty_file(FILE * file);
|
||||
|
||||
//After calling ready_progress_bar, you must use following functions on print.
|
||||
void myd_perror(const char * msg);
|
||||
//argument `line` is number of newline created by argument `msg`.
|
||||
/*argument `line` is number of newline created by argument `msg`.
|
||||
* thread-safe
|
||||
*/
|
||||
int myd_vfprintf(int line,FILE * f,const char * msg,va_list arg);
|
||||
//argument `line` is number of newline created by argument `msg`.
|
||||
/*argument `line` is number of newline created by argument `msg`.
|
||||
* thread-safe
|
||||
*/
|
||||
int myd_fprintf(int line,FILE * f,const char * msg, ...);
|
||||
|
||||
|
||||
|
23
server.c
23
server.c
@ -250,6 +250,9 @@ int send_response(int sock,int fd, uint8_t * buf, size_t bufsize){
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
/** print help message
|
||||
* arg `n`: executable name
|
||||
*/
|
||||
const char * help(const char * n){
|
||||
const char * msg = "USASE : %s [Option] ...\n"
|
||||
"Options and arguments: \n"
|
||||
@ -259,7 +262,8 @@ const char * help(const char * n){
|
||||
printf(msg,n);
|
||||
return msg;
|
||||
}
|
||||
/** return 0 ok. otherwise invalid format*/
|
||||
/** parse arguments.
|
||||
* if return 0, success. otherwise arguments are invalid format.*/
|
||||
int parse_args(int argc,const char * argv[] , in_port_t * port){
|
||||
int pos = 1;
|
||||
const char * opt;
|
||||
@ -274,7 +278,7 @@ int parse_args(int argc,const char * argv[] , in_port_t * port){
|
||||
const char * value = argv[pos++];
|
||||
*port = atoi(value);
|
||||
if (port == 0){ // either not number or zero
|
||||
fprintf(stderr,"argument is either not number or zero\n");
|
||||
fprintf(stderr,"port argument is either not number or zero\n");
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
@ -302,11 +306,10 @@ typedef struct SharedState{
|
||||
//empty if less than 0
|
||||
queue_struct(int,WORK_QUEUE_SIZE) socks;
|
||||
#ifdef USE_TRACE
|
||||
queue_struct(struct timespec,WORK_QUEUE_SIZE) trace_timer;
|
||||
queue_struct(struct timespec,WORK_QUEUE_SIZE) trace_timer; //sock timer for TRACE
|
||||
#endif
|
||||
pthread_mutex_t sock_mutex;
|
||||
pthread_mutex_t sock_mutex;//mutex for queue
|
||||
pthread_cond_t ready;
|
||||
//int progress[MAX_THREAD_NUMBER];
|
||||
} shared_state_t;
|
||||
|
||||
void init_shared_state(shared_state_t * state) {
|
||||
@ -437,6 +440,7 @@ int main(int argc, const char *argv[]){
|
||||
int bufsize;
|
||||
int i = 0;
|
||||
in_port_t binding_port_number = SERVER_PORT;
|
||||
//parse argument
|
||||
if (argc > 1){
|
||||
int d = parse_args(argc,argv,&binding_port_number);
|
||||
if(d != 0 ) return d;
|
||||
@ -446,6 +450,7 @@ int main(int argc, const char *argv[]){
|
||||
#ifdef USE_TRACE
|
||||
report_resolution();
|
||||
#endif
|
||||
//create socket
|
||||
sock = socket(AF_INET,SOCK_STREAM,0);
|
||||
atexit(safe_exit);
|
||||
if(sock < 0){
|
||||
@ -460,6 +465,7 @@ int main(int argc, const char *argv[]){
|
||||
}
|
||||
bufsize = getBufferSizeFrom(sock);
|
||||
#ifndef USE_NO_QUEUE
|
||||
//initialize shared_state and create worker thread.
|
||||
init_shared_state(&globalState);
|
||||
for (i = 0; i < MAX_THREAD_NUMBER; i++) {
|
||||
worker_argument_t * args = create_worker_argument(i,bufsize);
|
||||
@ -470,6 +476,7 @@ int main(int argc, const char *argv[]){
|
||||
pthread_create(&worker_threads[i],NULL,worker_proc,args);
|
||||
}
|
||||
#endif
|
||||
//bind socket.
|
||||
addr.sin_addr.s_addr = htonl(INADDR_ANY); /*0.0.0.0 모든 네트워크 인터페이스에 묶임.*/
|
||||
addr.sin_family = AF_INET;
|
||||
addr.sin_port = htons(binding_port_number);
|
||||
@ -504,11 +511,11 @@ int main(int argc, const char *argv[]){
|
||||
if (queue_isfull(&globalState.socks)){
|
||||
pthread_mutex_unlock(&globalState.sock_mutex);
|
||||
#ifdef _GNU_SOURCE
|
||||
pthread_yield();
|
||||
pthread_yield();//yield for other thread and process.
|
||||
#else
|
||||
usleep(400);
|
||||
usleep(400); //alternative for `pthread_yield`, but this could occur 'busy waiting' by implementation.
|
||||
#endif
|
||||
continue;
|
||||
continue;//retry to enqueue `csock`.
|
||||
}
|
||||
else {
|
||||
enqueue(&globalState.socks,csock);
|
||||
|
@ -25,15 +25,11 @@ struct ReadOp{
|
||||
struct TransferResult{
|
||||
int16_t res;
|
||||
int16_t error_msg_size;
|
||||
int64_t file_size; /**/
|
||||
int64_t file_size;
|
||||
int32_t err_number; /*errno*/
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
#ifdef USE_GETADDRINFO
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* find buffer size from sock
|
||||
* thread safe
|
||||
|
Loading…
Reference in New Issue
Block a user