ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/socket/loop.C
(Generate patch)

Comparing deliantra/server/socket/loop.C (file contents):
Revision 1.61 by root, Tue Jul 24 04:55:35 2007 UTC vs.
Revision 1.65 by root, Sun Jul 29 02:24:34 2007 UTC

46 46
47#include <loader.h> 47#include <loader.h>
48 48
49#define BG_SCRUB_RATE 4 // how often to send a face in the background 49#define BG_SCRUB_RATE 4 // how often to send a face in the background
50 50
51#define MAX_QUEUE_DEPTH 500 51#define MAX_QUEUE_DEPTH 50
52#define MAX_QUEUE_BACKLOG 3. 52#define MAX_QUEUE_BACKLOG 3.
53 53
54void 54void
55client::reset_state () 55client::reset_state ()
56{ 56{
165 while (scrub_idx < faces.size () - 1) 165 while (scrub_idx < faces.size () - 1)
166 { 166 {
167 ++scrub_idx; 167 ++scrub_idx;
168 168
169 if (!faces_sent [scrub_idx]) 169 if (!faces_sent [scrub_idx])
170 if (faceinfo *f = face_info (scrub_idx))
171 if (f->type == FT_FACE) // only scrub faces for now
170 { 172 {
171 send_face (scrub_idx, -120); 173 send_face (scrub_idx, -120);
172 flush_fx (); 174 flush_fx ();
173 175
174 bg_scrub = 1; // send up to one face per tick, unless an image was requested 176 bg_scrub = 1; // send up to one face per tick, unless an image was requested
175 break; 177 break;
176 } 178 }
177 } 179 }
178 180
179 rate_avail = max_rate - outputbuffer_len (); 181 rate_avail = max_rate - outputbuffer_len ();
180 } 182 }
181 else if (!outq) // only send when bandwidth allows it 183 else
182 { 184 {
183 int ol = outputbuffer_len (); 185 int ol = outputbuffer_len ();
184 186
185 rate_avail = min (max_rate, rate_avail + max_rate); 187 rate_avail = min (max_rate + mss, rate_avail + max_rate);
188
189 int avail = rate_avail;
190
191 // if we can split images, round to next-lowest mss
192 if (fxix) avail -= avail % mss;
193
186 rate_avail -= ol; 194 rate_avail -= ol;
195 avail -= ol;
187 196
188 int avail = rate_avail; 197#if HAVE_TCP_INFO
189 198 // further restrict the available bandwidth by the excess bandwidth available
190 // if we can split images, transfer up to mss-sized packets if possible 199 avail = max (0, min (avail, (tcpi.tcpi_snd_cwnd - tcpi.tcpi_unacked + tcpi.tcpi_sacked) * mss));
191 // but never 768 bytes more. 200#endif
192 if (fxix) avail += min (768, mss - (ol % mss));
193 201
194 bg_scrub = BG_SCRUB_RATE; 202 bg_scrub = BG_SCRUB_RATE;
195 203
196 while (avail > 0) 204 while (avail > 0)
197 { 205 {
199 207
200 if (facedata *d = face_data (ix.idx, faceset)) 208 if (facedata *d = face_data (ix.idx, faceset))
201 { 209 {
202 if (fxix) 210 if (fxix)
203 { 211 {
212 // estimate the packet header overhead "ix " + idx + (new)ofs
213 int pktlen = 3 + ber32::encoded_size (ix.idx) + ber32::encoded_size (ix.ofs);
214 int chunk = min (avail - packet::hdrlen, MAXSOCKBUF) - pktlen;
215
204 // only transfer something if the amount of data transferred 216 // only transfer something if the amount of data transferred
205 // has a healthy relation to the header overhead 217 // has a healthy relation to the header overhead
206 if (avail <= 40) 218 if (chunk < 64)
207 break; 219 break;
208 220
209 // 9 bytes is enough for fx_FFFOOO 221 chunk = min (chunk, (int)ix.ofs);
210 int chunk = min (min (avail, MAXSOCKBUF - 9), (int)ix.ofs);
211
212 if (chunk <= 0)
213 break;
214 222
215 ix.ofs -= chunk; 223 ix.ofs -= chunk;
216 224
217 //fprintf (stderr, "i%dx %6d: %5d+%4d (%4d)\n", fxix, ix.idx,ix.ofs,chunk, ixface.size());//D 225 //fprintf (stderr, "i%dx %6d: %5d+%4d (%4d)\n", fxix, ix.idx,ix.ofs,chunk, ixface.size());//D
218 226

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines