Browse Source

Fix NetDriver network error detection

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2746 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/1.90
moret 17 years ago
parent
commit
9b636ddc01
3 changed files with 32 additions and 25 deletions
  1. +24
    -15
      common/JackNetDriver.cpp
  2. +6
    -10
      common/JackNetManager.cpp
  3. +2
    -0
      windows/JackNetWinSocket.cpp

+ 24
- 15
common/JackNetDriver.cpp View File

@@ -252,6 +252,7 @@ namespace Jack


void JackNetDriver::Restart() void JackNetDriver::Restart()
{ {
jack_log ( "JackNetDriver::Restart" );
jack_info ( "Restarting driver..." ); jack_info ( "Restarting driver..." );
delete[] fTxBuffer; delete[] fTxBuffer;
fTxBuffer = NULL; fTxBuffer = NULL;
@@ -475,6 +476,8 @@ namespace Jack
return 0; return 0;
} }


//***********************************network operations*************************************************************

int JackNetDriver::Recv ( size_t size, int flags ) int JackNetDriver::Recv ( size_t size, int flags )
{ {
int rx_bytes = fSocket.Recv ( fRxBuffer, size, flags ); int rx_bytes = fSocket.Recv ( fRxBuffer, size, flags );
@@ -484,13 +487,13 @@ namespace Jack
net_error_t error = fSocket.GetError(); net_error_t error = fSocket.GetError();
//no data isn't really an error in realtime processing, so just return 0 //no data isn't really an error in realtime processing, so just return 0
if ( error == NET_NO_DATA ) if ( error == NET_NO_DATA )
{
jack_error ( "No data, is the master still running ?" ); jack_error ( "No data, is the master still running ?" );
return 0;
}
//if a network error occurs, this exception will restart the driver //if a network error occurs, this exception will restart the driver
else if ( error == NET_CONN_ERROR ) else if ( error == NET_CONN_ERROR )
throw JackDriverException ( "Connection lost." );
{
jack_error ( "Connection lost." );
throw JackDriverException();
}
else else
jack_error ( "Fatal error in receive : %s", StrError ( NET_ERROR_CODE ) ); jack_error ( "Fatal error in receive : %s", StrError ( NET_ERROR_CODE ) );
} }
@@ -506,7 +509,10 @@ namespace Jack
net_error_t error = fSocket.GetError(); net_error_t error = fSocket.GetError();
//if a network error occurs, this exception will restart the driver //if a network error occurs, this exception will restart the driver
if ( error == NET_CONN_ERROR ) if ( error == NET_CONN_ERROR )
throw JackDriverException ( "Connection lost." );
{
jack_error ( "Connection lost." );
throw JackDriverException();
}
else else
jack_error ( "Fatal error in send : %s", StrError ( NET_ERROR_CODE ) ); jack_error ( "Fatal error in send : %s", StrError ( NET_ERROR_CODE ) );
} }
@@ -534,7 +540,8 @@ namespace Jack
do do
{ {
rx_bytes = Recv ( fParams.fMtu, 0 ); rx_bytes = Recv ( fParams.fMtu, 0 );
//if error, don't return -1, we need the driver to restart and not to exit
//no sync received during timeout,
//if it's a connection issue, send will detect it, so don't skip the cycle (return 0)
if ( rx_bytes == SOCKET_ERROR ) if ( rx_bytes == SOCKET_ERROR )
return 0; return 0;
} }
@@ -549,8 +556,9 @@ namespace Jack
do do
{ {
rx_bytes = Recv ( fParams.fMtu, MSG_PEEK ); rx_bytes = Recv ( fParams.fMtu, MSG_PEEK );
//error here, problem with send, just skip the cycle (return -1)
if ( rx_bytes == SOCKET_ERROR ) if ( rx_bytes == SOCKET_ERROR )
return 0;
return rx_bytes;
if ( rx_bytes && ( rx_head->fDataStream == 's' ) && ( rx_head->fID == fParams.fID ) ) if ( rx_bytes && ( rx_head->fDataStream == 's' ) && ( rx_head->fID == fParams.fID ) )
{ {
switch ( rx_head->fDataType ) switch ( rx_head->fDataType )
@@ -582,12 +590,9 @@ namespace Jack
} }
fRxHeader.fCycle = rx_head->fCycle; fRxHeader.fCycle = rx_head->fCycle;



#ifdef JACK_MONITOR #ifdef JACK_MONITOR
fMeasureId = 0;
fMeasure[fMeasureId++] = ( ( float ) ( GetMicroSeconds() - JackDriver::fBeginDateUst ) / ( float ) fEngineControl->fPeriodUsecs ) * 100.f;
fMeasure[0] = ( ( float ) ( GetMicroSeconds() - JackDriver::fBeginDateUst ) / ( float ) fEngineControl->fPeriodUsecs ) * 100.f;
#endif #endif

return 0; return 0;
} }


