From 0f0a8cbbe5f5bc29c9e1fb2e8590157c05e47606 Mon Sep 17 00:00:00 2001 From: Janet Anderson Date: Mon, 9 Mar 2015 12:34:42 -0500 Subject: [PATCH 1/6] Set version to 3.14.12.5-rc1 --- configure/CONFIG_BASE_VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure/CONFIG_BASE_VERSION b/configure/CONFIG_BASE_VERSION index 0d8dcb1db..4ff90c817 100644 --- a/configure/CONFIG_BASE_VERSION +++ b/configure/CONFIG_BASE_VERSION @@ -35,10 +35,10 @@ EPICS_PATCH_LEVEL = 5 # This will end in -DEV between official releases #EPICS_DEV_SNAPSHOT=-DEV #EPICS_DEV_SNAPSHOT=-pre1 -EPICS_DEV_SNAPSHOT=-pre1-DEV +#EPICS_DEV_SNAPSHOT=-pre1-DEV #EPICS_DEV_SNAPSHOT=-pre2 #EPICS_DEV_SNAPSHOT=-pre2-DEV -#EPICS_DEV_SNAPSHOT=-rc1 +EPICS_DEV_SNAPSHOT=-rc1 #EPICS_DEV_SNAPSHOT=-rc1-DEV #EPICS_DEV_SNAPSHOT=-rc2 #EPICS_DEV_SNAPSHOT=-rc2-DEV From 657f72652760414552f09a5cacfd5433acef577a Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Mon, 9 Mar 2015 14:24:44 -0500 Subject: [PATCH 2/6] Fix FIND_TOOL --- configure/CONFIG_BASE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure/CONFIG_BASE b/configure/CONFIG_BASE index c6cdaac6e..373b8311e 100644 --- a/configure/CONFIG_BASE +++ b/configure/CONFIG_BASE @@ -54,7 +54,7 @@ BASE_CPPFLAGS += $(OSITHREAD_DEFAULT_STACK_FLAGS_$(OSITHREAD_USE_DEFAULT_STACK)) # Where to find the installed build tools TOOLS = $(EPICS_BASE_HOST_BIN) -FIND_TOOL = $(firstword $(wildcard $$(TOOLS)/$(1) $(TOP)/src/tools/$(1))) +FIND_TOOL = $(firstword $(wildcard $(TOOLS)/$(1) $(TOP)/src/tools/$(1))) #--------------------------------------------------------------- # Epics base build tools and tool flags From e75ec5f85b7f65f3b7339567d4eb8908c3c747bc Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Mon, 9 Mar 2015 14:33:17 -0500 Subject: [PATCH 3/6] Set snapshot to -rc1-DEV --- configure/CONFIG_BASE_VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure/CONFIG_BASE_VERSION b/configure/CONFIG_BASE_VERSION index 4ff90c817..a0783bb06 100644 --- a/configure/CONFIG_BASE_VERSION +++ b/configure/CONFIG_BASE_VERSION @@ -38,8 +38,8 @@ EPICS_PATCH_LEVEL = 5 #EPICS_DEV_SNAPSHOT=-pre1-DEV #EPICS_DEV_SNAPSHOT=-pre2 #EPICS_DEV_SNAPSHOT=-pre2-DEV -EPICS_DEV_SNAPSHOT=-rc1 -#EPICS_DEV_SNAPSHOT=-rc1-DEV +#EPICS_DEV_SNAPSHOT=-rc1 +EPICS_DEV_SNAPSHOT=-rc1-DEV #EPICS_DEV_SNAPSHOT=-rc2 #EPICS_DEV_SNAPSHOT=-rc2-DEV #EPICS_DEV_SNAPSHOT= From 4568cd36165ff488c83453be23d77649617cbeed Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Tue, 10 Mar 2015 14:17:28 -0500 Subject: [PATCH 4/6] Chasing Jenkins instability on Windows --- src/libCom/test/epicsMessageQueueTest.cpp | 29 +++++++++++++++-------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/libCom/test/epicsMessageQueueTest.cpp b/src/libCom/test/epicsMessageQueueTest.cpp index 5b0f46490..4ffa9d90e 100644 --- a/src/libCom/test/epicsMessageQueueTest.cpp +++ b/src/libCom/test/epicsMessageQueueTest.cpp @@ -25,7 +25,8 @@ #include "testMain.h" static const char *msg1 = "1234567890This is a very long message."; -static volatile int testExit = 0; +static volatile int sendExit = 0; +static volatile int recvExit = 0; static epicsEventId finished; /* @@ -85,10 +86,10 @@ receiver(void *arg) for (sender = 1 ; sender <= 4 ; sender++) expectmsg[sender-1] = 1; - while (!testExit) { + while (!recvExit) { cbuf[0] = '\0'; len = q->receive(cbuf, sizeof cbuf, 2.0); - if (len < 0 && !testExit) { + if (len < 0 && !recvExit) { testDiag("receiver() received unexpected timeout"); ++errors; } @@ -104,10 +105,11 @@ receiver(void *arg) } for (sender = 1 ; sender <= 4 ; sender++) { if (expectmsg[sender-1] > 1) - testDiag("Sender %d -- %d messages", sender, expectmsg[sender-1]-1); + testDiag("Received %d messages from Sender %d", + expectmsg[sender-1]-1, sender); } testOk1(errors == 0); - testDiag("Receiver finished"); + testDiag("Receiver exiting"); epicsEventSignal(finished); } @@ -119,13 +121,13 @@ sender(void *arg) int len; int i = 0; - while (!testExit) { + while (!sendExit) { len = sprintf(cbuf, "%s -- %d.", epicsThreadGetNameSelf(), ++i); while (q->trySend((void *)cbuf, len) < 0) epicsThreadSleep(0.005 * (randBelow(5))); epicsThreadSleep(0.005 * (randBelow(20))); } - testDiag("%s exiting, sent %d messages", epicsThreadGetNameSelf(), i-1); + testDiag("%s exiting, sent %d messages", epicsThreadGetNameSelf(), i); } extern "C" void messageQueueTest(void *parm) @@ -279,9 +281,15 @@ extern "C" void messageQueueTest(void *parm) epicsThreadCreate("Sender 3", epicsThreadPriorityHigh, epicsThreadGetStackSize(epicsThreadStackMedium), sender, q1); epicsThreadCreate("Sender 4", epicsThreadPriorityHigh, epicsThreadGetStackSize(epicsThreadStackMedium), sender, q1); - epicsThreadSleep(60.0); + for (i = 0; i < 10; i++) { + testDiag("... %d", 10 - i); + epicsThreadSleep(6.0); + } - testExit = 1; + sendExit = 1; + epicsThreadSleep(1.0); + recvExit = 1; + testDiag("Scheduler exiting"); } MAIN(epicsMessageQueueTest) @@ -294,7 +302,8 @@ MAIN(epicsMessageQueueTest) epicsThreadGetStackSize(epicsThreadStackMedium), messageQueueTest, NULL); - epicsEventWait(finished); + epicsEventMustWait(finished); + testDiag("Main thread signalled"); epicsThreadSleep(1.0); return testDone(); From 753bfcc579cd0533d852f23daf0e8f8a871e1093 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Tue, 10 Mar 2015 18:14:11 -0500 Subject: [PATCH 5/6] Check sender threads are starting --- src/libCom/test/epicsMessageQueueTest.cpp | 66 +++++++++++++++-------- 1 file changed, 44 insertions(+), 22 deletions(-) diff --git a/src/libCom/test/epicsMessageQueueTest.cpp b/src/libCom/test/epicsMessageQueueTest.cpp index 4ffa9d90e..8d7daea05 100644 --- a/src/libCom/test/epicsMessageQueueTest.cpp +++ b/src/libCom/test/epicsMessageQueueTest.cpp @@ -28,6 +28,7 @@ static const char *msg1 = "1234567890This is a very long message."; static volatile int sendExit = 0; static volatile int recvExit = 0; static epicsEventId finished; +static unsigned int mediumStack; /* * In Numerical Recipes in C: The Art of Scientific Computing (William H. @@ -78,6 +79,7 @@ extern "C" void receiver(void *arg) { epicsMessageQueue *q = (epicsMessageQueue *)arg; + const char *myName = epicsThreadGetNameSelf(); char cbuf[80]; int expectmsg[4]; int len; @@ -97,7 +99,8 @@ receiver(void *arg) sender >= 1 && sender <= 4) { if (expectmsg[sender-1] != msgNum) { ++errors; - testDiag("%s received %d '%.*s' -- expected %d", epicsThreadGetNameSelf(), len, len, cbuf, expectmsg[sender-1]); + testDiag("%s received %d '%.*s' -- expected %d", + myName, len, len, cbuf, expectmsg[sender-1]); } expectmsg[sender-1] = msgNum + 1; epicsThreadSleep(0.001 * (randBelow(20))); @@ -109,7 +112,7 @@ receiver(void *arg) expectmsg[sender-1]-1, sender); } testOk1(errors == 0); - testDiag("Receiver exiting"); + testDiag("%s exiting", myName); epicsEventSignal(finished); } @@ -132,6 +135,7 @@ sender(void *arg) extern "C" void messageQueueTest(void *parm) { + epicsThreadId myThreadId = epicsThreadGetIdSelf(); unsigned int i; char cbuf[80]; int len; @@ -155,20 +159,23 @@ extern "C" void messageQueueTest(void *parm) len = q1->receive(cbuf, sizeof cbuf); testOk1(q1->pending() == 3); if (!testOk1((len == want) && (strncmp(msg1, cbuf, len) == 0))) - testDiag("wanted:%d '%.*s' got:%d '%.*s'", want, want, msg1, len, len, cbuf); + testDiag("wanted:%d '%.*s' got:%d '%.*s'", + want, want, msg1, len, len, cbuf); want++; len = q1->receive(cbuf, sizeof cbuf); testOk1(q1->pending() == 2); if (!testOk1((len == want) && (strncmp(msg1, cbuf, len) == 0))) - testDiag("wanted:%d '%.*s' got:%d '%.*s'", want, want, msg1, len, len, cbuf); + testDiag("wanted:%d '%.*s' got:%d '%.*s'", + want, want, msg1, len, len, cbuf); q1->trySend((void *)msg1, i++); want++; len = q1->receive(cbuf, sizeof cbuf); testOk1(q1->pending() == 2); if (!testOk1((len == want) && (strncmp(msg1, cbuf, len) == 0))) - testDiag("wanted:%d '%.*s' got:%d '%.*s'", want, want, msg1, len, len, cbuf); + testDiag("wanted:%d '%.*s' got:%d '%.*s'", + want, want, msg1, len, len, cbuf); q1->trySend((void *)msg1, i++); testOk1(q1->pending() == 3); @@ -178,7 +185,8 @@ extern "C" void messageQueueTest(void *parm) testOk(q1->pending() == i, "q1->pending() == %d", i); want++; if (!testOk1((len == want) & (strncmp(msg1, cbuf, len) == 0))) - testDiag("wanted:%d '%.*s' got:%d '%.*s'", want, want, msg1, len, len, cbuf); + testDiag("wanted:%d '%.*s' got:%d '%.*s'", + want, want, msg1, len, len, cbuf); } testOk1(q1->pending() == 0); @@ -196,20 +204,23 @@ extern "C" void messageQueueTest(void *parm) len = q1->receive(cbuf, sizeof cbuf); testOk1(q1->pending() == 3); if (!testOk1((len == want) && (strncmp(msg1, cbuf, len) == 0))) - testDiag("wanted:%d '%.*s' got:%d '%.*s'", want, want, msg1, len, len, cbuf); + testDiag("wanted:%d '%.*s' got:%d '%.*s'", + want, want, msg1, len, len, cbuf); want++; len = q1->receive(cbuf, sizeof cbuf); testOk1(q1->pending() == 2); if (!testOk1((len == want) && (strncmp(msg1, cbuf, len) == 0))) - testDiag("wanted:%d '%.*s' got:%d '%.*s'", want, want, msg1, len, len, cbuf); + testDiag("wanted:%d '%.*s' got:%d '%.*s'", + want, want, msg1, len, len, cbuf); q1->send((void *)msg1, i++, 1.0); want++; len = q1->receive(cbuf, sizeof cbuf); testOk1(q1->pending() == 2); if (!testOk1((len == want) && (strncmp(msg1, cbuf, len) == 0))) - testDiag("wanted:%d '%.*s' got:%d '%.*s'", want, want, msg1, len, len, cbuf); + testDiag("wanted:%d '%.*s' got:%d '%.*s'", + want, want, msg1, len, len, cbuf); q1->send((void *)msg1, i++, 1.0); testOk1(q1->pending() == 3); @@ -219,7 +230,8 @@ extern "C" void messageQueueTest(void *parm) testOk(q1->pending() == i, "q1->pending() == %d", i); want++; if (!testOk1((len == want) && (strncmp(msg1, cbuf, len) == 0))) - testDiag("wanted:%d '%.*s' got:%d '%.*s'", want, want, msg1, len, len, cbuf); + testDiag("wanted:%d '%.*s' got:%d '%.*s'", + want, want, msg1, len, len, cbuf); } testOk1(q1->pending() == 0); @@ -235,7 +247,8 @@ extern "C" void messageQueueTest(void *parm) testOk1(q1->pending() == 0); testDiag("Single receiver with invalid size, single sender tests:"); - epicsThreadCreate("Bad Receiver", epicsThreadPriorityMedium, epicsThreadGetStackSize(epicsThreadStackMedium), badReceiver, q1); + epicsThreadCreate("Bad Receiver", epicsThreadPriorityMedium, + mediumStack, badReceiver, q1); epicsThreadSleep(1.0); testOk(q1->send((void *)msg1, 10) == 0, "Send with waiting receiver"); epicsThreadSleep(2.0); @@ -243,8 +256,9 @@ extern "C" void messageQueueTest(void *parm) epicsThreadSleep(2.0); testDiag("Single receiver, single sender tests:"); - epicsThreadSetPriority(epicsThreadGetIdSelf(), epicsThreadPriorityHigh); - epicsThreadCreate("Receiver one", epicsThreadPriorityMedium, epicsThreadGetStackSize(epicsThreadStackMedium), receiver, q1); + epicsThreadSetPriority(myThreadId, epicsThreadPriorityHigh); + epicsThreadCreate("Receiver one", epicsThreadPriorityMedium, + mediumStack, receiver, q1); for (pass = 1 ; pass <= 3 ; pass++) { for (i = 0 ; i < 10 ; i++) { if (q1->trySend((void *)msg1, i) < 0) @@ -256,7 +270,7 @@ extern "C" void messageQueueTest(void *parm) case 1: if (i<6) testDiag(" priority-based scheduler, sent %d messages", i); - epicsThreadSetPriority(epicsThreadGetIdSelf(), epicsThreadPriorityLow); + epicsThreadSetPriority(myThreadId, epicsThreadPriorityLow); break; case 2: if (i<10) @@ -276,13 +290,21 @@ extern "C" void messageQueueTest(void *parm) */ testDiag("Single receiver, multiple sender tests:"); testDiag("This test lasts 60 seconds..."); - epicsThreadCreate("Sender 1", epicsThreadPriorityLow, epicsThreadGetStackSize(epicsThreadStackMedium), sender, q1); - epicsThreadCreate("Sender 2", epicsThreadPriorityMedium, epicsThreadGetStackSize(epicsThreadStackMedium), sender, q1); - epicsThreadCreate("Sender 3", epicsThreadPriorityHigh, epicsThreadGetStackSize(epicsThreadStackMedium), sender, q1); - epicsThreadCreate("Sender 4", epicsThreadPriorityHigh, epicsThreadGetStackSize(epicsThreadStackMedium), sender, q1); + testOk(!!epicsThreadCreate("Sender 1", epicsThreadPriorityLow, + mediumStack, sender, q1), + "Created Sender 1"); + testOk(!!epicsThreadCreate("Sender 2", epicsThreadPriorityMedium, + mediumStack, sender, q1), + "Created Sender 2"); + testOk(!!epicsThreadCreate("Sender 3", epicsThreadPriorityHigh, + mediumStack, sender, q1), + "Created Sender 3"); + testOk(!!epicsThreadCreate("Sender 4", epicsThreadPriorityHigh, + mediumStack, sender, q1), + "Created Sender 4"); for (i = 0; i < 10; i++) { - testDiag("... %d", 10 - i); + testDiag("... %2d", 10 - i); epicsThreadSleep(6.0); } @@ -294,13 +316,13 @@ extern "C" void messageQueueTest(void *parm) MAIN(epicsMessageQueueTest) { - testPlan(58); + testPlan(62); finished = epicsEventMustCreate(epicsEventEmpty); + mediumStack = epicsThreadGetStackSize(epicsThreadStackMedium); epicsThreadCreate("messageQueueTest", epicsThreadPriorityMedium, - epicsThreadGetStackSize(epicsThreadStackMedium), - messageQueueTest, NULL); + mediumStack, messageQueueTest, NULL); epicsEventMustWait(finished); testDiag("Main thread signalled"); From de298da94c44518ab7a259635fe07d03250b6b22 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Wed, 11 Mar 2015 10:53:37 -0500 Subject: [PATCH 6/6] Fix Jenkins instability on Windows --- src/tools/makeTestfile.pl | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/tools/makeTestfile.pl b/src/tools/makeTestfile.pl index a037eb71c..bdc0059d0 100644 --- a/src/tools/makeTestfile.pl +++ b/src/tools/makeTestfile.pl @@ -10,7 +10,7 @@ # The makeTestfile.pl script generates a file $target.t which is needed # because some versions of the Perl test harness can only run test scripts -# that are actually written in Perl. The script we generate execs the +# that are actually written in Perl. The script we generate runs the # real test program which must be in the same directory as the .t file. # If the script is given an argument -tap it sets HARNESS_ACTIVE in the # environment to make the epicsUnitTest code generate strict TAP output. @@ -23,12 +23,16 @@ use strict; my ($target, $exe) = @ARGV; +# Use system on Windows, exec doesn't work the same there and +# GNUmake thinks the test has finished as soon as Perl exits. +my $exec = $^O eq 'MSWin32' ? "system('./$exe') == 0" : "exec './$exe'"; + open(my $OUT, '>', $target) or die "Can't create $target: $!\n"; print $OUT <