b494ed5cbf
PR#19006: use the pkgsrc libjpeg instead of a local copy, and patch a bug in the serial device file descriptor handling. Also up the emulated "CPU idle" delay from 10ms to 100ms. For some reason the former saturates the CPU (on a Celeron 700 system), but with the latter the program idles at near 0%. This patch is probably not required for native threads. Mileage may vary...
167 lines
4.2 KiB
Text
167 lines
4.2 KiB
Text
$NetBSD: patch-ae,v 1.2 2003/01/05 03:31:25 dsainty Exp $
|
|
|
|
Without the first hunk of this patch, ROM transfers tend to not get very far
|
|
due to consistently lost characters.
|
|
|
|
The remainder corrects an assumption in the code that 0 is an invalid file
|
|
handle, and registers NetBSD-style tty device names.
|
|
|
|
--- SrcUnix/EmTransportSerialUnix.cpp.orig Sat Mar 30 01:11:19 2002
|
|
+++ SrcUnix/EmTransportSerialUnix.cpp Sun Nov 24 05:42:39 2002
|
|
@@ -220,7 +220,7 @@
|
|
// Programming Mini-Howto") says to turn off these for "raw" (as opposed to
|
|
// "canonical") mode.
|
|
|
|
- io.c_lflag &= ~(ICANON | ECHO | ISIG);
|
|
+ io.c_lflag &= ~(ICANON | ECHO | ISIG | IEXTEN);
|
|
|
|
// The UNIX Programming FAQ (<www://www.faqs.org/faqs/unix-faq/programmer/faq/>)
|
|
// recommends just setting all the c_iflags and c_oflags to zero.
|
|
@@ -541,6 +541,20 @@
|
|
#ifdef __QNXNTO__
|
|
results.push_back ("/dev/ser1");
|
|
results.push_back ("/dev/ser2");
|
|
+#elif __FreeBSD__
|
|
+ results.push_back ("/dev/pilot");
|
|
+ results.push_back ("/dev/cuaa0");
|
|
+ results.push_back ("/dev/cuaa1");
|
|
+ results.push_back ("/dev/cuaa2");
|
|
+ results.push_back ("/dev/cuaa3");
|
|
+#elif __NetBSD__
|
|
+ results.push_back ("/dev/pilot");
|
|
+ results.push_back ("/dev/tty00");
|
|
+ results.push_back ("/dev/tty01");
|
|
+ results.push_back ("/dev/tty02");
|
|
+ results.push_back ("/dev/tty03");
|
|
+ results.push_back ("/dev/ttyU0");
|
|
+ results.push_back ("/dev/ttyU1");
|
|
#else
|
|
results.push_back ("/dev/ttyS0");
|
|
results.push_back ("/dev/ttyS1");
|
|
@@ -596,9 +610,9 @@
|
|
EmHostTransportSerial::EmHostTransportSerial (void) :
|
|
fReadThread (NULL),
|
|
fWriteThread (NULL),
|
|
- fCommHandle (0),
|
|
- fCommSignalPipeA (0),
|
|
- fCommSignalPipeB (0),
|
|
+ fCommHandle (-1),
|
|
+ fCommSignalPipeA (-1),
|
|
+ fCommSignalPipeB (-1),
|
|
fTimeToQuit (false),
|
|
fDataMutex (),
|
|
fDataCondition (&fDataMutex),
|
|
@@ -626,9 +640,9 @@
|
|
{
|
|
EmAssert (fReadThread == NULL);
|
|
EmAssert (fWriteThread == NULL);
|
|
- EmAssert (fCommHandle == 0);
|
|
- EmAssert (fCommSignalPipeA == 0);
|
|
- EmAssert (fCommSignalPipeB == 0);
|
|
+ EmAssert (fCommHandle == -1);
|
|
+ EmAssert (fCommSignalPipeA == -1);
|
|
+ EmAssert (fCommSignalPipeB == -1);
|
|
}
|
|
|
|
|
|
@@ -662,9 +676,9 @@
|
|
|
|
fCommHandle = open(portName.c_str (), O_RDWR | O_NOCTTY | O_NDELAY);
|
|
|
|
- if (fCommHandle <= 0)
|
|
+ if (fCommHandle < 0)
|
|
{
|
|
- fCommHandle = 0;
|
|
+ fCommHandle = -1;
|
|
|
|
return errno;
|
|
}
|
|
@@ -694,7 +708,7 @@
|
|
|
|
ErrCode EmHostTransportSerial::CreateCommThreads (const EmTransportSerial::ConfigSerial& /*config*/)
|
|
{
|
|
- if (fCommHandle)
|
|
+ if (fCommHandle != -1)
|
|
{
|
|
PRINTF ("EmTransportSerial::HostOpen: Creating serial port handler threads...");
|
|
|
|
@@ -734,40 +748,41 @@
|
|
{
|
|
// If never created, nothing to destroy.
|
|
|
|
- if (!fCommSignalPipeA)
|
|
+ if (fCommSignalPipeA == -1)
|
|
return errNone;
|
|
|
|
// Signal the threads to quit.
|
|
|
|
- fDataMutex.lock ();
|
|
-
|
|
- fTimeToQuit = true;
|
|
-
|
|
- int dummy = 0;
|
|
- write (fCommSignalPipeB, &dummy, sizeof (dummy)); // Signals CommRead.
|
|
-
|
|
- fDataCondition.broadcast (); // Signals CommWrite.
|
|
- fDataMutex.unlock ();
|
|
+ if((fCommSignalPipeA != -1) && (fCommSignalPipeB != -1))
|
|
+ {
|
|
+ fDataMutex.lock();
|
|
|
|
- // Wait for the threads to quit.
|
|
+ fTimeToQuit = true;
|
|
|
|
- if (fReadThread)
|
|
- {
|
|
- fReadThread->join (NULL);
|
|
- fWriteThread->join (NULL);
|
|
- }
|
|
+ int dummy = 0;
|
|
+ write(fCommSignalPipeB, &dummy, sizeof (dummy)); // Signals CommRead.
|
|
|
|
- // Thread objects delete themselves, so set our references to NULL.
|
|
+ fDataCondition.broadcast(); // Signals CommWrite.
|
|
+ fDataMutex.unlock();
|
|
|
|
- fReadThread = NULL;
|
|
- fWriteThread = NULL;
|
|
+ // Wait for the threads to quit.
|
|
|
|
- // Close the signal pipe.
|
|
+ if (fReadThread)
|
|
+ {
|
|
+ fReadThread->join (NULL);
|
|
+ fWriteThread->join (NULL);
|
|
+ }
|
|
|
|
- close (fCommSignalPipeA);
|
|
- close (fCommSignalPipeB);
|
|
+ // Thread objects delete themselves, so set our references to NULL.
|
|
+ fReadThread = NULL;
|
|
+ fWriteThread = NULL;
|
|
+
|
|
+ // Close the signal pipe.
|
|
+ close (fCommSignalPipeA);
|
|
+ close (fCommSignalPipeB);
|
|
|
|
- fCommSignalPipeA = fCommSignalPipeB = 0;
|
|
+ fCommSignalPipeA = fCommSignalPipeB = -1;
|
|
+ }
|
|
|
|
return errNone;
|
|
}
|
|
@@ -787,9 +802,11 @@
|
|
|
|
ErrCode EmHostTransportSerial::CloseCommPort (void)
|
|
{
|
|
- (void) close (fCommHandle);
|
|
-
|
|
- fCommHandle = 0;
|
|
+ if(fCommHandle != -1)
|
|
+ {
|
|
+ int result = close(fCommHandle);
|
|
+ fCommHandle = -1;
|
|
+ }
|
|
|
|
return errNone;
|
|
}
|