@@ -611,7 +616,7 @@ namespace Jack
fNetAudioPlaybackBuffer->SetBuffer ( audio_port_index, GetOutputBuffer ( audio_port_index ) ); fNetAudioPlaybackBuffer->SetBuffer ( audio_port_index, GetOutputBuffer ( audio_port_index ) );


#ifdef JACK_MONITOR #ifdef JACK_MONITOR
fMeasure[fMeasureId++] = ( ( float ) ( GetMicroSeconds() - JackDriver::fBeginDateUst ) / ( float ) fEngineControl->fPeriodUsecs ) * 100.f;
fMeasure[1] = ( ( float ) ( GetMicroSeconds() - JackDriver::fBeginDateUst ) / ( float ) fEngineControl->fPeriodUsecs ) * 100.f;
#endif #endif


//sync //sync
@@ -622,10 +627,10 @@ namespace Jack
SetSyncPacket(); SetSyncPacket();
tx_bytes = Send ( fParams.fMtu, 0 ); tx_bytes = Send ( fParams.fMtu, 0 );
if ( tx_bytes == SOCKET_ERROR ) if ( tx_bytes == SOCKET_ERROR )
return 0;
return tx_bytes;


#ifdef JACK_MONITOR #ifdef JACK_MONITOR
fMeasure[fMeasureId++] = ( ( float ) ( GetMicroSeconds() - JackDriver::fBeginDateUst ) / ( float ) fEngineControl->fPeriodUsecs ) * 100.f;
fMeasure[2] = ( ( float ) ( GetMicroSeconds() - JackDriver::fBeginDateUst ) / ( float ) fEngineControl->fPeriodUsecs ) * 100.f;
#endif #endif


//midi //midi
@@ -642,6 +647,8 @@ namespace Jack
memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) ); memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) );
copy_size = fNetMidiPlaybackBuffer->RenderToNetwork ( subproc, fTxHeader.fMidiDataSize ); copy_size = fNetMidiPlaybackBuffer->RenderToNetwork ( subproc, fTxHeader.fMidiDataSize );
tx_bytes = Send ( sizeof ( packet_header_t ) + copy_size, 0 ); tx_bytes = Send ( sizeof ( packet_header_t ) + copy_size, 0 );
if ( tx_bytes == SOCKET_ERROR )
return tx_bytes;
} }
} }


@@ -657,11 +664,13 @@ namespace Jack
fNetAudioPlaybackBuffer->RenderFromJackPorts ( subproc ); fNetAudioPlaybackBuffer->RenderFromJackPorts ( subproc );
memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) ); memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) );
tx_bytes = Send ( fAudioTxLen, 0 ); tx_bytes = Send ( fAudioTxLen, 0 );
if ( tx_bytes == SOCKET_ERROR )
return tx_bytes;
} }
} }


#ifdef JACK_MONITOR #ifdef JACK_MONITOR
fMeasure[fMeasureId++] = ( ( float ) ( GetMicroSeconds() - JackDriver::fBeginDateUst ) / ( float ) fEngineControl->fPeriodUsecs ) * 100.f;
fMeasure[3] = ( ( float ) ( GetMicroSeconds() - JackDriver::fBeginDateUst ) / ( float ) fEngineControl->fPeriodUsecs ) * 100.f;
fMonitor->Write ( fMeasure ); fMonitor->Write ( fMeasure );
#endif #endif




