00001 #ifndef __J2K__TFTP_Timeout_CPP__
00002 #define __J2K__TFTP_Timeout_CPP__
00003
00004 #include <j2k/Net/TFTP/TFTP_Timeout.hpp>
00005 #define DEAD 4
00006
00007
00008
00009
00010 TFTP_Timeout::TFTP_Timeout() : Timer( 0000000, 10 )
00011 {
00012 dataEmpty = 0;
00013 waitEmpty = 0;
00014 elapsed = 10.000;
00015 packet = NULL;
00016 timeout = option.getTimeOutValue();
00017
00018
00019 option.currentTime = 0;
00020
00021
00022
00023 }
00024
00025 void TFTP_Timeout::timedRun( int signalNo )
00026 {
00027 option.currentTime += elapsed;
00028
00029
00030
00031 option.rwlock6_wait_queue.write();
00032 option.waitingAck_queue->setFirst();
00033 long rc = 0;
00034 while ( rc >= 0 ) {
00035
00036
00037
00038 rc = option.waitingAck_queue->findTimeStamp( option.currentTime );
00039
00040
00041
00042 if ( rc < 0 )
00043 {
00044
00045
00046 }
00047
00048 if ( rc >= 0 ) {
00049
00050 packet = option.waitingAck_queue->remove();
00051
00052
00053
00054 packet->resent++;
00055
00056
00057 if ( packet->resent > 10 )
00058 {
00059 SendNotDefinedError( "ERROR: 10 Timeouts. Connection closed.\n" );
00060 exit( 1 );
00061 }
00062
00063 printf( "Resending Data, packet Timed out! \n" );
00064 fflush(stdout);
00065 packet->send();
00066 packet->setTimeStamp( option.currentTime + timeout );
00067 option.waitingAck_queue->enqueue( packet );
00068 fflush(stdout);
00069 }
00070 }
00071
00072 if ( option.waitingAck_queue->isEmpty() )
00073 {
00074 waitEmpty++;
00075 } else {
00076 waitEmpty = 0;
00077 }
00078
00079 option.rwlock6_wait_queue.releaseWrite();
00080
00081 option.rwlock5_data_queue.read();
00082 if ( option.data_queue->isEmpty() )
00083 {
00084 dataEmpty++;
00085 } else {
00086 dataEmpty = 0;
00087 }
00088
00089 option.rwlock5_data_queue.releaseRead();
00090
00091 if ( ( dataEmpty > DEAD || waitEmpty > DEAD ) && ( option.isReading() || option.isWriting() ) )
00092 {
00093 exit( 0 );
00094 }
00095 }
00096
00097 #endif