00001 #ifndef __J2K__Track_CPP__
00002 #define __J2K__Track_CPP__
00003
00004 #include "Track.hpp"
00005
00006 Track::Track( int i = 0 )
00007 : index( i ), reserved( 0L ), current( NULL )
00008 {
00009 memset( &segment, 0, sizeof( segment ) );
00010 memset( &length, 0, sizeof( length ) );
00011 memset( &segment.left, -1, sizeof( segment.left ) );
00012 memset( &segment.right, -1, sizeof( segment.right ) );
00013
00014 segment.bit_name = i;
00015
00016 occupied.set( 1 );
00017 lock.set( 1 );
00018 }
00019
00020 Track::Track( track_segment_t seg )
00021 : index( seg.bit_name ), reserved( 0L ), current( NULL )
00022 {
00023 memset( &length, 0, sizeof( double ) * 10 );
00024 memcpy( &segment, &seg, sizeof( seg ) );
00025
00026 occupied.set( 1 );
00027 lock.set( 1 );
00028 }
00029
00030 Track::Track( track_init_t init, track_segment_t seg, double* l )
00031 : index( seg.bit_name ), reserved( 0L ), current( NULL )
00032 {
00033 memcpy( &length, l, sizeof( double ) * 10 );
00034 memcpy( &segment, &seg, sizeof( seg ) );
00035
00036 occupied.set( 1 );
00037 lock.set( 1 );
00038
00039
00040 assert( init.max_left < 10 );
00041 assert( init.max_right < 10 );
00042 assert( seg.max_left < 10 );
00043 assert( seg.max_right < 10 );
00044
00045 assert( seg.bit_name >= init.start_bit );
00046 assert( seg.bit_name <= init.end_bit );
00047 assert( seg.max_left <= init.max_left );
00048 assert( seg.max_right <= init.max_right );
00049
00050 assert( seg.left[ seg.max_left ] == -1 );
00051 assert( seg.right[ seg.max_right ] == -1 );
00052 }
00053
00054 Track::~Track()
00055 {
00056
00057 }
00058
00059
00060 BOOL Track::isEmpty()
00061 {
00062 lock.P();
00063 register int b = ( current == NULL );
00064 register int v = occupied.get();
00065 lock.V();
00066
00067 return ( v >= 0 && b );
00068 }
00069
00070
00071 BOOL Track::isFull()
00072 {
00073 lock.P();
00074 register int b = ( current != NULL );
00075 register int v = occupied.get();
00076 lock.V();
00077
00078 return ( v >= 0 && b );
00079 }
00080
00081 long Track::isReserved()
00082 {
00083 lock.P();
00084 register int b = ( current == NULL );
00085 register int r = reserved;
00086 lock.V();
00087
00088 if ( b ) return -1;
00089 return r;
00090 }
00091
00092 Train* Track::getTrain()
00093 {
00094 return current;
00095 }
00096
00097 long Track::setTrain()
00098 {
00099 return setTrain( NULL, 0 );
00100 }
00101
00102 long Track::setTrain( Train* t, long r = 1 )
00103 {
00104 lock.P();
00105 if ( current != NULL )
00106 {
00107 if ( current->isStronger( t, r ) )
00108 {
00109 lock.V();
00110 return -1;
00111 }
00112 else
00113 {
00114 current->notify( t, r );
00115 }
00116 } else {
00117
00118 occupied.P();
00119 }
00120
00121 current = t;
00122 reserved = r;
00123
00124 lock.V();
00125 return r;
00126 }
00127
00128 long Track::getLeft( size_t index )
00129 {
00130 register long rtn = -1;
00131
00132 lock.P();
00133 if ( (long)index <= segment.max_left ) {
00134 rtn = segment.left[ index ];
00135 }
00136 lock.V();
00137
00138 return rtn;
00139 }
00140
00141 long Track::getRight( size_t index )
00142 {
00143 register long rtn = -1;
00144
00145 lock.P();
00146 if ( (long)index <= segment.max_right ) {
00147 rtn = segment.right[ index ];
00148 }
00149 lock.V();
00150
00151 return rtn;
00152 }
00153
00154 long Track::getLeftEmpty( Track** tracks )
00155 {
00156 register long i = 0;
00157 register long t = 0;
00158 register BOOL e = FALSE;
00159
00160 lock.P();
00161
00162 for( ; i < segment.max_left; i++ )
00163 {
00164 t = segment.left[ i ];
00165 e = tracks[ t ]->isEmpty();
00166
00167 if ( e ) {
00168 lock.V();
00169 return t;
00170 }
00171 }
00172
00173 lock.V();
00174
00175 return -1;
00176 }
00177
00178 long Track::getRightEmpty( Track** tracks )
00179 {
00180 register long i = 0;
00181 register long t = 0;
00182 register BOOL e = FALSE;
00183
00184 lock.P();
00185
00186 for( ; i < segment.max_right; i++ )
00187 {
00188 t = segment.right[ i ];
00189 e = tracks[ t ]->isEmpty();
00190
00191 if ( e ) {
00192 lock.V();
00193 return t;
00194 }
00195 }
00196
00197 lock.V();
00198
00199 return -1;
00200 }
00201
00202 long Track::getMaxLeft()
00203 {
00204 lock.P();
00205 register long l = segment.max_left;
00206 lock.V();
00207
00208 return l;
00209 }
00210
00211 long Track::getMaxRight()
00212 {
00213 lock.P();
00214 register long l = segment.max_right;
00215 lock.V();
00216
00217 return l;
00218 }
00219
00220 double Track::getLength( size_t index = 0 )
00221 {
00222 lock.P();
00223 register double d = length[ index ];
00224 lock.V();
00225
00226 return d;
00227 }
00228
00229 track_type_t Track::getType( size_t index = 0 )
00230 {
00231 lock.P();
00232 register track_type_t i = segment.type[ index ];
00233 lock.V();
00234
00235 return i;
00236 }
00237
00238 long Track::getLengthName( size_t index = 0 )
00239 {
00240 lock.P();
00241 register long l = segment.length_name[ index ];
00242 lock.V();
00243
00244 return l;
00245 }
00246
00247 #endif
00248