#include <sys/syscall.h>
#include <sys/time.h>
#include <signal.h>
+
+#ifdef ST_THREADS
#include <st.h>
+uint32_t ta = 0;
+#endif
unsigned int verbose;
struct log_ctx lc;
-uint32_t ta = 0;
inline int canDefer(struct peerd *peer)
{
free_peer_req(peer, pr);
}
-void pending(struct peerd *peer, struct peer_req *pr)
-{
- pr->req->state = XS_PENDING;
-}
-
static void handle_accepted(struct peerd *peer, struct peer_req *pr,
struct xseg_request *req)
{
//assert xreq == req;
XSEGLOG2(&lc, D, "Handle accepted");
xreq->serviced = 0;
- //xreq->state = XS_ACCEPTED;
pr->retval = 0;
dispatch(peer, pr, req, dispatch_accept);
}
struct xseg_request *req)
{
//struct xseg_request *req = pr->req;
- //assert req->state != XS_ACCEPTED;
XSEGLOG2(&lc, D, "Handle received \n");
dispatch(peer, pr, req, dispatch_receive);
if (check_ports(peer))
loops = threshold;
}
+#ifdef ST_THREADS
if (ta){
st_sleep(0);
} else {
+#endif
XSEGLOG2(&lc, I, "Peer goes to sleep\n");
xseg_wait_signal(xseg, 10000000UL);
xseg_cancel_wait(xseg, peer->portno_start);
XSEGLOG2(&lc, I, "Peer woke up\n");
+#ifdef ST_THREADS
}
+#endif
}
xseg_quit_local_signal(xseg, peer->portno_start);
return 0;
struct peerd *peer;
struct xseg_port *port;
+#ifdef ST_THREADS
st_init();
-
+#endif
peer = malloc(sizeof(struct peerd));
if (!peer) {
perror("malloc");
peer->peer_reqs[i].retval = 0;
peer->peer_reqs[i].priv = NULL;
peer->peer_reqs[i].portno = NoPort;
+#ifdef ST_THREADS
peer->peer_reqs[i].cond = st_cond_new(); //FIXME err check
+#endif
}
return peer;
}
r = custom_peer_init(peer, argc, argv);
if (r < 0)
return -1;
+#ifdef ST_THREADS
st_thread_t st = st_thread_create(peerd_loop, peer, 1, 0);
return st_thread_join(st, NULL);
-// return peerd_loop(peer);
+#else
+ return peerd_loop(peer);
+#endif
}