Changed semantics of stream, more IO limiting code.

This commit is contained in:
Michael Jumper
2010-09-11 01:02:15 -07:00
parent a1124923f2
commit e05a2e5f79
3 changed files with 35 additions and 39 deletions

View File

@@ -133,7 +133,7 @@ public class GuacamoleClient extends Client {
try { try {
// While we're blocking, or input is available // While we're blocking, or input is available
do { for (;;) {
// If past threshold, resize buffer before reading // If past threshold, resize buffer before reading
if (usedLength > buffer.length/2) { if (usedLength > buffer.length/2) {
@@ -176,14 +176,13 @@ public class GuacamoleClient extends Client {
} }
} while (input.ready()); // End read loop } // End read loop
} }
catch (IOException e) { catch (IOException e) {
throw new GuacamoleException(e); throw new GuacamoleException(e);
} }
return null;
} }
} }

View File

@@ -57,7 +57,6 @@ function VNCClient(display) {
var cursorHotspotX = 0; var cursorHotspotX = 0;
var cursorHotspotY = 0; var cursorHotspotY = 0;
// FIXME: Make object. Clean up. // FIXME: Make object. Clean up.
var cursorRectX = 0; var cursorRectX = 0;
var cursorRectY = 0; var cursorRectY = 0;
@@ -282,6 +281,7 @@ function VNCClient(display) {
} }
var clipboardHandler = null; var clipboardHandler = null;
var requests = 0;
this.setClipboardHandler = function(handler) { this.setClipboardHandler = function(handler) {
clipboardHandler = handler; clipboardHandler = handler;
@@ -290,28 +290,20 @@ function VNCClient(display) {
function handleResponse(xmlhttprequest) { function handleResponse(xmlhttprequest) {
var startOffset = null; var nextRequest = null;
function startNextRequest() {
nextRequest = makeRequest();
}
// Start next request in 2 seconds.
setTimeout(startNextRequest, 2000);
var instructionStart = 0; var instructionStart = 0;
var startIndex = 0; var startIndex = 0;
// Make request for next before it's too late
var nextRequest = null;
if (xmlhttprequest.readyState >= 2)
nextRequest = makeRequest();
function parseResponse() { function parseResponse() {
// Make request the moment we receive headers
// If the event handler isn't set by the time headers are available, we will
// already have made this request.
if (xmlhttprequest.readyState == 2) {
if (nextRequest == null)
nextRequest = makeRequest();
startOffset = 0;
}
// Parse stream when data is received and when complete. // Parse stream when data is received and when complete.
if (xmlhttprequest.readyState == 3 || if (xmlhttprequest.readyState == 3 ||
xmlhttprequest.readyState == 4) { xmlhttprequest.readyState == 4) {
@@ -357,7 +349,8 @@ function VNCClient(display) {
if (isConnected()) { if (isConnected()) {
delete xmlhttprequest; delete xmlhttprequest;
handleResponse(nextRequest); if (nextRequest)
handleResponse(nextRequest);
} }
break; break;
@@ -375,21 +368,21 @@ function VNCClient(display) {
} }
}; }
xmlhttprequest.onreadystatechange = parseResponse; xmlhttprequest.onreadystatechange = parseResponse;
// Handle what we have so far.
parseResponse(); parseResponse();
} }
function makeRequest() { function makeRequest() {
// Download self // Download self
var xmlhttprequest = new XMLHttpRequest(); var xmlhttprequest = new XMLHttpRequest();
xmlhttprequest.open("GET", "instructions"); xmlhttprequest.open("GET", "instructions");
xmlhttprequest.send(null);
xmlhttprequest.send(null);
return xmlhttprequest; return xmlhttprequest;
} }
@@ -555,7 +548,7 @@ function VNCClient(display) {
var message = new GuacamoleMessage(connect_xmlhttprequest.responseXML); var message = new GuacamoleMessage(connect_xmlhttprequest.responseXML);
if (!message.hasErrors()) { if (!message.hasErrors()) {
setState(STATE_WAITING); setState(STATE_WAITING);
handleResponse(makeRequest()); // Start stream if connection successful handleResponse(makeRequest());
} }
else else
handleErrors(message); handleErrors(message);

View File

@@ -65,11 +65,6 @@ void guac_close(GUACIO* io) {
ssize_t __guac_write(GUACIO* io, const char* buf, int count) { ssize_t __guac_write(GUACIO* io, const char* buf, int count) {
struct timeval start, end; struct timeval start, end;
suseconds_t elapsed;
suseconds_t required_usecs;
struct timespec required_sleep;
int retval; int retval;
/* Write and time how long the write takes (microseconds) */ /* Write and time how long the write takes (microseconds) */
@@ -82,18 +77,27 @@ ssize_t __guac_write(GUACIO* io, const char* buf, int count) {
if (io->transfer_limit > 0) { if (io->transfer_limit > 0) {
suseconds_t elapsed;
suseconds_t required_usecs;
/* Get elapsed time */ /* Get elapsed time */
elapsed = (end.tv_sec - start.tv_sec) * 1000000 + end.tv_usec - start.tv_usec; elapsed = (end.tv_sec - start.tv_sec) * 1000000 + end.tv_usec - start.tv_usec;
/* Sleep as necessary */ /* Calculate how much time we must sleep */
required_usecs = retval * 1000 / io->transfer_limit; /* useconds at 128 k/s*/ required_usecs = retval * 1000 / io->transfer_limit - elapsed; /* useconds at transfer_limit KB/s*/
required_sleep.tv_sec = required_usecs / 1000000;
required_sleep.tv_nsec = (required_usecs % 1000000) * 1000; /* Sleep as necessary */
nanosleep(&required_sleep, NULL); if (required_usecs > 0) {
struct timespec required_sleep;
required_sleep.tv_sec = required_usecs / 1000000;
required_sleep.tv_nsec = (required_usecs % 1000000) * 1000;
nanosleep(&required_sleep, NULL);
}
/* Get new elapsed time */
gettimeofday(&end, NULL);
elapsed = (end.tv_sec - start.tv_sec) * 1000000 + end.tv_usec - start.tv_usec;
} }
return retval; return retval;