Hello,

I first time use embedded loop and maybe something I do not know,  

What i do: test sends one http-request per second
But i have a problem because CPU load avarage 100%,  as well as a permanent 
calls poll() and gettimeofday()     
if I comment on all the places where ev_io_start includes for socket a timer is 
working properly.       
How can I correct this situation ?
Thank you.

//test

#define host "pod.tst.eu"
#define port 80
#define HTTP_REQ_SZ 512
#define HTTP_RES_SZ 1024

int sock; // now only one socket but in the future i would like use pool sockets

ev_embed embed;
ev_io reader, writer;
ev_timer timer;

struct ev_loop *loop;
struct ev_loop *fds_loop;

char request[HTTP_REQ_SZ];
char response[HTTP_RES_SZ];

static const char * http = "GET %s HTTP/1.1\r\nHost: %s:%d\r\n\r\n";

static void read_cb (EV_P_ ev_io *w, int revents)
{
   int rlen = read(w->fd, response, HTTP_REQ_SZ);
   ev_io_stop  (EV_A_ w);
   //ev_io_start (fds_loop, &writer); // switch on in the timeer_cb()
}

static void write_cb (EV_P_ ev_io *w, int revents)
{
  int len = snprintf(request, HTTP_REQ_SZ, http, "/",  host, port);
  int wlen = write(w->fd, request, len);
  if (wlen < 0)
  {
        perror("write");
        exit(0);
  }
  ev_io_stop (EV_A_ w);
  ev_io_start (fds_loop, &reader);
}

static void timer_cb (EV_P_ ev_timer *w, int revents)
{
   puts("tick");
   ev_io_start (fds_loop, &writer);
}


int main (int argc, char* argv[])
{
  init_addr(host, port);
  if( !( loop = ev_default_loop(0) ) ) {
        puts( "ev_default_loop() failed." );
        exit(1);
  }

  if( !( fds_loop = ev_loop_new(EVBACKEND_KQUEUE) ) ) {
        puts( "ev_default_loop() failed." );
        exit(1);
  }
  else
  {
        ev_embed_init (&embed, 0, fds_loop);
        ev_embed_start (loop, &embed);
  }

  int sock = do_connect();
  setnonblock(sock);

  ev_io_init (&writer, write_cb, sock, EV_WRITE);
  ev_io_start (fds_loop, &writer);

  ev_io_init (&reader, read_cb, sock, EV_READ);
  ev_io_set (&reader, sock, EV_READ);

  ev_timer_init (&timer, timer_cb, 1., 1.);
  ev_timer_start (loop, &timer);

  ev_loop(loop, 0);
  return 0;
}

// EO Code



// truss - tracing

poll({3/POLLIN 5/POLLIN},2,957)                  = 1 (0x1)
gettimeofday({1239362888.409526 },0x0)           = 0 (0x0)
gettimeofday({1239362888.409564 },0x0)           = 0 (0x0)
.....................
poll({3/POLLIN 5/POLLIN},2,2)                    = 1 (0x1)
gettimeofday({1239362888.408608 },0x0)           = 0 (0x0)
write(1,"tick\n",5)                              = 5 (0x5)
kevent(5,{0x6,EVFILT_READ,EV_DELETE,0,0x0,0x0 
0x6,EVFILT_WRITE,EV_ADD,0,0x0,0x0},2,{0x6,EVFILT_WRITE,0x0,0,0x8218,0x0},64,{0.000000000
 }) = 1 (0x1)
gettimeofday({1239362888.408810 },0x0)           = 0 (0x0)
write(6,"GET / HTTP/1.1\r\nHost: qa.rambl"...,42) = 42 (0x2a)
kevent(5,{0x6,EVFILT_WRITE,EV_DELETE,0,0x0,0x0 
0x6,EVFILT_READ,EV_ADD,0,0x0,0x0},2,{},64,{0.000000000 }) = 0 (0x0)
gettimeofday({1239362888.408971 },0x0)           = 0 (0x0)
gettimeofday({1239362888.409010 },0x0)           = 0 (0x0)
poll({3/POLLIN 5/POLLIN},2,957)                  = 1 (0x1)
gettimeofday({1239362888.409261 },0x0)           = 0 (0x0)
kevent(5,{},0,{0x6,EVFILT_READ,0x0,0,0x16a,0x0},64,{0.000000000 }) = 1 (0x1)
gettimeofday({1239362888.409358 },0x0)           = 0 (0x0)
read(6,"HTTP/1.1 200 OK\r\nServer: nginx"...,512) = 362 (0x16a)
gettimeofday({1239362888.409441 },0x0)           = 0 (0x0)
poll({3/POLLIN 5/POLLIN},2,957)                  = 1 (0x1)
gettimeofday({1239362888.409526 },0x0)           = 0 (0x0)
gettimeofday({1239362888.409564 },0x0)           = 0 (0x0)
............................................
poll({3/POLLIN 5/POLLIN},2,957)                  = 1 (0x1)
gettimeofday({1239362888.409526 },0x0)           = 0 (0x0)
gettimeofday({1239362888.409564 },0x0)           = 0 (0x0)
 



 


_______________________________________________
libev mailing list
[email protected]
http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev

Reply via email to