2010/10/22 Juan Pablo L. <jpablolorenze...@hotmail.com>

>  hi, this is the code that makes the server socket
>
>     // create the server socket and return the file descriptor
>     fd = tcp_server_listerner_new(new_server->configurations,&error);
>     if(fd < 0)
>     {
>         g_error("Could not create listener, server creation aborted:
> %s",error->message);
>         g_error_free(error);
>         return NULL;
>     }
>
>     // create the GIOChannel for the server socket
>     new_server->socket = g_io_channel_unix_new(fd);
>     // set the encoding safe to read binary data on the server GIOChannel
>     g_io_channel_set_encoding(new_server->socket,NULL,NULL);
>
>    // create a source for connection events on the server socket
>     new_server->event_source =
> g_io_create_watch(new_server->socket,G_IO_IN|G_IO_PRI|G_IO_ERR|G_IO_HUP|G_IO_NVAL);
>     // set the callback function to handle connection events
>
> g_source_set_callback(new_server->event_source,(GSourceFunc)tcp_server_handle_connection_events,new_server,NULL);
>     // attach the server socket connection event source to the server
> context
>     g_source_attach(new_server->event_source,new_server->context);
>
>    new_server->main_loop = g_main_loop_new(new_server->context,FALSE);
>
> and this is how i run the main loop:
>
> void tcp_server_run(GMTCPServer *p_server)
> {
>     // run the main loop now
>     g_main_loop_run(p_server->main_loop);
>
>     g_thread_exit(NULL);
> }
>
> this method is run from the main thread like this:
>
> gm_tcp_server->server_thread =
> g_thread_create((GThreadFunc)tcp_server_run,gm_tcp_server,TRUE,/*&error*/NULL);
>
> and this is how i create the server socket:
>
> int tcp_server_listerner_new(const Configurations *p_configurations,GError
> **p_error)
> {
>     int fd;
>     struct sockaddr_in servAddr;
>     int set_option = 1;
>
>     // create the socket
>     fd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
>     if(fd < 0)
>     {
>         *p_error =
> g_error_new(G_IO_CHANNEL_ERROR,G_IO_CHANNEL_ERROR_FAILED,"Could not create
> server socket: %s",strerror(errno));
>         return -1;
>     }
>     // set some options on the socket
>     fcntl(fd,F_SETFL,O_NONBLOCK);// set the socket non-blocking
>
> setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&set_option,sizeof(set_option));//
> reuse address
>
> setsockopt(fd,SOL_SOCKET,SO_KEEPALIVE,&set_option,sizeof(set_option));//
> send keep alive messages
>
>     // construct local address structure
>     memset(&servAddr,0x00, sizeof(servAddr));
>     servAddr.sin_family = AF_INET;
>     servAddr.sin_addr.s_addr =
> inet_addr(p_configurations->tcp_server.interface);
>     servAddr.sin_port = htons(p_configurations->tcp_server.port);
>     // Bind to the local address
>     if(bind(fd,(struct sockaddr*)&servAddr,sizeof(servAddr)) < 0)
>     {
>         *p_error =
> g_error_new(G_IO_CHANNEL_ERROR,G_IO_CHANNEL_ERROR_FAILED,"Could not bind
> server socket: %s",strerror(errno));
>         // close the socket
>         close(fd);
>         return -1;
>     }
>     if(listen(fd,10) < 0)
>     {
>         *p_error =
> g_error_new(G_IO_CHANNEL_ERROR,G_IO_CHANNEL_ERROR_FAILED,"Could not start
> listening on the server socket: %s",strerror(errno));
>         // close the socket
>         close(fd);
>         return -1;
>     }
>
>     return fd;
> }
>
>
> thanks !
>
>
> ------------------------------
> Date: Fri, 22 Oct 2010 00:06:08 -0200
> Subject: Re: poll with timeout 0 in main loop
> From: maginot.jun...@gmail.com
> To: jpablolorenze...@hotmail.com
> CC: gtk-app-devel-list@gnome.org
>
>
>
> On Thu, Oct 21, 2010 at 11:27 PM, Juan Pablo L. <
> jpablolorenze...@hotmail.com> wrote:
>
>
> Hi, i have a problem with an application i m building with glib-2.24.2 on
> linux, i create a server socket which i use to create a GIOChannel and add
> it to a main loop, everything was fine until i found that the application
> consumes 99.8% of the CPU while waiting for connections (doing nothing else
> just sitting there waiting for connections) and it gets even worse as new
> connections come in because i create a new loop in each connection (i create
> a thread for each connection) to deal with the incoming packages and each
> connection has N handlers to process the requests, each handler has its main
> loop for asynchronous communication between them and the connection thread
> that owns the handlers, so i did a strace and found out that the time out
> being passed to poll is 0 so for each iteration the poll returns inmediatly
> therefore i m stuck with a busy wait in all main loops, so i have read the
> documentation trying to find out how to modify this bahaviour but i could
> find nothing ab
>  out it, can you please tell me why this is happenning ?? thanks!
>
> _______________________________________________
> gtk-app-devel-list mailing list
> gtk-app-devel-list@gnome.org
> http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
>
>
>
> Can you post an snipt of your code?
>
> And if you started a Thread and a loop inside it, it will stay interacting
> if you don't stop it, this will consume CPU for sure. I think you must work
> with signals or interrupts, I'm not sure about GIOChannel, maybe a snipt
> would clear a bit.
>
> [ ]'s
>
>
> --
> Maginot Júnior
> LPIC 1 - LPIC 2 - LPIC 3 -  CCNA - CLA - Forensics Analyst
>
>
>



okay,
and when it interacts again the main loop it starts another thread, like
doing this all the time ? How is this flow controlled?
its looking like an closed loop you are mading there...

everytime tcp_server_run(GMTCPServer *p_server);  it starts the main loop
which starts tcp_server_run again, and again, and so on?




[] 's


--
Maginot Júnior
LPIC 1 - LPIC 2 - LPIC 3 -  CCNA - CLA - Forensics Analyst
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to