/**
 * 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;
}
Esempio n. 3
0
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);
	}
}
Esempio n. 4
0
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);
	}
	
}