Eiger stop lock (#576)

* added a lock when stopping or starting state machine in eiger server

* added 5ms right after acq started to make sure it really started

* added 100ms right after acq started to make sure it really started
This commit is contained in:
Dhanya Thattil
2022-11-17 15:23:41 +01:00
committed by GitHub
parent fdd6031add
commit 110e57ff6c
8 changed files with 58 additions and 21 deletions

View File

@ -2217,43 +2217,44 @@ int setTransmissionDelayRight(int value) {
/* aquisition */ /* aquisition */
int prepareAcquisition() {
#ifndef VIRTUAL
sharedMemory_lockLocalLink();
LOG(logINFO, ("Going to prepare for acquisition with counter_bit:%d\n",
Feb_Control_Get_Counter_Bit()));
Feb_Control_PrepareForAcquisition();
sharedMemory_unlockLocalLink();
#endif
return OK;
}
int startStateMachine() { int startStateMachine() {
sharedMemory_lockAcqFlag();
#ifdef VIRTUAL #ifdef VIRTUAL
// create udp socket // create udp socket
if (createUDPSocket(0) != OK) { if (createUDPSocket(0) != OK) {
sharedMemory_unlockAcqFlag();
return FAIL; return FAIL;
} }
if (createUDPSocket(1) != OK) { if (createUDPSocket(1) != OK) {
sharedMemory_unlockAcqFlag();
return FAIL; return FAIL;
} }
LOG(logINFOBLUE, ("Starting State Machine\n")); LOG(logINFOBLUE, ("Starting State Machine\n"));
if (sharedMemory_getStop() != 0) { if (sharedMemory_getStop() != 0) {
LOG(logERROR, ("Cant start acquisition. " LOG(logERROR, ("Cant start acquisition. "
"Stop server has not updated stop status to 0\n")); "Stop server has not updated stop status to 0\n"));
sharedMemory_unlockAcqFlag();
return FAIL; return FAIL;
} }
sharedMemory_setStatus(RUNNING); sharedMemory_setStatus(RUNNING);
if (pthread_create(&virtual_tid, NULL, &start_timer, NULL)) { if (pthread_create(&virtual_tid, NULL, &start_timer, NULL)) {
LOG(logERROR, ("Could not start Virtual acquisition thread\n")); LOG(logERROR, ("Could not start Virtual acquisition thread\n"));
sharedMemory_setStatus(IDLE); sharedMemory_setStatus(IDLE);
sharedMemory_unlockAcqFlag();
return FAIL; return FAIL;
} }
LOG(logINFO, ("Virtual Acquisition started\n")); LOG(logINFO, ("Virtual Acquisition started\n"));
sharedMemory_unlockAcqFlag();
return OK; return OK;
#else #else
sharedMemory_lockLocalLink(); sharedMemory_lockLocalLink();
LOG(logINFO, ("Acquisition started bit toggled\n"));
LOG(logINFO, ("Going to prepare for acquisition with counter_bit:%d\n",
Feb_Control_Get_Counter_Bit()));
Feb_Control_PrepareForAcquisition();
int ret = OK, prev_flag; int ret = OK, prev_flag;
// get the DAQ toggle bit // get the DAQ toggle bit
prev_flag = Feb_Control_AcquisitionStartedBit(); prev_flag = Feb_Control_AcquisitionStartedBit();
@ -2270,12 +2271,14 @@ int startStateMachine() {
LOG(logERROR, LOG(logERROR,
("Acquisition did not LOG(logERROR ouble reading register\n")); ("Acquisition did not LOG(logERROR ouble reading register\n"));
sharedMemory_unlockLocalLink(); sharedMemory_unlockLocalLink();
sharedMemory_unlockAcqFlag();
return FAIL; return FAIL;
} }
usleep(100 * 1000);
LOG(logINFOGREEN, ("Acquisition started\n")); LOG(logINFOGREEN, ("Acquisition started\n"));
} }
sharedMemory_unlockLocalLink(); sharedMemory_unlockLocalLink();
sharedMemory_unlockAcqFlag();
return ret; return ret;
#endif #endif
} }
@ -2508,6 +2511,10 @@ void *start_timer(void *arg) {
#endif #endif
int stopStateMachine() { int stopStateMachine() {
// acq lock for seamless stop
sharedMemory_lockAcqFlag();
LOG(logINFORED, ("Stopping state machine\n")); LOG(logINFORED, ("Stopping state machine\n"));
// if scan active, stop scan // if scan active, stop scan
if (sharedMemory_getScanStatus() == RUNNING) { if (sharedMemory_getScanStatus() == RUNNING) {
@ -2520,6 +2527,7 @@ int stopStateMachine() {
usleep(500); usleep(500);
sharedMemory_setStop(0); sharedMemory_setStop(0);
LOG(logINFO, ("Stopped State Machine\n")); LOG(logINFO, ("Stopped State Machine\n"));
sharedMemory_unlockAcqFlag();
return OK; return OK;
#else #else
sharedMemory_lockLocalLink(); sharedMemory_lockLocalLink();
@ -2527,6 +2535,7 @@ int stopStateMachine() {
if (!Feb_Control_StopAcquisition()) { if (!Feb_Control_StopAcquisition()) {
LOG(logERROR, ("failed to stop acquisition\n")); LOG(logERROR, ("failed to stop acquisition\n"));
sharedMemory_unlockLocalLink(); sharedMemory_unlockLocalLink();
sharedMemory_unlockAcqFlag();
return FAIL; return FAIL;
} }
sharedMemory_unlockLocalLink(); sharedMemory_unlockLocalLink();
@ -2537,6 +2546,7 @@ int stopStateMachine() {
// wait for beb to send out all packets // wait for beb to send out all packets
if (Beb_IsTransmitting(&isTransmitting, send_to_ten_gig, 1) == FAIL) { if (Beb_IsTransmitting(&isTransmitting, send_to_ten_gig, 1) == FAIL) {
LOG(logERROR, ("failed to stop beb acquisition\n")); LOG(logERROR, ("failed to stop beb acquisition\n"));
sharedMemory_unlockAcqFlag();
return FAIL; return FAIL;
} }
if (isTransmitting) { if (isTransmitting) {
@ -2547,11 +2557,11 @@ int stopStateMachine() {
// reset feb and beb // reset feb and beb
sharedMemory_lockLocalLink(); sharedMemory_lockLocalLink();
// uncommenting this out as it randomly does not set the processing bit to high Feb_Control_Reset();
//Feb_Control_Reset();
sharedMemory_unlockLocalLink(); sharedMemory_unlockLocalLink();
if (!Beb_StopAcquisition()) { if (!Beb_StopAcquisition()) {
LOG(logERROR, ("failed to stop acquisition\n")); LOG(logERROR, ("failed to stop acquisition\n"));
sharedMemory_unlockAcqFlag();
return FAIL; return FAIL;
} }
@ -2561,6 +2571,7 @@ int stopStateMachine() {
Beb_SetNextFrameNumber(retval + 1); Beb_SetNextFrameNumber(retval + 1);
} }
LOG(logINFOBLUE, ("Stopping state machine complete\n\n")); LOG(logINFOBLUE, ("Stopping state machine complete\n\n"));
sharedMemory_unlockAcqFlag();
return OK; return OK;
#endif #endif
} }

View File

@ -25,4 +25,6 @@ int sharedMemory_getScanStop();
#ifdef EIGERD #ifdef EIGERD
void sharedMemory_lockLocalLink(); void sharedMemory_lockLocalLink();
void sharedMemory_unlockLocalLink(); void sharedMemory_unlockLocalLink();
void sharedMemory_lockAcqFlag();
void sharedMemory_unlockAcqFlag();
#endif #endif

View File

@ -600,9 +600,6 @@ int setTransmissionDelayRight(int value);
#endif #endif
// aquisition // aquisition
#ifdef EIGERD
int prepareAcquisition();
#endif
int startStateMachine(); int startStateMachine();
#ifdef VIRTUAL #ifdef VIRTUAL
void *start_timer(void *arg); void *start_timer(void *arg);

View File

@ -20,6 +20,7 @@ typedef struct Memory {
pthread_mutex_t lockStatus; pthread_mutex_t lockStatus;
#ifdef EIGERD #ifdef EIGERD
pthread_mutex_t lockLocalLink; pthread_mutex_t lockLocalLink;
pthread_mutex_t lockAcqFlag;
#endif #endif
enum runStatus scanStatus; // idle, running or error enum runStatus scanStatus; // idle, running or error
int scanStop; int scanStop;
@ -120,6 +121,7 @@ int sharedMemory_initialize() {
#endif #endif
#ifdef EIGERD #ifdef EIGERD
// local link mutex
pthread_mutexattr_t lockLocalLinkAttribute; pthread_mutexattr_t lockLocalLinkAttribute;
if (pthread_mutexattr_init(&lockLocalLinkAttribute) != 0) { if (pthread_mutexattr_init(&lockLocalLinkAttribute) != 0) {
LOG(logERROR, LOG(logERROR,
@ -141,6 +143,28 @@ int sharedMemory_initialize() {
"shared memory\n")); "shared memory\n"));
return FAIL; return FAIL;
} }
// acq flag mutex
pthread_mutexattr_t lockAcqFlagAttribute;
if (pthread_mutexattr_init(&lockAcqFlagAttribute) != 0) {
LOG(logERROR,
("Failed to initialize mutex attribute for lockAcqFlag for "
"shared memory\n"));
return FAIL;
}
if (pthread_mutexattr_setpshared(&lockAcqFlagAttribute,
PTHREAD_PROCESS_SHARED) != 0) {
LOG(logERROR, ("Failed to set attribute property to process shared for "
"lockAcqFlag for shared memory\n"));
return FAIL;
}
if (pthread_mutex_init(&(shm->lockAcqFlag), &lockAcqFlagAttribute) !=
0) {
LOG(logERROR, ("Failed to initialize pthread_mutex_t lockAcqFlag for "
"shared memory\n"));
return FAIL;
}
#endif #endif
shm->scanStatus = IDLE; shm->scanStatus = IDLE;
shm->scanStop = 0; shm->scanStop = 0;
@ -266,4 +290,10 @@ void sharedMemory_lockLocalLink() { pthread_mutex_lock(&(shm->lockLocalLink)); }
void sharedMemory_unlockLocalLink() { void sharedMemory_unlockLocalLink() {
pthread_mutex_unlock(&(shm->lockLocalLink)); pthread_mutex_unlock(&(shm->lockLocalLink));
} }
void sharedMemory_lockAcqFlag() { pthread_mutex_lock(&(shm->lockAcqFlag)); }
void sharedMemory_unlockAcqFlag() {
pthread_mutex_unlock(&(shm->lockAcqFlag));
}
#endif #endif

View File

@ -1909,9 +1909,6 @@ void *start_state_machine(void *arg) {
} }
usleep(scanSettleTime_ns / 1000); usleep(scanSettleTime_ns / 1000);
} }
#ifdef EIGERD
prepareAcquisition();
#endif
ret = startStateMachine(); ret = startStateMachine();
LOG(logDEBUG2, ("Starting Acquisition ret: %d\n", ret)); LOG(logDEBUG2, ("Starting Acquisition ret: %d\n", ret));
if (ret == FAIL) { if (ret == FAIL) {