STATUS netJobAdd(FUNCPTR func, ARG param0, ARG param1, ARG param2, ARG param3, ARG param4) { int level, ringPut; NET_JOB_NODE node; /* Copy node */ node.func = func; node.args[0] = param0; node.args[1] = param1; node.args[2] = param2; node.args[3] = param3; node.args[4] = param4; /* Lock interrputs */ INT_LOCK(level); /* Put job on ring buffer */ ringPut = rngBufPut(netWorkRing, (char *) &node, sizeof(node)); /* Unlock interrupts */ INT_UNLOCK(level); if ( ringPut != sizeof(node) ) return ERROR; /* Wake up network task */ semGive(netTaskSemId); return OK; }
static void rootTask(long a0, long a1, long a2, long a3, long a4, long a5, long a6, long a7, long a8, long a9) { int j, res, k, chunks; const int putBytes = 10; const int nrChunks = 3; const int rngBytes = putBytes * nrChunks; char buffer[putBytes]; char bigBuffer[putBytes * 2 * nrChunks]; int bytesPut; int bytesGot; int expectedCounter = 0; int checkCounter = 0; RING_ID rng; char not_a_ring[32]; traceobj_enter(&trobj); ADD_CONTENT(buffer, sizeof(buffer), expectedCounter); rng = rngCreate(1); traceobj_assert(&trobj, rngIsEmpty(rng)); memset(buffer, 0, sizeof(buffer)); buffer[0] = 17; rngBufPut(rng, buffer, 1); traceobj_assert(&trobj, rngIsFull(rng)); rngBufGet(rng, buffer, 1); traceobj_assert(&trobj, rngIsEmpty(rng)); buffer[0] = 34; rngBufPut(rng, buffer, 1); traceobj_assert(&trobj, rngIsFull(rng)); expectedCounter = 0; rngDelete(rng); /* Here real vxWorks 6.6 just return ERROR */ memset(not_a_ring, 0, sizeof(not_a_ring)); errnoSet(0); res = rngBufPut((RING_ID) & not_a_ring[0], buffer, 1); traceobj_assert(&trobj, res == ERROR); /* rng = rngCreate(1 * 1024 * 1024 * 1024); traceobj_assert(&trobj, res == ERROR); traceobj_assert(&trobj, errnoGet() == S_memLib_NOT_ENOUGH_MEMORY); */ rng = rngCreate(rngBytes); traceobj_assert(&trobj, rng != 0); traceobj_assert(&trobj, rngIsEmpty(rng)); traceobj_assert(&trobj, !rngIsFull(rng)); /* Fill a few chunks */ for (chunks = 0; chunks < nrChunks; chunks++) { traceobj_assert(&trobj, rngNBytes(rng) == chunks * (int)sizeof(buffer)); traceobj_assert(&trobj, rngFreeBytes(rng) == rngBytes - chunks * (int)sizeof(buffer)); for (j = 0; j < (int)sizeof(buffer); j++) { buffer[j] = (char)j + (int)sizeof(buffer) * chunks; } ADD_CONTENT(buffer, sizeof(buffer), checkCounter); bytesPut = rngBufPut(rng, &buffer[0], sizeof(buffer)); traceobj_assert(&trobj, bytesPut == sizeof(buffer)); traceobj_assert(&trobj, !rngIsEmpty(rng)); traceobj_assert(&trobj, rngIsFull(rng) == (nrChunks - 1 == chunks)); traceobj_assert(&trobj, rngFreeBytes(rng) == rngBytes - bytesPut * (chunks + 1)); traceobj_assert(&trobj, rngNBytes(rng) == (chunks + 1) * (int)sizeof(buffer)); } traceobj_assert(&trobj, rngIsFull(rng)); ADD_CONTENT(buffer, sizeof(buffer), checkCounter); bytesPut = rngBufPut(rng, &buffer[0], sizeof(buffer)); traceobj_assert(&trobj, bytesPut == 0); traceobj_assert(&trobj, rngIsFull(rng)); /* Read chunks back and check content */ for (chunks = 0; chunks < nrChunks; chunks++) { memset(buffer, 0, sizeof(buffer)); traceobj_assert(&trobj, rngNBytes(rng) == (nrChunks - chunks) * (int)sizeof(buffer)); traceobj_assert(&trobj, rngFreeBytes(rng) == chunks * (int)sizeof(buffer)); bytesGot = rngBufGet(rng, &buffer[0], sizeof(buffer)); traceobj_assert(&trobj, bytesGot == (int)sizeof(buffer)); CHECK_CONTENT(buffer, bytesGot, expectedCounter); traceobj_assert(&trobj, !rngIsFull(rng)); traceobj_assert(&trobj, rngIsEmpty(rng) == (chunks == nrChunks - 1)); traceobj_assert(&trobj, rngFreeBytes(rng) == (chunks + 1) * (int)sizeof(buffer)); traceobj_assert(&trobj, rngNBytes(rng) == (nrChunks - chunks - 1) * (int)sizeof(buffer)); } /* Testing filling too many */ ADD_CONTENT(bigBuffer, sizeof(bigBuffer), checkCounter) bytesPut = rngBufPut(rng, &bigBuffer[0], sizeof(bigBuffer)); traceobj_assert(&trobj, bytesPut == rngBytes); traceobj_assert(&trobj, !rngIsEmpty(rng)); traceobj_assert(&trobj, rngIsFull(rng)); traceobj_assert(&trobj, rngFreeBytes(rng) == 0); traceobj_assert(&trobj, rngNBytes(rng) == rngBytes); /* Getting too many */ memset(bigBuffer, 0, sizeof(bigBuffer)); bytesGot = rngBufGet(rng, &bigBuffer[0], sizeof(bigBuffer)); traceobj_assert(&trobj, bytesGot == rngBytes); traceobj_assert(&trobj, rngIsEmpty(rng)); traceobj_assert(&trobj, !rngIsFull(rng)); traceobj_assert(&trobj, rngFreeBytes(rng) == rngBytes); traceobj_assert(&trobj, rngNBytes(rng) == 0); /* Now we need to adjust our expectedCounter */ expectedCounter += sizeof(buffer); CHECK_CONTENT(bigBuffer, bytesGot, expectedCounter); ADD_CONTENT(bigBuffer, sizeof(bigBuffer), checkCounter); bytesPut = rngBufPut(rng, &bigBuffer[0], sizeof(bigBuffer)); traceobj_assert(&trobj, bytesPut == rngBytes); rngFlush(rng); traceobj_assert(&trobj, rngIsEmpty(rng)); traceobj_assert(&trobj, !rngIsFull(rng)); traceobj_assert(&trobj, rngFreeBytes(rng) == rngBytes); traceobj_assert(&trobj, rngNBytes(rng) == 0); while (bytesGot > 0) { bytesGot = rngBufGet(rng, &bigBuffer[0], sizeof(bigBuffer)); CHECK_CONTENT(bigBuffer, bytesGot, expectedCounter); } rngDelete(rng); chunks = 10; rng = rngCreate(chunks); bytesPut = 5; traceobj_assert(&trobj, rngFreeBytes(rng) > bytesPut); checkCounter = 0xaa; expectedCounter = checkCounter; for (j = 0; j < bytesPut; j++) { rngPutAhead(rng, checkCounter, j); checkCounter++; } rngMoveAhead(rng, bytesPut); bytesGot = rngBufGet(rng, &bigBuffer[0], sizeof(bigBuffer)); traceobj_assert(&trobj, bytesGot == bytesPut); CHECK_CONTENT(bigBuffer, bytesGot, expectedCounter); /* Check also wrap-around */ bytesPut = chunks -2; traceobj_assert(&trobj, rngFreeBytes(rng) > bytesPut); checkCounter = 0xaa; expectedCounter = checkCounter; for (j = 0; j < bytesPut; j++) { rngPutAhead(rng, checkCounter, j); checkCounter++; } rngMoveAhead(rng, bytesPut); bytesGot = rngBufGet(rng, &bigBuffer[0], sizeof(bigBuffer)); traceobj_assert(&trobj, bytesGot == bytesPut); CHECK_CONTENT(bigBuffer, bytesGot, expectedCounter); rngDelete(rng); traceobj_exit(&trobj); }