static void exitLaterOnceFunc(void *raw) { int *status = raw; exitLaterStatus = *status; epicsThreadMustCreate("exitLater", epicsThreadPriorityLow, epicsThreadGetStackSize(epicsThreadStackSmall), &exitNow, NULL); }
/* Start one thread per CPU which will all try lock * the same spinlock. They break as soon as one * fails to take the lock. */ static void verifyTryLock() { int N, i; struct verifyTryLock verify; N = epicsThreadGetCPUs(); if(N==1) { testSkip(1, "verifyTryLock() only for SMP systems"); return; } verify.flag = 0; verify.spin = epicsSpinMustCreate(); testDiag("Starting %d spinners", N); verify.ents = calloc(N, sizeof(*verify.ents)); for(i=0; i<N; i++) { verify.ents[i].main = &verify; verify.ents[i].done = epicsEventMustCreate(epicsEventEmpty); epicsThreadMustCreate("verifyTryLockThread", 40, epicsThreadGetStackSize(epicsThreadStackSmall), verifyTryLockThread, &verify.ents[i]); } testDiag("All started"); for(i=0; i<N; i++) { epicsEventMustWait(verify.ents[i].done); epicsEventDestroy(verify.ents[i].done); } testDiag("All done"); testOk(verify.flag==1, "epicsTryLock returns %d (expect 1)", verify.flag); epicsSpinDestroy(verify.spin); free(verify.ents); }
static void testUDP(void) { caster_t caster; shSocket sender; osiSockAddr dest; union casterUDP buf; shSocketInit(&sender); sender.sd = shCreateSocket(AF_INET, SOCK_DGRAM, 0); if(sender.sd==INVALID_SOCKET) { testAbort("Failed to create socket"); return; } lock = epicsMutexMustCreate(); cycled[0] = epicsEventMustCreate(epicsEventEmpty); cycled[1] = epicsEventMustCreate(epicsEventEmpty); casterInit(&caster); caster.udpport = 0; /* test with random port */ caster.testhook = &testerhook; epicsThreadMustCreate("udptester", epicsThreadPriorityMedium, epicsThreadGetStackSize(epicsThreadStackSmall), &tester, &caster); epicsEventSignal(cycled[1]); /* wait for tester thread to setup socket */ epicsEventMustWait(cycled[0]); epicsMutexMustLock(lock); testOk1(caster.udpport!=0); testDiag("UDP test with port %d", caster.udpport); memset(&dest, 0, sizeof(dest)); dest.ia.sin_family = AF_INET; dest.ia.sin_addr.s_addr = htonl(INADDR_LOOPBACK); dest.ia.sin_port = htons(caster.udpport); epicsMutexUnlock(lock); /* allow tester thread to begin recv() */ epicsEventSignal(cycled[1]); testDiag("Test announcement directly from server"); memset(&buf, 0, sizeof(buf)); buf.m_msg.pid = htons(RECAST_MAGIC); buf.m_msg.serverIP = htonl(0xffffffff); buf.m_msg.serverPort = htons(0x1020); buf.m_msg.serverKey = htonl(0x12345678); testOk1(0==shSendTo(&sender, &buf.m_bytes, 0x10, 0, &dest)); /* wait for tester thread to completer recv() and end cycle */ epicsEventMustWait(cycled[0]); epicsMutexMustLock(lock); testOk1(cycles==1); testOk1(result==0); testOk1(caster.haveserv==1); testOk1(caster.nameserv.ia.sin_family==AF_INET); testOk1(caster.nameserv.ia.sin_addr.s_addr==htonl(INADDR_LOOPBACK)); testOk1(caster.nameserv.ia.sin_port==htons(0x1020)); testOk1(caster.servkey==0x12345678); epicsMutexUnlock(lock); testDiag("Test proxied announcement"); /* start next cycle */ epicsEventSignal(cycled[1]); /* wait for tester thread to setup socket */ epicsEventMustWait(cycled[0]); epicsMutexMustLock(lock); dest.ia.sin_port = htons(caster.udpport); epicsMutexUnlock(lock); buf.m_msg.serverIP = htonl(0x50607080); /* allow tester thread to begin recv() */ epicsEventSignal(cycled[1]); testOk1(0==shSendTo(&sender, &buf.m_bytes, 0x10, 0, &dest)); /* wait for tester thread to completer recv() and end cycle */ epicsEventMustWait(cycled[0]); epicsMutexMustLock(lock); testOk1(cycles==2); testOk1(result==0); testOk1(caster.haveserv==1); testOk1(caster.nameserv.ia.sin_family==AF_INET); testOk1(caster.nameserv.ia.sin_addr.s_addr==htonl(0x50607080)); testOk1(caster.nameserv.ia.sin_port==htons(0x1020)); epicsMutexUnlock(lock); /* begin shutdown cycle */ epicsEventSignal(cycled[1]); epicsEventMustWait(cycled[0]); epicsEventSignal(cycled[1]); casterShutdown(&caster); epicsEventDestroy(cycled[0]); epicsEventDestroy(cycled[1]); epicsMutexDestroy(lock); }