FRONTPANEL: Fixed response data end of line detection issue which caused hanging of register updates
This commit is contained in:
parent
1348a1fbaa
commit
3719a07d10
2 changed files with 27 additions and 10 deletions
|
@ -1482,6 +1482,7 @@ while ((p->sock != INVALID_SOCKET) &&
|
||||||
pthread_mutex_unlock (&p->io_lock);
|
pthread_mutex_unlock (&p->io_lock);
|
||||||
new_data = sim_read_sock (p->sock, &buf[buf_data], sizeof(buf)-(buf_data+1));
|
new_data = sim_read_sock (p->sock, &buf[buf_data], sizeof(buf)-(buf_data+1));
|
||||||
if (new_data <= 0) {
|
if (new_data <= 0) {
|
||||||
|
pthread_mutex_lock (&p->io_lock);
|
||||||
sim_panel_set_error ("%s", sim_get_err_sock("Unexpected socket read"));
|
sim_panel_set_error ("%s", sim_get_err_sock("Unexpected socket read"));
|
||||||
_panel_debug (p, DBG_RCV, "%s", NULL, 0, sim_panel_get_error());
|
_panel_debug (p, DBG_RCV, "%s", NULL, 0, sim_panel_get_error());
|
||||||
p->State = Error;
|
p->State = Error;
|
||||||
|
@ -1491,9 +1492,11 @@ while ((p->sock != INVALID_SOCKET) &&
|
||||||
buf_data += new_data;
|
buf_data += new_data;
|
||||||
buf[buf_data] = '\0';
|
buf[buf_data] = '\0';
|
||||||
s = buf;
|
s = buf;
|
||||||
while ((eol = strchr (s, '\r'))) {
|
while ((eol = strchr (s, '\n'))) {
|
||||||
/* Line to process */
|
/* Line to process */
|
||||||
*eol++ = '\0';
|
*eol++ = '\0';
|
||||||
|
while ((*s) && (s[strlen(s)-1] == '\r'))
|
||||||
|
s[strlen(s)-1] = '\0';
|
||||||
e = strchr (s, ':');
|
e = strchr (s, ':');
|
||||||
if (e) {
|
if (e) {
|
||||||
size_t i;
|
size_t i;
|
||||||
|
@ -1582,6 +1585,7 @@ while ((p->sock != INVALID_SOCKET) &&
|
||||||
/* Non Register Data Found (echo of EXAMINE or other commands and/or command output) */
|
/* Non Register Data Found (echo of EXAMINE or other commands and/or command output) */
|
||||||
if (p->io_waiting) {
|
if (p->io_waiting) {
|
||||||
char *t;
|
char *t;
|
||||||
|
|
||||||
if (p->io_response_data + strlen (s) + 3 > p->io_response_size) {
|
if (p->io_response_data + strlen (s) + 3 > p->io_response_size) {
|
||||||
t = (char *)_panel_malloc (p->io_response_data + strlen (s) + 3);
|
t = (char *)_panel_malloc (p->io_response_data + strlen (s) + 3);
|
||||||
if (t == NULL) {
|
if (t == NULL) {
|
||||||
|
@ -1649,11 +1653,15 @@ pthread_setschedparam (pthread_self(), sched_policy, &sched_priority);
|
||||||
|
|
||||||
pthread_mutex_lock (&p->io_lock);
|
pthread_mutex_lock (&p->io_lock);
|
||||||
p->callback_thread_running = 1;
|
p->callback_thread_running = 1;
|
||||||
|
pthread_mutex_unlock (&p->io_lock);
|
||||||
pthread_cond_signal (&p->startup_cond); /* Signal we're ready to go */
|
pthread_cond_signal (&p->startup_cond); /* Signal we're ready to go */
|
||||||
|
msleep (100);
|
||||||
|
pthread_mutex_lock (&p->io_lock);
|
||||||
while ((p->sock != INVALID_SOCKET) &&
|
while ((p->sock != INVALID_SOCKET) &&
|
||||||
(p->callbacks_per_second) &&
|
(p->callbacks_per_second) &&
|
||||||
(p->State != Error)) {
|
(p->State != Error)) {
|
||||||
int rate = p->callbacks_per_second;
|
int rate = p->callbacks_per_second;
|
||||||
|
|
||||||
pthread_mutex_unlock (&p->io_lock);
|
pthread_mutex_unlock (&p->io_lock);
|
||||||
|
|
||||||
++callback_count;
|
++callback_count;
|
||||||
|
@ -1662,7 +1670,7 @@ while ((p->sock != INVALID_SOCKET) &&
|
||||||
}
|
}
|
||||||
msleep (1000/rate);
|
msleep (1000/rate);
|
||||||
pthread_mutex_lock (&p->io_lock);
|
pthread_mutex_lock (&p->io_lock);
|
||||||
if (((p->State == Run) || (0 == callback_count%(5*rate))) &&
|
if (((p->State == Run) || ((p->State == Halt) && (0 == callback_count%(5*rate)))) &&
|
||||||
(p->io_reg_query_pending == 0)) {
|
(p->io_reg_query_pending == 0)) {
|
||||||
++p->io_reg_query_pending;
|
++p->io_reg_query_pending;
|
||||||
pthread_mutex_unlock (&p->io_lock);
|
pthread_mutex_unlock (&p->io_lock);
|
||||||
|
@ -1672,6 +1680,8 @@ while ((p->sock != INVALID_SOCKET) &&
|
||||||
}
|
}
|
||||||
pthread_mutex_lock (&p->io_lock);
|
pthread_mutex_lock (&p->io_lock);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
_panel_debug (p, DBG_XMT, "Waiting for prior register query completion", NULL, 0);
|
||||||
}
|
}
|
||||||
p->callback_thread_running = 0;
|
p->callback_thread_running = 0;
|
||||||
pthread_mutex_unlock (&p->io_lock);
|
pthread_mutex_unlock (&p->io_lock);
|
||||||
|
@ -1764,8 +1774,8 @@ while (1) { /* format passed string, arg
|
||||||
if (buf != stackbuf)
|
if (buf != stackbuf)
|
||||||
free (buf);
|
free (buf);
|
||||||
bufsize = bufsize * 2;
|
bufsize = bufsize * 2;
|
||||||
if (bufsize < len + 2)
|
if (bufsize < (len + post_fix_len + 2))
|
||||||
bufsize = len + 2;
|
bufsize = len + post_fix_len + 2;
|
||||||
buf = (char *) _panel_malloc (bufsize);
|
buf = (char *) _panel_malloc (bufsize);
|
||||||
if (buf == NULL)
|
if (buf == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -55,7 +55,7 @@ extern "C" {
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#if !defined(__VAX) /* Supported platform */
|
#if !defined(__VAX) /* Unsupported platform */
|
||||||
|
|
||||||
#define SIM_FRONTPANEL_VERSION 1
|
#define SIM_FRONTPANEL_VERSION 1
|
||||||
|
|
||||||
|
@ -171,10 +171,14 @@ sim_panel_add_register_indirect (PANEL *panel,
|
||||||
the current register state at the desired rate.
|
the current register state at the desired rate.
|
||||||
|
|
||||||
|
|
||||||
Note 1: The buffers described in a panel's register set will be dynamically
|
Note 1: The buffers described in a panel's register set will be
|
||||||
revised as soon as data is available from the simulator. The
|
dynamically revised as soon as data is available from the
|
||||||
callback routine merely serves as a notification that a complete
|
simulator. The callback routine merely serves as a notification
|
||||||
register set has arrived.
|
that a complete register set has arrived.
|
||||||
|
Note 2: The callback routine should, in general, not run for a long time
|
||||||
|
or frontpanel interactions with the simulator may be disrupted.
|
||||||
|
Setting a flag, signaling an event or posting a message are
|
||||||
|
reasonable activities to perform in a callback routine.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
|
@ -228,7 +232,8 @@ sim_panel_exec_step (PANEL *panel);
|
||||||
sim_panel_gen_deposit - Deposit to register or memory
|
sim_panel_gen_deposit - Deposit to register or memory
|
||||||
sim_panel_mem_examine - Examine memory location
|
sim_panel_mem_examine - Examine memory location
|
||||||
sim_panel_mem_deposit - Deposit to memory location
|
sim_panel_mem_deposit - Deposit to memory location
|
||||||
sim_panel_set_register_value -
|
sim_panel_set_register_value - Deposit to a register or memory
|
||||||
|
location
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -378,6 +383,8 @@ sim_panel_get_state (PANEL *panel);
|
||||||
All APIs routines which return an int return 0 for
|
All APIs routines which return an int return 0 for
|
||||||
success and -1 for an error.
|
success and -1 for an error.
|
||||||
|
|
||||||
|
An API which returns an error (-1), will not change the panel state.
|
||||||
|
|
||||||
sim_panel_get_error - the details of the most recent error
|
sim_panel_get_error - the details of the most recent error
|
||||||
sim_panel_clear_error - clears the error buffer
|
sim_panel_clear_error - clears the error buffer
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue