Beispiel #1
0
 void
 worker_waiting (worker *worker)
 {
     assert (worker);
     //  Queue to broker and service waiting lists
     m_waiting.push_back(worker);
     worker->m_service->m_waiting.push_back(worker);
     worker->m_expiry = s_clock () + HEARTBEAT_EXPIRY;
     // Attempt to process outstanding requests
     service_dispatch (worker->m_service, 0);
 }
Beispiel #2
0
int main (int argc, char *argv[])
{
	int s_sockfd, c_sockfd;
	struct sockaddr_in s_addr;
	fd_set read_fds, test_fds;
	int fd, read_result;

	s_sockfd = socket (AF_INET, SOCK_STREAM, 0);

	s_addr.sin_family = AF_INET;
	s_addr.sin_addr.s_addr = htonl (INADDR_ANY);
	s_addr.sin_port = htons (SERVER_PORT);

	bind(s_sockfd, (struct sockaddr*) &s_addr, sizeof (s_addr));

	listen(s_sockfd, 5);

	FD_ZERO (&read_fds);
	FD_SET (s_sockfd, &read_fds);

	while (1){
		test_fds = read_fds;
		select (FD_SETSIZE, &test_fds, NULL, NULL, NULL);

		for (fd = 0; fd < FD_SETSIZE; fd++)
		{
			if ( !FD_ISSET(fd, &test_fds))
				continue;

			if ( fd == s_sockfd)
			{
				c_sockfd = accept(s_sockfd, NULL, NULL);
				FD_SET(c_sockfd, &read_fds);
			}
			else
			{
				ioctl(fd, FIONREAD, &read_result);
				if ( read_result == 0)
				{
					close(fd);
					FD_CLR(fd, &read_fds);
				}
			      else
			       	{
					service_dispatch(fd);
				}
			}
		}
	}
}
Beispiel #3
0
   void
   client_process (std::string sender, zmsg *msg)
   {
       assert (msg && msg->parts () >= 2);     //  Service name + body

       std::string service_name = (char *)msg->pop_front().c_str();
       service *srv = service_require (service_name);
       //  Set reply return address to client sender
       msg->wrap (sender.c_str(), "");
       if (service_name.length() >= 4
       &&  service_name.find_first_of("mmi.") == 0) {
           service_internal (service_name, msg);
       } else {
           service_dispatch (srv, msg);
       }
   }
Beispiel #4
0
static void *worker(void *p) {
	struct worker_param *wp = (struct worker_param *)p;
	struct watcher *watcher = wp->watcher;
	struct queue *q = 0;
	while (!watcher->quit) {
		q = service_dispatch(&wp->monitor, q);
		if (!q) {
			pthread_mutex_lock(&watcher->mutex);
			++watcher->sleep;
			if (!watcher->quit)
				pthread_cond_wait(&watcher->cond, &watcher->mutex);
			--watcher->sleep;
			pthread_mutex_unlock(&watcher->mutex);
		}
	}
	return 0;
}
Beispiel #5
0
static krb5_boolean
service_fds(krb5_context context, struct select_state *selstate,
            time_ms interval, struct conn_state *conns,
            struct select_state *seltemp, const krb5_data *realm,
            int (*msg_handler)(krb5_context, const krb5_data *, void *),
            void *msg_handler_data, struct conn_state **winner_out)
{
    int e, selret = 0;
    time_ms endtime;
    struct conn_state *state;

    *winner_out = NULL;

    e = get_curtime_ms(&endtime);
    if (e)
        return TRUE;
    endtime += interval;

    e = 0;
    while (selstate->nfds > 0) {
        e = cm_select_or_poll(selstate, get_endtime(endtime, conns),
                              seltemp, &selret);
        if (e == EINTR)
            continue;
        if (e != 0)
            break;

        if (selret == 0)
            /* Timeout, return to caller.  */
            return FALSE;

        /* Got something on a socket, process it.  */
        for (state = conns; state != NULL; state = state->next) {
            int ssflags;

            if (state->fd == INVALID_SOCKET)
                continue;
            ssflags = cm_get_ssflags(seltemp, state->fd);
            if (!ssflags)
                continue;

            if (service_dispatch(context, realm, state, selstate, ssflags)) {
                int stop = 1;

                if (msg_handler != NULL) {
                    krb5_data reply = make_data(state->in.buf, state->in.pos);

                    stop = (msg_handler(context, &reply, msg_handler_data) != 0);
                }

                if (stop) {
                    *winner_out = state;
                    return TRUE;
                }
            }
        }
    }
    if (e != 0)
        return TRUE;
    return FALSE;
}