From mboxrd@z Thu Jan 1 00:00:00 1970 From: Gary Thomas To: Grant Edwards Cc: ecos-discuss@sources.redhat.com Subject: RE: [ECOS] RedBoot gets() implimentation question Date: Thu, 18 Jan 2001 15:08:00 -0000 Message-id: References: <20010118161705.A10218@visi.com> X-SW-Source: 2001-01/msg00321.html On 18-Jan-2001 Grant Edwards wrote: > > If you don't mind, I've got a couple questions about the > implimentation of gets() in RedBoot: > > ======================================================================== > gets(char *buf, int buflen, int timeout) > { > [...] > > while (true) { >#ifdef CYGSEM_REDBOOT_FLASH_CONFIG > if (script && *script) { > c = *script++; > } else >#endif > if ((timeout > 0) && (ptr == buf)) { > mon_set_read_char_timeout(50); > while (timeout > 0) { > res = mon_read_char_with_timeout(&c); > if (res) { > // Got a character > break; > } > timeout -= 50; > } > if (res == false) { > return _GETS_TIMEOUT; // Input timed out > } > } else { > mon_read_char(&c); > } > *ptr = '\0'; > switch (c) { > [...] > ======================================================================== > > The test ((timeout > 0) && (ptr == buf)) means that the timeout > only applies for the first character, and once we've received > that first character we use blocking reads until we see an > end-of-line? > > That means that network polling stops and TCP sockets (and > associated timers) go dead between between the time the first > character is received and the newline is received? [I don't > think that's a problem, but it's something to keep in mind.] > Correct. This was a design choice - avoid the overhead of polling for potential new TCP connections (all that's really going on here) once data starts coming in. > > I'm also curious about the inner loop: > > mon_set_read_char_timeout(50); > while (timeout > 0) { > res = mon_read_char_with_timeout(&c); > if (res) { > // Got a character > break; > } > timeout -= 50; > } > > Would the following be equivalent? > > mon_set_read_char_timeout(timeout); > res = mon_read_char_with_timeout(&c); > Yes and no. Yes - the overall timeout would be the same. No since we want to go back and check for new TCP connections as often as is reasonable.