23
23
#include <sys/wait.h>
27
26
hashset<pointer> socket_server_set;
31
socket_server_callback(void *obj, void *info) {
32
socket_server_rep* ss = (socket_server_rep*) obj;
27
void socket_server_callback (void *obj, void *info);
36
29
/******************************************************************************
37
30
* Constructors and destructors for socket_servers
60
53
return N (socket_server_set);
57
close_all_servers () {
59
iterator<pointer> it= iterate (socket_server_set);
61
socket_server_rep* ss= (socket_server_rep*) it->next();
63
// FIXME: cleanly close the connection to the socket here
63
70
/******************************************************************************
64
71
* Routines for socket_servers
65
72
******************************************************************************/
166
171
/******************************************************************************
167
* Listen to all active servers (may be optimized for speed)
172
* Call back for new information on server
168
173
******************************************************************************/
171
listen_to_servers () {
176
socket_server_callback (void *obj, void *info) {
172
177
#ifndef __MINGW32__
177
iterator<pointer> it= iterate (socket_server_set);
179
socket_server_rep* con= (socket_server_rep*) it->next();
181
FD_SET (con->server, &fds);
182
if (con->server >= max_fd) max_fd= con->server+1;
185
if (max_fd == 0) break;
179
socket_server_rep* ss = (socket_server_rep*) obj;
185
int max_fd= ss->server + 1;
186
FD_SET (ss->server, &rfds);
187
188
struct timeval tv;
190
int nr= select (max_fd, &fds, NULL, NULL, &tv);
191
ASSERT (nr != -1, "call to 'select' failed");
191
select (max_fd, &rfds, NULL, NULL, &tv);
194
it= iterate (socket_server_set);
196
socket_server_rep* con= (socket_server_rep*) it->next();
197
if (con->alive && FD_ISSET (con->server, &fds)) con->start_client ();
194
if (ss->alive && FD_ISSET (ss->server, &rfds)) {
195
//cout << "server_callback" << LF;
201
if (!is_nil (ss->feed_cmd) && news)
202
ss->feed_cmd->apply (); // call the data processor