+ 6
- 10
common/JackNetManager.cpp View File

@@ -345,8 +345,6 @@ namespace Jack
} }
else else
jack_error ( "Error in send : %s", StrError ( NET_ERROR_CODE ) ); jack_error ( "Error in send : %s", StrError ( NET_ERROR_CODE ) );
//we can't stop the process here, the slave wouldn't see what happens, just return 0
return 0;
} }
return tx_bytes; return tx_bytes;
} }
@@ -360,7 +358,9 @@ namespace Jack
if ( error == NET_NO_DATA ) if ( error == NET_NO_DATA )
{ {
//too much receive failure, react //too much receive failure, react
if ( ++fNetJumpCnt == 100 )
if ( ++fNetJumpCnt < 100 )
return 0;
else
{ {
jack_error ( "No data from %s...", fParams.fName ); jack_error ( "No data from %s...", fParams.fName );
fNetJumpCnt = 0; fNetJumpCnt = 0;
@@ -376,10 +376,6 @@ namespace Jack
} }
else else
jack_error ( "Error in receive : %s", StrError ( NET_ERROR_CODE ) ); jack_error ( "Error in receive : %s", StrError ( NET_ERROR_CODE ) );
//if we stop the process now, the socket will be closed and deleted to prematurely
//so the slave won't see the connection is down - just return 0, thus the master's process don't stop now
//by this way, the slave will have enough time to get the ICMP "connection refused" msg
return 0;
} }
return rx_bytes; return rx_bytes;
} }
@@ -434,7 +430,7 @@ namespace Jack
memset ( fTxData, 0, fPayloadSize ); memset ( fTxData, 0, fPayloadSize );
SetSyncPacket(); SetSyncPacket();
tx_bytes = Send ( fTxBuffer, fParams.fMtu, 0 ); tx_bytes = Send ( fTxBuffer, fParams.fMtu, 0 );
if ( ( tx_bytes == 0 ) || ( tx_bytes == SOCKET_ERROR ) )
if ( tx_bytes == SOCKET_ERROR )
return tx_bytes; return tx_bytes;


#ifdef JACK_MONITOR #ifdef JACK_MONITOR
@@ -455,7 +451,7 @@ namespace Jack
memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) ); memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) );
copy_size = fNetMidiCaptureBuffer->RenderToNetwork ( subproc, fTxHeader.fMidiDataSize ); copy_size = fNetMidiCaptureBuffer->RenderToNetwork ( subproc, fTxHeader.fMidiDataSize );
tx_bytes = Send ( fTxBuffer, sizeof ( packet_header_t ) + copy_size, 0 ); tx_bytes = Send ( fTxBuffer, sizeof ( packet_header_t ) + copy_size, 0 );
if ( ( tx_bytes == 0 ) || ( tx_bytes == SOCKET_ERROR ) )
if ( tx_bytes == SOCKET_ERROR )
return tx_bytes; return tx_bytes;
} }
} }
@@ -472,7 +468,7 @@ namespace Jack
memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) ); memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) );
fNetAudioCaptureBuffer->RenderFromJackPorts ( subproc ); fNetAudioCaptureBuffer->RenderFromJackPorts ( subproc );
tx_bytes = Send ( fTxBuffer, fAudioTxLen, 0 ); tx_bytes = Send ( fTxBuffer, fAudioTxLen, 0 );
if ( ( tx_bytes == 0 ) || ( tx_bytes == SOCKET_ERROR ) )
if ( tx_bytes == SOCKET_ERROR )
return tx_bytes; return tx_bytes;
} }
} }


+ 2
- 0
windows/JackNetWinSocket.cpp View File

@@ -320,6 +320,8 @@ namespace Jack
return NET_NO_ERROR; return NET_NO_ERROR;
case WSAETIMEDOUT: case WSAETIMEDOUT:
return NET_NO_DATA; return NET_NO_DATA;
case WSAEWOULDBLOCK:
return NET_NO_DATA;
case WSAECONNREFUSED: case WSAECONNREFUSED:
return NET_CONN_ERROR; return NET_CONN_ERROR;
case WSAECONNRESET: case WSAECONNRESET:


Loading…
Cancel
Save