Main Page   Packages   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Search  

C:/temp/src/j2k/nto/bak2/Track.cpp

Go to the documentation of this file.
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 ); // Empty
00017   lock.set( 1 );     // Unlock
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 ); // Empty
00027   lock.set( 1 );     // Unlock
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 ); // Empty
00037   lock.set( 1 );     // Unlock
00038 
00039   // Verify boundaries
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   // Unlock, clean up
00057 }
00058 
00059 // v = 1 means that someone can take the lock
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 // v = 0 means that someone must wait to get the lock
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;               // Wait buddy, I'm more important !
00111       } 
00112       else 
00113       {
00114         current->notify( t, r ); // Damn, I lost the track permission !
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 

Generated on Sun Oct 14 18:46:37 2001 for Standard J2K Library by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001