--- deliantra/server/socket/loop.C 2007/05/28 21:22:26 1.49 +++ deliantra/server/socket/loop.C 2007/07/01 04:08:14 1.54 @@ -32,8 +32,6 @@ * maintanance (checking for lost connections and if data has arrived.) */ -#define BG_SCRUB_RATE 4 // how often to send a face in the background - #include #include #include @@ -49,8 +47,10 @@ #include -#define MAX_QUEUE_DEPTH 500 //TODO -#define MAX_QUEUE_BACKLOG 3. //TODO +#define BG_SCRUB_RATE 4 // how often to send a face in the background + +#define MAX_QUEUE_DEPTH 500 +#define MAX_QUEUE_BACKLOG 3. void client::reset_state () @@ -65,7 +65,7 @@ void client::queue_command (packet_type *handler, char *data, int datalen) { - tstamp stamp = now (); + tstamp stamp = NOW; if (cmd_queue.size () >= MAX_QUEUE_DEPTH) { @@ -93,7 +93,7 @@ { command &cmd = cmd_queue.front (); - if (cmd.stamp + MAX_QUEUE_BACKLOG < now ()) + if (cmd.stamp + MAX_QUEUE_BACKLOG < NOW) { reset_state (); send_packet_printf ("drawinfo %d ignoring delayed commands.", NDI_RED); @@ -125,11 +125,6 @@ void doeric_server (void) { -#ifdef CS_LOGSTATS - if ((time (NULL) - cst_lst.time_start) >= CS_LOGTIME) - write_cs_stats (); -#endif - //TODO: should not be done here, either for (unsigned i = 0; i < clients.size (); ++i) { @@ -159,18 +154,19 @@ (unsigned long) last_weight, WEIGHT (pl->ob)); } - draw_client_map (pl->ob); + draw_client_map (pl); if (update_look) - esrv_draw_look (pl->ob); + esrv_draw_look (pl); - if (askface.empty () && !partial_face_ofs) + if (ixface.empty ()) { // regularly send a new face when queue is empty if (bg_scrub && !--bg_scrub && enable_bg_scrub) while (scrub_idx < faces.size () - 1) { ++scrub_idx; + if (!faces_sent [scrub_idx]) { send_face (scrub_idx); @@ -192,60 +188,58 @@ int avail = rate_avail; - // if we can split images, transfer up to mss packets if possible - // but never more 768 bytes more. + // if we can split images, transfer up to mss-sized packets if possible + // but never 768 bytes more. if (fxix) avail += min (768, mss - (ol % mss)); bg_scrub = BG_SCRUB_RATE; while (avail > 0) { - if (partial_face_ofs) + ixsend &ix = ixface.back (); + + if (facedata *d = face_data (ix.idx, faceset)) { - if (facedata *d = face_data (partial_face, faceset)) + if (fxix) { - // 9 bytes is enough for fx_FFFOOO, 40 leaves some room - int chunk = min (min (avail - 40, MAXSOCKBUF - 9), partial_face_ofs); + // 9 bytes is enough for fx_FFFOOO, 40 leaves some room for image data + int chunk = min (min (avail - 40, MAXSOCKBUF - 9), ix.ofs); if (chunk <= 0) break; - partial_face_ofs -= chunk; + ix.ofs -= chunk; packet sl ("ix"); - sl << ber32 (partial_face) - << ber32 (partial_face_ofs) - << data (d->data.data () + partial_face_ofs, chunk); + sl << ber32 (ix.idx) + << ber32 (ix.ofs) + << data (d->data.data () + ix.ofs, chunk); send_packet (sl); } else - partial_face_ofs = 0; - } - else if (!askface.empty ()) - { - // use a lifo to send most recently requested images - faceidx facenum = askface.back (); - askface.pop_back (); - - if (fxix) { - if (facedata *d = face_data (facenum, faceset)) - { - partial_face = facenum; - partial_face_ofs = d->data.size (); - } + send_image (ix.idx); + ix.ofs = 0; } - else - send_image (facenum); } else - break; + ix.ofs = 0; int consumed = ol - outputbuffer_len (); + avail -= consumed; rate_avail -= consumed; + + ol = outputbuffer_len (); + + if (!ix.ofs) + { + ixface.pop_back (); + if (ixface.empty ()) + break; + } } } }