This commit is contained in:
QL 2019-06-19 11:21:18 -04:00
parent 708e19a2d3
commit 3e5d7dd041
6 changed files with 108 additions and 58 deletions

View File

@ -1,11 +1,11 @@
/** /**
* @file * @file
* @brief QUTEST port to POSIX * @brief QS/C QUTest port to POSIX
* @ingroup ports * @ingroup ports
* @cond * @cond
****************************************************************************** ******************************************************************************
* Last updated for version 6.5.1 * Last Updated for Version: 6.5.1
* Last updated on 2019-05-31 * Date of the Last Update: 2019-06-18
* *
* Q u a n t u m L e a P s * Q u a n t u m L e a P s
* ------------------------ * ------------------------
@ -41,7 +41,7 @@
#define _POSIX_C_SOURCE 200809L #define _POSIX_C_SOURCE 200809L
#ifndef Q_SPY #ifndef Q_SPY
#error "Q_SPY must be defined for QTEST application" #error "Q_SPY must be defined to compile qutest_port.c"
#endif /* Q_SPY */ #endif /* Q_SPY */
#define QP_IMPL /* this is QP implementation */ #define QP_IMPL /* this is QP implementation */
@ -68,7 +68,7 @@
#define QS_TX_SIZE (8*1024) #define QS_TX_SIZE (8*1024)
#define QS_RX_SIZE (2*1024) #define QS_RX_SIZE (2*1024)
#define QS_TX_CHUNK QS_TX_SIZE #define QS_TX_CHUNK QS_TX_SIZE
#define QS_IMEOUT_MS 10 #define QS_TIMEOUT_MS 10
#define INVALID_SOCKET -1 #define INVALID_SOCKET -1
#define SOCKET_ERROR -1 #define SOCKET_ERROR -1
@ -111,7 +111,7 @@ uint8_t QS_onStartup(void const *arg) {
} }
*dst = '\0'; /* zero-terminate hostName */ *dst = '\0'; /* zero-terminate hostName */
/* extract port_remote from 'arg' (hostName:port_remote)... */ /* extract serviceName from 'arg' (hostName:serviceName)... */
if (*src == ':') { if (*src == ':') {
serviceName = src + 1; serviceName = src + 1;
} }
@ -207,7 +207,7 @@ void QS_onReset(void) {
void QS_onFlush(void) { void QS_onFlush(void) {
uint16_t nBytes; uint16_t nBytes;
uint8_t const *data; uint8_t const *data;
static struct timespec const c_10ms = { 0, 10000000L }; static struct timespec const c_timeout = { 0, QS_TIMEOUT_MS*1000000L };
if (l_sock == INVALID_SOCKET) { /* socket NOT initialized? */ if (l_sock == INVALID_SOCKET) { /* socket NOT initialized? */
fprintf(stderr, "<TARGET> ERROR invalid TCP socket\n"); fprintf(stderr, "<TARGET> ERROR invalid TCP socket\n");
@ -220,10 +220,10 @@ void QS_onFlush(void) {
int nSent = send(l_sock, (char const *)data, (int)nBytes, 0); int nSent = send(l_sock, (char const *)data, (int)nBytes, 0);
if (nSent == SOCKET_ERROR) { /* sending failed? */ if (nSent == SOCKET_ERROR) { /* sending failed? */
if ((errno == EWOULDBLOCK) || (errno == EAGAIN)) { if ((errno == EWOULDBLOCK) || (errno == EAGAIN)) {
/* sleep for 10ms and then loop back /* sleep for the timeout and then loop back
* to send() the SAME data again * to send() the SAME data again
*/ */
nanosleep(&c_10ms, NULL); nanosleep(&c_timeout, NULL);
} }
else { /* some other socket error... */ else { /* some other socket error... */
fprintf(stderr, "<TARGET> ERROR sending data over TCP," fprintf(stderr, "<TARGET> ERROR sending data over TCP,"
@ -232,7 +232,7 @@ void QS_onFlush(void) {
} }
} }
else if (nSent < (int)nBytes) { /* sent fewer than requested? */ else if (nSent < (int)nBytes) { /* sent fewer than requested? */
nanosleep(&c_10ms, NULL); /* sleep for 10ms */ nanosleep(&c_timeout, NULL); /* sleep for the timeout */
/* adjust the data and loop back to send() the rest */ /* adjust the data and loop back to send() the rest */
data += nSent; data += nSent;
nBytes -= (uint16_t)nSent; nBytes -= (uint16_t)nSent;
@ -253,14 +253,14 @@ void QS_onTestLoop() {
QS_rxPriv_.inTestLoop = true; QS_rxPriv_.inTestLoop = true;
while (QS_rxPriv_.inTestLoop) { while (QS_rxPriv_.inTestLoop) {
struct timeval timeout = { struct timeval timeout = {
(long)0, (long)(QS_IMEOUT_MS * 1000) (long)0, (long)(QS_TIMEOUT_MS * 1000)
}; };
int nrec; int nrec;
FD_SET(l_sock, &readSet); FD_SET(l_sock, &readSet);
/* selective, timed blocking on the TCP/IP socket... */ /* selective, timed blocking on the TCP/IP socket... */
timeout.tv_usec = (long)(QS_IMEOUT_MS * 1000); timeout.tv_usec = (long)(QS_TIMEOUT_MS * 1000);
nrec = select(l_sock + 1, &readSet, nrec = select(l_sock + 1, &readSet,
(fd_set *)0, (fd_set *)0, &timeout); (fd_set *)0, (fd_set *)0, &timeout);
if (nrec < 0) { if (nrec < 0) {

View File

@ -4,8 +4,8 @@
* @ingroup ports * @ingroup ports
* @cond * @cond
****************************************************************************** ******************************************************************************
* Last updated for version 6.4.0 * Last Updated for Version: 6.5.1
* Last updated on 2019-02-10 * Date of the Last Update: 2019-06-18
* *
* Q u a n t u m L e a P s * Q u a n t u m L e a P s
* ------------------------ * ------------------------
@ -66,13 +66,14 @@
#define QS_TX_SIZE (8*1024) #define QS_TX_SIZE (8*1024)
#define QS_RX_SIZE (2*1024) #define QS_RX_SIZE (2*1024)
#define QS_TX_CHUNK QS_TX_SIZE #define QS_TX_CHUNK QS_TX_SIZE
#define QS_TIMEOUT_MS 10
#define INVALID_SOCKET -1 #define INVALID_SOCKET -1
#define SOCKET_ERROR -1 #define SOCKET_ERROR -1
/* local variables .........................................................*/ /* local variables .........................................................*/
static int l_sock = INVALID_SOCKET; static int l_sock = INVALID_SOCKET;
static struct timespec const c_10ms = { 0, 10000000L }; static struct timespec const c_timeout = { 0, QS_TIMEOUT_MS*1000000L };
/*..........................................................................*/ /*..........................................................................*/
uint8_t QS_onStartup(void const *arg) { uint8_t QS_onStartup(void const *arg) {
@ -106,7 +107,7 @@ uint8_t QS_onStartup(void const *arg) {
} }
*dst = '\0'; /* zero-terminate hostName */ *dst = '\0'; /* zero-terminate hostName */
/* extract port_remote from 'arg' (hostName:port_remote)... */ /* extract serviceName from 'arg' (hostName:serviceName)... */
if (*src == ':') { if (*src == ':') {
serviceName = src + 1; serviceName = src + 1;
} }
@ -198,6 +199,7 @@ void QS_onReset(void) {
void QS_onFlush(void) { void QS_onFlush(void) {
uint16_t nBytes; uint16_t nBytes;
uint8_t const *data; uint8_t const *data;
QS_CRIT_STAT_
if (l_sock == INVALID_SOCKET) { /* socket NOT initialized? */ if (l_sock == INVALID_SOCKET) { /* socket NOT initialized? */
fprintf(stderr, "<TARGET> ERROR invalid TCP socket\n"); fprintf(stderr, "<TARGET> ERROR invalid TCP socket\n");
@ -205,15 +207,17 @@ void QS_onFlush(void) {
} }
nBytes = QS_TX_CHUNK; nBytes = QS_TX_CHUNK;
QS_CRIT_ENTRY_();
while ((data = QS_getBlock(&nBytes)) != (uint8_t *)0) { while ((data = QS_getBlock(&nBytes)) != (uint8_t *)0) {
QS_CRIT_EXIT_();
for (;;) { /* for-ever until break or return */ for (;;) { /* for-ever until break or return */
int nSent = send(l_sock, (char const *)data, (int)nBytes, 0); int nSent = send(l_sock, (char const *)data, (int)nBytes, 0);
if (nSent == SOCKET_ERROR) { /* sending failed? */ if (nSent == SOCKET_ERROR) { /* sending failed? */
if ((errno == EWOULDBLOCK) || (errno == EAGAIN)) { if ((errno == EWOULDBLOCK) || (errno == EAGAIN)) {
/* sleep for 10ms and then loop back /* sleep for the timeout and then loop back
* to send() the SAME data again * to send() the SAME data again
*/ */
nanosleep(&c_10ms, NULL); nanosleep(&c_timeout, NULL);
} }
else { /* some other socket error... */ else { /* some other socket error... */
fprintf(stderr, "<TARGET> ERROR sending data over TCP," fprintf(stderr, "<TARGET> ERROR sending data over TCP,"
@ -222,7 +226,7 @@ void QS_onFlush(void) {
} }
} }
else if (nSent < (int)nBytes) { /* sent fewer than requested? */ else if (nSent < (int)nBytes) { /* sent fewer than requested? */
nanosleep(&c_10ms, NULL); /* sleep for 10ms */ nanosleep(&c_timeout, NULL); /* sleep for the timeout */
/* adjust the data and loop back to send() the rest */ /* adjust the data and loop back to send() the rest */
data += nSent; data += nSent;
nBytes -= (uint16_t)nSent; nBytes -= (uint16_t)nSent;
@ -233,7 +237,9 @@ void QS_onFlush(void) {
} }
/* set nBytes for the next call to QS_getBlock() */ /* set nBytes for the next call to QS_getBlock() */
nBytes = QS_TX_CHUNK; nBytes = QS_TX_CHUNK;
QS_CRIT_ENTRY_();
} }
QS_CRIT_EXIT_();
} }
/*..........................................................................*/ /*..........................................................................*/
QSTimeCtr QS_onGetTime(void) { QSTimeCtr QS_onGetTime(void) {
@ -250,6 +256,7 @@ QSTimeCtr QS_onGetTime(void) {
void QS_output(void) { void QS_output(void) {
uint16_t nBytes; uint16_t nBytes;
uint8_t const *data; uint8_t const *data;
QS_CRIT_STAT_
if (l_sock == INVALID_SOCKET) { /* socket NOT initialized? */ if (l_sock == INVALID_SOCKET) { /* socket NOT initialized? */
fprintf(stderr, "<TARGET> ERROR invalid TCP socket\n"); fprintf(stderr, "<TARGET> ERROR invalid TCP socket\n");
@ -257,15 +264,17 @@ void QS_output(void) {
} }
nBytes = QS_TX_CHUNK; nBytes = QS_TX_CHUNK;
QS_CRIT_ENTRY_();
if ((data = QS_getBlock(&nBytes)) != (uint8_t *)0) { if ((data = QS_getBlock(&nBytes)) != (uint8_t *)0) {
QS_CRIT_EXIT_();
for (;;) { /* for-ever until break or return */ for (;;) { /* for-ever until break or return */
int nSent = send(l_sock, (char const *)data, (int)nBytes, 0); int nSent = send(l_sock, (char const *)data, (int)nBytes, 0);
if (nSent == SOCKET_ERROR) { /* sending failed? */ if (nSent == SOCKET_ERROR) { /* sending failed? */
if ((errno == EWOULDBLOCK) || (errno == EAGAIN)) { if ((errno == EWOULDBLOCK) || (errno == EAGAIN)) {
/* sleep for 10ms and then loop back /* sleep for the timeout and then loop back
* to send() the SAME data again * to send() the SAME data again
*/ */
nanosleep(&c_10ms, NULL); nanosleep(&c_timeout, NULL);
} }
else { /* some other socket error... */ else { /* some other socket error... */
fprintf(stderr, "<TARGET> ERROR sending data over TCP," fprintf(stderr, "<TARGET> ERROR sending data over TCP,"
@ -274,7 +283,7 @@ void QS_output(void) {
} }
} }
else if (nSent < (int)nBytes) { /* sent fewer than requested? */ else if (nSent < (int)nBytes) { /* sent fewer than requested? */
nanosleep(&c_10ms, NULL); /* sleep for 10ms */ nanosleep(&c_timeout, NULL); /* sleep for the timeout */
/* adjust the data and loop back to send() the rest */ /* adjust the data and loop back to send() the rest */
data += nSent; data += nSent;
nBytes -= (uint16_t)nSent; nBytes -= (uint16_t)nSent;
@ -284,6 +293,9 @@ void QS_output(void) {
} }
} }
} }
else {
QS_CRIT_EXIT_();
}
} }
/*..........................................................................*/ /*..........................................................................*/
void QS_rx_input(void) { void QS_rx_input(void) {

View File

@ -66,13 +66,14 @@
#define QS_TX_SIZE (8*1024) #define QS_TX_SIZE (8*1024)
#define QS_RX_SIZE (2*1024) #define QS_RX_SIZE (2*1024)
#define QS_TX_CHUNK QS_TX_SIZE #define QS_TX_CHUNK QS_TX_SIZE
#define QS_TIMEOUT_MS 10
#define INVALID_SOCKET -1 #define INVALID_SOCKET -1
#define SOCKET_ERROR -1 #define SOCKET_ERROR -1
/* local variables .........................................................*/ /* local variables .........................................................*/
static int l_sock = INVALID_SOCKET; static int l_sock = INVALID_SOCKET;
static struct timespec const c_10ms = { 0, 10000000L }; static struct timespec const c_timeout = { 0, QS_TIMEOUT_MS*1000000L };
/*..........................................................................*/ /*..........................................................................*/
uint8_t QS_onStartup(void const *arg) { uint8_t QS_onStartup(void const *arg) {
@ -213,10 +214,10 @@ void QS_onFlush(void) {
int nSent = send(l_sock, (char const *)data, (int)nBytes, 0); int nSent = send(l_sock, (char const *)data, (int)nBytes, 0);
if (nSent == SOCKET_ERROR) { /* sending failed? */ if (nSent == SOCKET_ERROR) { /* sending failed? */
if ((errno == EWOULDBLOCK) || (errno == EAGAIN)) { if ((errno == EWOULDBLOCK) || (errno == EAGAIN)) {
/* sleep for 10ms and then loop back /* sleep for the timeout and then loop back
* to send() the SAME data again * to send() the SAME data again
*/ */
nanosleep(&c_10ms, NULL); nanosleep(&c_timeout, NULL);
} }
else { /* some other socket error... */ else { /* some other socket error... */
fprintf(stderr, "<TARGET> ERROR sending data over TCP," fprintf(stderr, "<TARGET> ERROR sending data over TCP,"
@ -225,7 +226,7 @@ void QS_onFlush(void) {
} }
} }
else if (nSent < (int)nBytes) { /* sent fewer than requested? */ else if (nSent < (int)nBytes) { /* sent fewer than requested? */
nanosleep(&c_10ms, NULL); /* sleep for 10ms */ nanosleep(&c_timeout, NULL); /* sleep for the timeout */
/* adjust the data and loop back to send() the rest */ /* adjust the data and loop back to send() the rest */
data += nSent; data += nSent;
nBytes -= (uint16_t)nSent; nBytes -= (uint16_t)nSent;
@ -270,10 +271,10 @@ void QS_output(void) {
int nSent = send(l_sock, (char const *)data, (int)nBytes, 0); int nSent = send(l_sock, (char const *)data, (int)nBytes, 0);
if (nSent == SOCKET_ERROR) { /* sending failed? */ if (nSent == SOCKET_ERROR) { /* sending failed? */
if ((errno == EWOULDBLOCK) || (errno == EAGAIN)) { if ((errno == EWOULDBLOCK) || (errno == EAGAIN)) {
/* sleep for 10ms and then loop back /* sleep for the timeout and then loop back
* to send() the SAME data again * to send() the SAME data again
*/ */
nanosleep(&c_10ms, NULL); nanosleep(&c_timeout, NULL);
} }
else { /* some other socket error... */ else { /* some other socket error... */
fprintf(stderr, "<TARGET> ERROR sending data over TCP," fprintf(stderr, "<TARGET> ERROR sending data over TCP,"
@ -282,7 +283,7 @@ void QS_output(void) {
} }
} }
else if (nSent < (int)nBytes) { /* sent fewer than requested? */ else if (nSent < (int)nBytes) { /* sent fewer than requested? */
nanosleep(&c_10ms, NULL); /* sleep for 10ms */ nanosleep(&c_timeout, NULL); /* sleep for the timeout */
/* adjust the data and loop back to send() the rest */ /* adjust the data and loop back to send() the rest */
data += nSent; data += nSent;
nBytes -= (uint16_t)nSent; nBytes -= (uint16_t)nSent;

View File

@ -4,8 +4,8 @@
* @ingroup ports * @ingroup ports
* @cond * @cond
****************************************************************************** ******************************************************************************
* Last updated for version 6.5.1 * Last Updated for Version: 6.5.1
* Last updated on 2019-05-31 * Date of the Last Update: 2019-06-18
* *
* Q u a n t u m L e a P s * Q u a n t u m L e a P s
* ------------------------ * ------------------------
@ -38,7 +38,7 @@
* @endcond * @endcond
*/ */
#ifndef Q_SPY #ifndef Q_SPY
#error "Q_SPY must be defined for QTEST application" #error "Q_SPY must be defined to compile qutest_port.c"
#endif /* Q_SPY */ #endif /* Q_SPY */
#define QP_IMPL /* this is QP implementation */ #define QP_IMPL /* this is QP implementation */
@ -69,7 +69,7 @@
#define QS_TX_SIZE (8*1024) #define QS_TX_SIZE (8*1024)
#define QS_RX_SIZE (2*1024) #define QS_RX_SIZE (2*1024)
#define QS_TX_CHUNK QS_TX_SIZE #define QS_TX_CHUNK QS_TX_SIZE
#define QS_IMEOUT_MS 10 #define QS_TIMEOUT_MS 10
/* local variables .........................................................*/ /* local variables .........................................................*/
static SOCKET l_sock = INVALID_SOCKET; static SOCKET l_sock = INVALID_SOCKET;
@ -79,7 +79,7 @@ uint8_t QS_onStartup(void const *arg) {
static uint8_t qsBuf[QS_TX_SIZE]; /* buffer for QS-TX channel */ static uint8_t qsBuf[QS_TX_SIZE]; /* buffer for QS-TX channel */
static uint8_t qsRxBuf[QS_RX_SIZE]; /* buffer for QS-RX channel */ static uint8_t qsRxBuf[QS_RX_SIZE]; /* buffer for QS-RX channel */
char hostName[128]; char hostName[128];
char const *serviceName = "6601"; /* default QSPY server port */ char const *serviceName = "6601"; /* default QSPY server port */
char const *src; char const *src;
char *dst; char *dst;
int status; int status;
@ -95,8 +95,8 @@ uint8_t QS_onStartup(void const *arg) {
QS_initBuf(qsBuf, sizeof(qsBuf)); QS_initBuf(qsBuf, sizeof(qsBuf));
QS_rxInitBuf(qsRxBuf, sizeof(qsRxBuf)); QS_rxInitBuf(qsRxBuf, sizeof(qsRxBuf));
/* initialize Windows sockets */ /* initialize Windows sockets version 2.2 */
if (WSAStartup(MAKEWORD(2,2), &wsaData) != NO_ERROR) { if (WSAStartup(MAKEWORD(2, 2), &wsaData) != NO_ERROR) {
fprintf(stderr, fprintf(stderr,
"<TARGET> ERROR Windows Sockets cannot be initialized\n"); "<TARGET> ERROR Windows Sockets cannot be initialized\n");
goto error; goto error;
@ -115,7 +115,7 @@ uint8_t QS_onStartup(void const *arg) {
} }
*dst = '\0'; /* zero-terminate hostName */ *dst = '\0'; /* zero-terminate hostName */
/* extract port_remote from 'arg' (hostName:port_remote)... */ /* extract serviceName from 'arg' (hostName:serviceName)... */
if (*src == ':') { if (*src == ':') {
serviceName = src + 1; serviceName = src + 1;
} }
@ -213,10 +213,10 @@ void QS_onFlush(void) {
if (nSent == SOCKET_ERROR) { /* sending failed? */ if (nSent == SOCKET_ERROR) { /* sending failed? */
int err = WSAGetLastError(); int err = WSAGetLastError();
if (err == WSAEWOULDBLOCK) { if (err == WSAEWOULDBLOCK) {
/* sleep for 10ms and then loop back /* sleep for the timeout and then loop back
* to send() the SAME data again * to send() the SAME data again
*/ */
Sleep(10); Sleep(QS_TIMEOUT_MS);
} }
else { /* some other socket error... */ else { /* some other socket error... */
fprintf(stderr, "<TARGET> ERROR sending data over TCP," fprintf(stderr, "<TARGET> ERROR sending data over TCP,"
@ -225,7 +225,7 @@ void QS_onFlush(void) {
} }
} }
else if (nSent < (int)nBytes) { /* sent fewer than requested? */ else if (nSent < (int)nBytes) { /* sent fewer than requested? */
Sleep(10); /* sleep for 10ms */ Sleep(QS_TIMEOUT_MS); /* sleep for the timeout */
/* adjust the data and loop back to send() the rest */ /* adjust the data and loop back to send() the rest */
data += nSent; data += nSent;
nBytes -= (uint16_t)nSent; nBytes -= (uint16_t)nSent;
@ -246,7 +246,7 @@ void QS_onTestLoop() {
QS_rxPriv_.inTestLoop = true; QS_rxPriv_.inTestLoop = true;
while (QS_rxPriv_.inTestLoop) { while (QS_rxPriv_.inTestLoop) {
struct timeval timeout = { struct timeval timeout = {
(long)0, (long)(QS_IMEOUT_MS * 1000) (long)0, (long)(QS_TIMEOUT_MS * 1000)
}; };
int status; int status;
int ch; int ch;

View File

@ -4,14 +4,14 @@
* @ingroup ports * @ingroup ports
* @cond * @cond
****************************************************************************** ******************************************************************************
* Last Updated for Version: 6.3.7 * Last Updated for Version: 6.5.1
* Date of the Last Update: 2018-11-29 * Date of the Last Update: 2019-06-18
* *
* Q u a n t u m L e a P s * Q u a n t u m L e a P s
* ------------------------ * ------------------------
* Modern Embedded Software * Modern Embedded Software
* *
* Copyright (C) 2005-2018 Quantum Leaps, LLC. All rights reserved. * Copyright (C) 2005-2019 Quantum Leaps, LLC. All rights reserved.
* *
* This program is open source software: you can redistribute it and/or * This program is open source software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published * modify it under the terms of the GNU General Public License as published
@ -50,13 +50,26 @@
#include <stdlib.h> #include <stdlib.h>
#include <time.h> #include <time.h>
#include <conio.h> #include <conio.h>
#include <ws2tcpip.h> /* for Windows sockets */
/* Minimum required Windows version is Windows-XP or newer (0x0501) */
#ifdef WINVER
#undef WINVER
#endif
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define WINVER _WIN32_WINNT_WINXP
#define _WIN32_WINNT _WIN32_WINNT_WINXP
#include <ws2tcpip.h>
//Q_DEFINE_THIS_MODULE("qs_port") //Q_DEFINE_THIS_MODULE("qs_port")
#define QS_TX_SIZE (8*1024) #define QS_TX_SIZE (8*1024)
#define QS_RX_SIZE (2*1024) #define QS_RX_SIZE (2*1024)
#define QS_TX_CHUNK QS_TX_SIZE #define QS_TX_CHUNK QS_TX_SIZE
#define QS_TIMEOUT_MS 10
/* local variables .........................................................*/ /* local variables .........................................................*/
static SOCKET l_sock = INVALID_SOCKET; static SOCKET l_sock = INVALID_SOCKET;
@ -187,6 +200,7 @@ void QS_onReset(void) {
void QS_onFlush(void) { void QS_onFlush(void) {
uint16_t nBytes; uint16_t nBytes;
uint8_t const *data; uint8_t const *data;
QS_CRIT_STAT_
if (l_sock == INVALID_SOCKET) { /* socket NOT initialized? */ if (l_sock == INVALID_SOCKET) { /* socket NOT initialized? */
fprintf(stderr, "<TARGET> ERROR invalid TCP socket\n"); fprintf(stderr, "<TARGET> ERROR invalid TCP socket\n");
@ -194,16 +208,18 @@ void QS_onFlush(void) {
} }
nBytes = QS_TX_CHUNK; nBytes = QS_TX_CHUNK;
QS_CRIT_ENTRY_();
while ((data = QS_getBlock(&nBytes)) != (uint8_t *)0) { while ((data = QS_getBlock(&nBytes)) != (uint8_t *)0) {
QS_CRIT_EXIT_();
for (;;) { /* for-ever until break or return */ for (;;) { /* for-ever until break or return */
int nSent = send(l_sock, (char const *)data, (int)nBytes, 0); int nSent = send(l_sock, (char const *)data, (int)nBytes, 0);
if (nSent == SOCKET_ERROR) { /* sending failed? */ if (nSent == SOCKET_ERROR) { /* sending failed? */
int err = WSAGetLastError(); int err = WSAGetLastError();
if (err == WSAEWOULDBLOCK) { if (err == WSAEWOULDBLOCK) {
/* sleep for 10ms and then loop back /* sleep for the timeout and then loop back
* to send() the SAME data again * to send() the SAME data again
*/ */
Sleep(10); Sleep(QS_TIMEOUT_MS);
} }
else { /* some other socket error... */ else { /* some other socket error... */
fprintf(stderr, "<TARGET> ERROR sending data over TCP," fprintf(stderr, "<TARGET> ERROR sending data over TCP,"
@ -212,7 +228,7 @@ void QS_onFlush(void) {
} }
} }
else if (nSent < (int)nBytes) { /* sent fewer than requested? */ else if (nSent < (int)nBytes) { /* sent fewer than requested? */
Sleep(10); /* sleep for 10ms */ Sleep(QS_TIMEOUT_MS); /* sleep for the timeout */
/* adjust the data and loop back to send() the rest */ /* adjust the data and loop back to send() the rest */
data += nSent; data += nSent;
nBytes -= (uint16_t)nSent; nBytes -= (uint16_t)nSent;
@ -223,7 +239,9 @@ void QS_onFlush(void) {
} }
/* set nBytes for the next call to QS_getBlock() */ /* set nBytes for the next call to QS_getBlock() */
nBytes = QS_TX_CHUNK; nBytes = QS_TX_CHUNK;
QS_CRIT_ENTRY_();
} }
QS_CRIT_EXIT_();
} }
/*..........................................................................*/ /*..........................................................................*/
QSTimeCtr QS_onGetTime(void) { QSTimeCtr QS_onGetTime(void) {
@ -236,6 +254,7 @@ QSTimeCtr QS_onGetTime(void) {
void QS_output(void) { void QS_output(void) {
uint16_t nBytes; uint16_t nBytes;
uint8_t const *data; uint8_t const *data;
QS_CRIT_STAT_
if (l_sock == INVALID_SOCKET) { /* socket NOT initialized? */ if (l_sock == INVALID_SOCKET) { /* socket NOT initialized? */
fprintf(stderr, "<TARGET> ERROR invalid TCP socket\n"); fprintf(stderr, "<TARGET> ERROR invalid TCP socket\n");
@ -243,16 +262,18 @@ void QS_output(void) {
} }
nBytes = QS_TX_CHUNK; nBytes = QS_TX_CHUNK;
QS_CRIT_ENTRY_();
if ((data = QS_getBlock(&nBytes)) != (uint8_t *)0) { if ((data = QS_getBlock(&nBytes)) != (uint8_t *)0) {
QS_CRIT_EXIT_();
for (;;) { /* for-ever until break or return */ for (;;) { /* for-ever until break or return */
int nSent = send(l_sock, (char const *)data, (int)nBytes, 0); int nSent = send(l_sock, (char const *)data, (int)nBytes, 0);
if (nSent == SOCKET_ERROR) { /* sending failed? */ if (nSent == SOCKET_ERROR) { /* sending failed? */
int err = WSAGetLastError(); int err = WSAGetLastError();
if (err == WSAEWOULDBLOCK) { if (err == WSAEWOULDBLOCK) {
/* sleep for 10ms and then loop back /* sleep for the timeout and then loop back
* to send() the SAME data again * to send() the SAME data again
*/ */
Sleep(10); Sleep(QS_TIMEOUT_MS);
} }
else { /* some other socket error... */ else { /* some other socket error... */
fprintf(stderr, "<TARGET> ERROR sending data over TCP," fprintf(stderr, "<TARGET> ERROR sending data over TCP,"
@ -261,7 +282,7 @@ void QS_output(void) {
} }
} }
else if (nSent < (int)nBytes) { /* sent fewer than requested? */ else if (nSent < (int)nBytes) { /* sent fewer than requested? */
Sleep(10); /* sleep for 10ms */ Sleep(QS_TIMEOUT_MS); /* sleep for the timeout */
/* adjust the data and loop back to send() the rest */ /* adjust the data and loop back to send() the rest */
data += nSent; data += nSent;
nBytes -= (uint16_t)nSent; nBytes -= (uint16_t)nSent;
@ -271,6 +292,9 @@ void QS_output(void) {
} }
} }
} }
else {
QS_CRIT_EXIT_();
}
} }
/*..........................................................................*/ /*..........................................................................*/
void QS_rx_input(void) { void QS_rx_input(void) {

View File

@ -50,13 +50,26 @@
#include <stdlib.h> #include <stdlib.h>
#include <time.h> #include <time.h>
#include <conio.h> #include <conio.h>
#include <ws2tcpip.h> /* for Windows sockets */
/* Minimum required Windows version is Windows-XP or newer (0x0501) */
#ifdef WINVER
#undef WINVER
#endif
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT
#endif
#define WINVER _WIN32_WINNT_WINXP
#define _WIN32_WINNT _WIN32_WINNT_WINXP
#include <ws2tcpip.h>
//Q_DEFINE_THIS_MODULE("qs_port") //Q_DEFINE_THIS_MODULE("qs_port")
#define QS_TX_SIZE (8*1024) #define QS_TX_SIZE (8*1024)
#define QS_RX_SIZE (2*1024) #define QS_RX_SIZE (2*1024)
#define QS_TX_CHUNK QS_TX_SIZE #define QS_TX_CHUNK QS_TX_SIZE
#define QS_TIMEOUT_MS 10
/* local variables .........................................................*/ /* local variables .........................................................*/
static SOCKET l_sock = INVALID_SOCKET; static SOCKET l_sock = INVALID_SOCKET;
@ -203,10 +216,10 @@ void QS_onFlush(void) {
if (nSent == SOCKET_ERROR) { /* sending failed? */ if (nSent == SOCKET_ERROR) { /* sending failed? */
int err = WSAGetLastError(); int err = WSAGetLastError();
if (err == WSAEWOULDBLOCK) { if (err == WSAEWOULDBLOCK) {
/* sleep for 10ms and then loop back /* sleep for the timeout and then loop back
* to send() the SAME data again * to send() the SAME data again
*/ */
Sleep(10); Sleep(QS_TIMEOUT_MS);
} }
else { /* some other socket error... */ else { /* some other socket error... */
fprintf(stderr, "<TARGET> ERROR sending data over TCP," fprintf(stderr, "<TARGET> ERROR sending data over TCP,"
@ -215,7 +228,7 @@ void QS_onFlush(void) {
} }
} }
else if (nSent < (int)nBytes) { /* sent fewer than requested? */ else if (nSent < (int)nBytes) { /* sent fewer than requested? */
Sleep(10); /* sleep for 10ms */ Sleep(QS_TIMEOUT_MS); /* sleep for the timeout */
/* adjust the data and loop back to send() the rest */ /* adjust the data and loop back to send() the rest */
data += nSent; data += nSent;
nBytes -= (uint16_t)nSent; nBytes -= (uint16_t)nSent;
@ -257,10 +270,10 @@ void QS_output(void) {
if (nSent == SOCKET_ERROR) { /* sending failed? */ if (nSent == SOCKET_ERROR) { /* sending failed? */
int err = WSAGetLastError(); int err = WSAGetLastError();
if (err == WSAEWOULDBLOCK) { if (err == WSAEWOULDBLOCK) {
/* sleep for 10ms and then loop back /* sleep for the timeout and then loop back
* to send() the SAME data again * to send() the SAME data again
*/ */
Sleep(10); Sleep(QS_TIMEOUT_MS);
} }
else { /* some other socket error... */ else { /* some other socket error... */
fprintf(stderr, "<TARGET> ERROR sending data over TCP," fprintf(stderr, "<TARGET> ERROR sending data over TCP,"
@ -269,7 +282,7 @@ void QS_output(void) {
} }
} }
else if (nSent < (int)nBytes) { /* sent fewer than requested? */ else if (nSent < (int)nBytes) { /* sent fewer than requested? */
Sleep(10); /* sleep for 10ms */ Sleep(QS_TIMEOUT_MS); /* sleep for the timeout */
/* adjust the data and loop back to send() the rest */ /* adjust the data and loop back to send() the rest */
data += nSent; data += nSent;
nBytes -= (uint16_t)nSent; nBytes -= (uint16_t)nSent;