/** * Reads lines from a file and inputs it into a global buffer * * @param file path * @return NULL */ void *thread_read_with_mutex(void *params) { FILE *fp; char *line; size_t length; ssize_t read; char *file; t_thread_parameters *p; p = (t_thread_parameters *)params; file = malloc(sizeof(strlen(p->file))); strcpy(file, p->file); fp = fopen (file, "r"); if (fp != NULL) { read = getline (&line, &length, fp); while (read > -1) { usleep (p->sleep_time); if (read > 1) { while (buff_full()) { printf("fill thread: could not write -- not enough space\n"); } printf ("fill thread: writing into buffer\n"); sem_wait (&lock); buff_write (line); read = getline (&line, &length, fp); sem_post (&lock); } } while (buff_full()) { printf("fill thread: could not write -- not enough space\n"); } sem_wait (&lock); printf ("fill thread: writing [QUIT] into buffer\n"); buff_write ("QUIT"); sem_post (&lock); } fclose (fp); printf("fill thread: quitting\n"); return NULL; }
/** * Reads lines from a file and inputs it into a global buffer * * @param file path * @return NULL */ void *thread_read_with_condition_variables (void *params) { FILE *fp; char *line; size_t length; ssize_t read; char *file; t_thread_parameters *p; p = (t_thread_parameters *)params; file = malloc(sizeof(strlen(p->file))); strcpy(file, p->file); fp = fopen (file, "r"); if (fp != NULL) { read = getline (&line, &length, fp); while (read > -1) { usleep (p->sleep_time); if (read > 1) { sem_wait (&space_available); sem_wait (&lock); printf ("fill thread: writing into buffer\n"); buff_write (line); read = getline (&line, &length, fp); sem_post (&lock); sem_post (&items_available); } } sem_wait (&space_available); sem_wait (&lock); printf ("fill thread: writing [QUIT] into buffer\n"); buff_write ("QUIT"); sem_post (&lock); sem_post (&items_available); } fclose (fp); printf("fill thread: quitting\n"); return NULL; }
void httpsession_write(struct event *ev,int what, void *d) { HttpSession *session = (HttpSession *)d; Buff *buff=session->response; int len=0; if(buff_len(buff)>0 ) { len=buff_write(session->fd,buff,buff_len(buff)); if(len<0) { if(errno == EAGAIN) { return; } } if(buff_len(buff)==0 ) httpserver_session_free( session); } }
void httpsession_file_write(struct event *ev,int what, void *d) { HttpSession *session = (HttpSession *)d; Buff *buff=session->response; int file_fd=session->file_fd; int len=0; /*here is most send http head or fail with EAGAIN*/ if(buff_len(buff)>0 ) { len=buff_write(session->fd,buff,buff_len(buff)); if(len<0) { if(errno == EAGAIN) { return; } } } while(1) { buff_set_startpos( buff,0); /*read file*/ do { len=buff_read(file_fd,buff,buff_tail_left(buff)); if(len == 0 ) { httpserver_session_free( session); return; } if(len == -1) { if(errno == EAGAIN) { continue; } TraceErr("read file fail:%s\n",strerror(errno)); httpserver_session_free( session); return ; } }while(0); session->total_read+=len; /*send out*/ len=buff_write(session->fd,buff,buff_len(buff)); if(len<0) { /*socket buff full,try again*/ if(errno == EAGAIN) { return; } /*error free session*/ TraceErr("session write:FAIL\n"); httpserver_session_free( session); break; } //printf("session write:%u\n",len); } }