Author: eliot Date: 2010-08-20 11:36:50 -0700 (Fri, 20 Aug 2010) New Revision: 2256
Modified: branches/Cog/platforms/Cross/vm/sq.h branches/Cog/platforms/Cross/vm/sqTicker.c branches/Cog/platforms/unix/vm/sqUnixHeartbeat.c Log: Hack-fix ODBC remote connection failure on linux by not prodding the high-pri thread if there are o high-priority tickees. More fall-out of the lack of thread priorities on linux.
Modified: branches/Cog/platforms/Cross/vm/sq.h =================================================================== --- branches/Cog/platforms/Cross/vm/sq.h 2010-08-19 02:43:25 UTC (rev 2255) +++ branches/Cog/platforms/Cross/vm/sq.h 2010-08-20 18:36:50 UTC (rev 2256) @@ -138,6 +138,9 @@ void ioUpdateVMTimezone(); void ioSynchronousCheckForEvents(); void checkHighPriorityTickees(usqLong); +# if ITIMER_HEARTBEAT /* Hack; allow heartbeat to avoid */ +extern int numAsyncTickees; /* prodHighPriorityThread unless necessary */ +# endif /* see platforms/unix/vm/sqUnixHeartbeat.c */ void ioGetClockLogSizeUsecsIdxMsecsIdx(sqInt*,void**,sqInt*,void**,sqInt*); #endif
Modified: branches/Cog/platforms/Cross/vm/sqTicker.c =================================================================== --- branches/Cog/platforms/Cross/vm/sqTicker.c 2010-08-19 02:43:25 UTC (rev 2255) +++ branches/Cog/platforms/Cross/vm/sqTicker.c 2010-08-20 18:36:50 UTC (rev 2256) @@ -137,7 +137,10 @@ } }
-static int numAsyncTickees = 0; +#if !ITIMER_HEARTBEAT /* Hack; allow heartbeat to avoid */ +static /* prodHighPriorityThread unless necessary */ +# endif /* see platforms/unix/vm/sqUnixHeartbeat.c */ +int numAsyncTickees = 0; static Tickee async[NUM_ASYNCHRONOUS_TICKEES];
/* Add or remove an asynchronous tickee. If periodms is non zero add the
Modified: branches/Cog/platforms/unix/vm/sqUnixHeartbeat.c =================================================================== --- branches/Cog/platforms/unix/vm/sqUnixHeartbeat.c 2010-08-19 02:43:25 UTC (rev 2255) +++ branches/Cog/platforms/unix/vm/sqUnixHeartbeat.c 2010-08-20 18:36:50 UTC (rev 2256) @@ -309,7 +309,17 @@ else heartbeats += 1; #if ITIMER_HEARTBEAT - { void prodHighPriorityThread(void); prodHighPriorityThread(); } + /* While we use SA_RESTART to ensure system calls are restarted, this is + * not universally effective. In particular, connect calls can abort if + * a system call is made in the signal handler, i.e. the pthread_kill in + * prodHighPriorityThread. So we avoid this if possible by not prodding + * the high-priority thread unless there are high-priority tickees as + * indicated by numAsyncTickees > 0. + */ + if (numAsyncTickees > 0) { + void prodHighPriorityThread(void); + prodHighPriorityThread(); + } #else checkHighPriorityTickees(utcMicrosecondClock); #endif
vm-dev@lists.squeakfoundation.org