** Warning **
Issuing rollback() due to DESTROY without explicit disconnect() of DBD::mysql::db handle dbname=MITgcm at /usr/local/share/lxr/lib/LXR/Common.pm line 1224.
Last-Modified: Tue, 16 Feb 2026 06:09:17 GMT
Content-Type: text/html; charset=utf-8
MITgcm/MITgcm/tools/TAP_support/ADFirstAidKit/admm.c
File indexing completed on 2023-05-28 05:10:56 UTC
view on github raw file Latest commit b4daa243 on 2023-05-28 03:53:22 UTC
b4daa24319 Shre* 0001
0002
0003
0004
0005
0006
0007
0008 #include <stdlib.h>
0009 #include <stdio.h>
0010 #include <assert.h>
0011 #include "admm.h "
0012
0013 #include <time.h>
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 #ifdef ADMM_COUNTS
0025 int numberOfRegisterings = 0 ;
0026 int numberOfUnregisterings = 0 ;
0027 int numberOfChunks = 0 ;
0028 int peakNumberOfChunks = 0 ;
0029 int numberOfRebases = 0 ;
0030 int numberOfWaitings = 0 ;
0031 int peakNumberOfWaitings = 0 ;
0032 #endif
0033
0034 #ifdef ADMM_TIME
0035 double timeSpentInADMM = 0.0 ;
0036 clock_t startADMMTime , endADMMTime ;
0037 #endif
0038
0039 #ifdef ADMM_TIME_SEARCHING
0040 double timeSpentSearching = 0.0 ;
0041 clock_t startSearchTime , endSearchTime ;
0042 #endif
0043
0044
0045 typedef struct _ADMM_List {
0046 void * head ;
0047 struct _ADMM_List * tail ;
0048 } ADMM_List ;
0049
0050 typedef enum {BYBASE , BYOBASE , BYBASEB , BYOBASEB } ADMM_AddrSort ;
0051
0052
0053 typedef struct {
0054
0055 void * bases [4] ;
0056 int sizeInBytes ;
0057 int sizeInBytesb ;
0058 int nbElements ;
0059 } ADMM_ChunkInfo ;
0060
0061 typedef struct {
0062 void ** pp ;
0063 void ** ppb ;
0064 } ADMM_WaitingAddress ;
0065
0066 ADMM_List admm_chunksByBaseCell = {NULL , NULL } ;
0067 ADMM_List admm_chunksByObaseCell = {NULL , NULL } ;
0068 ADMM_List admm_chunksByBasebCell = {NULL , NULL } ;
0069 ADMM_List admm_chunksByObasebCell = {NULL , NULL } ;
0070 ADMM_List * admm_chunksLists [] =
0071 {&admm_chunksByBaseCell , &admm_chunksByObaseCell , &admm_chunksByBasebCell , &admm_chunksByObasebCell };
0072
0073 ADMM_List admm_waitingRebasesRoot = {NULL , NULL } ;
0074 ADMM_List *admm_waitingRebases = &admm_waitingRebasesRoot ;
0075
0076
0077 void ADMM_insertChunkInfo (ADMM_ChunkInfo * newChunkInfo , void * base, ADMM_AddrSort index ) {
0078 ADMM_List *toList = admm_chunksLists [index ] ;
0079
0080 while (toList ->tail && ((ADMM_ChunkInfo *)toList ->tail ->head )->bases [index ]<base) {
0081 toList = toList ->tail ;
0082 }
0083
0084 ADMM_List * newCell = (ADMM_List *)malloc (sizeof (ADMM_List )) ;
0085 newCell ->head = newChunkInfo ;
0086 newCell ->tail = toList ->tail ;
0087 toList ->tail = newCell ;
0088 }
0089
0090 ADMM_ChunkInfo * ADMM_searchBase (void * base, ADMM_AddrSort index ) {
0091 ADMM_List *inList = admm_chunksLists [index ]->tail ;
0092 ADMM_ChunkInfo * chunk ;
0093
0094 while (inList ) {
0095 chunk = (ADMM_ChunkInfo *)inList ->head ;
0096 if (chunk ->bases [index ]==base) return chunk ;
0097 inList = inList ->tail ;
0098 }
0099 return NULL ;
0100 }
0101
0102 ADMM_ChunkInfo * ADMM_searchAddress (void * address, ADMM_AddrSort index ) {
0103 ADMM_List *inList = admm_chunksLists [index ]->tail ;
0104 ADMM_ChunkInfo * chunk ;
0105
0106 while (inList ) {
0107 chunk = (ADMM_ChunkInfo *)inList ->head ;
0108 if (chunk ->bases [index ]<=address &&
0109 address<(chunk ->bases [index ]+(index <BYBASEB ?chunk ->sizeInBytes :chunk ->sizeInBytesb )))
0110 return chunk ;
0111 inList = inList ->tail ;
0112 }
0113 return NULL ;
0114 }
0115
0116 void ADMM_removeChunkInfo (ADMM_ChunkInfo * chunkInfo , ADMM_AddrSort index ) {
0117 ADMM_List *toList = admm_chunksLists [index ] ;
0118
0119 while (toList ->tail ) {
0120 if (toList ->tail ->head ==chunkInfo ) {
0121 ADMM_List * cell = toList ->tail ;
0122 toList ->tail = cell ->tail ;
0123 free(cell ) ;
0124 return ;
0125 }
0126 toList = toList ->tail ;
0127 }
0128 }
0129
0130 void ADMM_findRanksInWaitings (void ** pointer, void ** pointerb, long * indexInWait , long * numberInWait ) {
0131
0132 ADMM_List * inWaitingRebases = admm_waitingRebases ->tail ;
0133 ADMM_WaitingAddress * waitingAddress ;
0134 *indexInWait = 0 ;
0135 *numberInWait = 0 ;
0136 while (inWaitingRebases ) {
0137 waitingAddress = (ADMM_WaitingAddress *)inWaitingRebases ->head ;
0138 ++(*numberInWait );
0139 if (waitingAddress ->pp ==pointer && waitingAddress ->ppb ==pointerb) *indexInWait = *numberInWait ;
0140 inWaitingRebases = inWaitingRebases ->tail ;
0141 }
0142 }
0143
0144 void ADMM_addWaitingRebase (void ** pointer, void ** pointerb) {
0145
0146
0147
0148 ADMM_List * inWaitingRebases = admm_waitingRebases ->tail ;
0149 ADMM_WaitingAddress * waitingAddress ;
0150 int found = 0 ;
0151 #ifdef ADMM_TIME_SEARCHING
0152 startSearchTime = clock() ;
0153 #endif
0154 while (!found && inWaitingRebases ) {
0155 waitingAddress = (ADMM_WaitingAddress *)inWaitingRebases ->head ;
0156 found = (waitingAddress ->pp ==pointer && waitingAddress ->ppb ==pointerb) ;
0157 inWaitingRebases = inWaitingRebases ->tail ;
0158 }
0159 #ifdef ADMM_TIME_SEARCHING
0160 endSearchTime = clock() ;
0161 timeSpentSearching += ((double )(endSearchTime -startSearchTime ))/((double )CLOCKS_PER_SEC) ;
0162 #endif
0163
0164 if (!found ) {
0165 ADMM_List *newCell = (ADMM_List *)malloc (sizeof (ADMM_List )) ;
0166 newCell ->tail = admm_waitingRebases ->tail ;
0167 newCell ->head = (ADMM_WaitingAddress *)malloc (sizeof (ADMM_WaitingAddress )) ;
0168 #ifdef ADMM_COUNTS
0169 ++numberOfWaitings ;
0170 if (peakNumberOfWaitings <numberOfWaitings ) peakNumberOfWaitings = numberOfWaitings ;
0171 #endif
0172 ((ADMM_WaitingAddress *)newCell ->head )->pp = pointer ;
0173 ((ADMM_WaitingAddress *)newCell ->head )->ppb = pointerb ;
0174 admm_waitingRebases ->tail = newCell ;
0175 }
0176 }
0177
0178
0179
0180 int ADMM_chunkInfoShadowedSolvesWaiting (ADMM_ChunkInfo * chunk , ADMM_WaitingAddress * waitingAddress ) {
0181 int match = 0 ;
0182 if (waitingAddress ->pp && *(waitingAddress ->pp ))
0183 match = (chunk ->bases [BYOBASE ]<=*(waitingAddress ->pp )
0184 && *(waitingAddress ->pp )<(chunk ->bases [BYOBASE ]+chunk ->sizeInBytes )) ;
0185 else if (waitingAddress ->ppb && *(waitingAddress ->ppb ))
0186 match = (chunk ->bases [BYOBASEB ]<=*(waitingAddress ->ppb )
0187 && *(waitingAddress ->ppb )<(chunk ->bases [BYOBASEB ]+chunk ->sizeInBytesb )) ;
0188 if (match ) {
0189 if (waitingAddress ->pp && *(waitingAddress ->pp ))
0190 *(waitingAddress ->pp ) = chunk ->bases [BYBASE ]+(*(waitingAddress ->pp )-chunk ->bases [BYOBASE ]) ;
0191 if (waitingAddress ->ppb && *(waitingAddress ->ppb ))
0192 *(waitingAddress ->ppb ) = chunk ->bases [BYBASEB ]+(*(waitingAddress ->ppb )-chunk ->bases [BYOBASEB ]) ;
0193 #ifdef ADMM_COUNTS
0194 ++numberOfRebases ;
0195 #endif
0196 return 1 ;
0197 } else
0198 return 0 ;
0199 }
0200
0201
0202
0203 int ADMM_chunkInfoSolvesWaiting (ADMM_ChunkInfo * chunk , ADMM_WaitingAddress * waitingAddress ) {
0204 int match = (waitingAddress ->pp && *(waitingAddress ->pp )
0205 && chunk ->bases [BYOBASE ]<=*(waitingAddress ->pp )
0206 && *(waitingAddress ->pp )<(chunk ->bases [BYOBASE ]+chunk ->sizeInBytes )) ;
0207 if (match ) {
0208 *(waitingAddress ->pp ) = chunk ->bases [BYBASE ]+(*(waitingAddress ->pp )-chunk ->bases [BYOBASE ]) ;
0209 #ifdef ADMM_COUNTS
0210 ++numberOfRebases ;
0211 #endif
0212 return 1 ;
0213 } else
0214 return 0 ;
0215 }
0216
0217
0218
0219 void ADMM_cleanDeadWaitingsShadowed (void *base, int size , void *baseb, int sizeb) {
0220 ADMM_List * inWaitingRebases = admm_waitingRebases ;
0221 ADMM_List * waitingCell ;
0222 #ifdef ADMM_TIME_SEARCHING
0223 startSearchTime = clock() ;
0224 #endif
0225 while (inWaitingRebases ->tail ) {
0226 waitingCell = inWaitingRebases ->tail ;
0227 if (
0228 (base <= (void *)((ADMM_WaitingAddress *)waitingCell ->head )->pp &&
0229 (void *)((ADMM_WaitingAddress *)waitingCell ->head )->pp < base+size )
0230 ||
0231 (baseb && ((ADMM_WaitingAddress *)waitingCell ->head )->ppb &&
0232 baseb <= (void *)((ADMM_WaitingAddress *)waitingCell ->head )->ppb &&
0233 (void *)((ADMM_WaitingAddress *)waitingCell ->head )->ppb < baseb+sizeb)
0234 ) {
0235 #ifdef ADMM_TRACE
0236 printf(" clean waiting [%li]->%li Shadow:[%li]->%li\n" , ((ADMM_WaitingAddress *)waitingCell ->head )->pp , (((ADMM_WaitingAddress *)waitingCell ->head )->pp ?*(((ADMM_WaitingAddress *)waitingCell ->head )->pp ):NULL ), ((ADMM_WaitingAddress *)waitingCell ->head )->ppb , (((ADMM_WaitingAddress *)waitingCell ->head )->ppb ?*(((ADMM_WaitingAddress *)waitingCell ->head )->ppb ):NULL )) ;
0237 fflush(stdout);
0238 #endif
0239 inWaitingRebases ->tail = inWaitingRebases ->tail ->tail ;
0240 free(waitingCell ->head ) ;
0241 free(waitingCell ) ;
0242 #ifdef ADMM_COUNTS
0243 --numberOfWaitings ;
0244 #endif
0245 } else
0246 inWaitingRebases = inWaitingRebases ->tail ;
0247 }
0248 #ifdef ADMM_TIME_SEARCHING
0249 endSearchTime = clock() ;
0250 timeSpentSearching += ((double )(endSearchTime -startSearchTime ))/((double )CLOCKS_PER_SEC) ;
0251 #endif
0252 }
0253
0254 void ADMM_registerShadowed (void *base, void *obase, int sizeInBytes , void *baseb, void **alreadyRebasedb, void *obaseb, int sizeInBytesb , int nbElements
0255 #ifdef ADMM_LABELS
0256 , char *label ) {
0257 #else
0258 ) {char *label = "" ;
0259 #endif
0260 #ifdef ADMM_TIME
0261 startADMMTime = clock() ;
0262 #endif
0263 int rebasePhase = (obaseb!=0) ;
0264 ADMM_ChunkInfo * newChunkInfo = (ADMM_ChunkInfo *)malloc (sizeof (ADMM_ChunkInfo )) ;
0265 #ifdef ADMM_COUNTS
0266 ++numberOfChunks ;
0267 if (numberOfChunks >peakNumberOfChunks ) peakNumberOfChunks = numberOfChunks ;
0268 ++numberOfRegisterings ;
0269 #endif
0270 #ifdef ADMM_TRACE
0271 if (rebasePhase )
0272 printf("ADMM_register (old:%li=>)%li+%i Shadow: (old:%li=>)%li+%i \"%s\"\n" , obase, base, sizeInBytes , obaseb, baseb, sizeInBytesb , label );
0273 else
0274 printf("ADMM_register %li+%i Shadow: %li+%i \"%s\"\n" , base, sizeInBytes , baseb, sizeInBytesb , label );
0275 fflush(stdout);
0276 #endif
0277 if (!rebasePhase ) {obase = base; obaseb = baseb;}
0278 newChunkInfo ->bases [0] = base ;
0279 newChunkInfo ->bases [1] = obase ;
0280 newChunkInfo ->bases [2] = baseb ;
0281 newChunkInfo ->bases [3] = obaseb ;
0282 newChunkInfo ->sizeInBytes = sizeInBytes ;
0283 newChunkInfo ->sizeInBytesb = sizeInBytesb ;
0284 newChunkInfo ->nbElements = nbElements ;
0285 #ifdef ADMM_TIME_SEARCHING
0286 startSearchTime = clock() ;
0287 #endif
0288 ADMM_insertChunkInfo (newChunkInfo , base, BYBASE ) ;
0289 ADMM_insertChunkInfo (newChunkInfo , obase, BYOBASE ) ;
0290 ADMM_insertChunkInfo (newChunkInfo , baseb, BYBASEB ) ;
0291 ADMM_insertChunkInfo (newChunkInfo , obaseb, BYOBASEB ) ;
0292 if (rebasePhase ) {
0293
0294 ADMM_List * inWaitingRebases = admm_waitingRebases ;
0295 ADMM_List * waitingCell ;
0296 while (inWaitingRebases ->tail ) {
0297 waitingCell = inWaitingRebases ->tail ;
0298 #ifdef ADMM_TRACE
0299 printf(" ...retry rebase [%li]->%li Shadow:[%li]->%li ?" , ((ADMM_WaitingAddress *)waitingCell ->head )->pp , (((ADMM_WaitingAddress *)waitingCell ->head )->pp ?*(((ADMM_WaitingAddress *)waitingCell ->head )->pp ):NULL ), ((ADMM_WaitingAddress *)waitingCell ->head )->ppb , (((ADMM_WaitingAddress *)waitingCell ->head )->ppb ?*(((ADMM_WaitingAddress *)waitingCell ->head )->ppb ):NULL )) ;
0300 fflush(stdout);
0301 #endif
0302 if (alreadyRebasedb==((ADMM_WaitingAddress *)waitingCell ->head )->ppb ) {
0303 #ifdef ADMM_TRACE
0304 printf(" now done => [%li]->%li Shadow:[%li]->%li !\n" , ((ADMM_WaitingAddress *)waitingCell ->head )->pp , (((ADMM_WaitingAddress *)waitingCell ->head )->pp ?*(((ADMM_WaitingAddress *)waitingCell ->head )->pp ):NULL ), ((ADMM_WaitingAddress *)waitingCell ->head )->ppb , (((ADMM_WaitingAddress *)waitingCell ->head )->ppb ?*(((ADMM_WaitingAddress *)waitingCell ->head )->ppb ):NULL )) ;
0305 fflush(stdout);
0306 #endif
0307 inWaitingRebases ->tail = inWaitingRebases ->tail ->tail ;
0308 free(waitingCell ->head ) ;
0309 free(waitingCell ) ;
0310 } else if (ADMM_chunkInfoShadowedSolvesWaiting (newChunkInfo , (ADMM_WaitingAddress *)waitingCell ->head )) {
0311 #ifdef ADMM_TRACE
0312 printf(" yes => [%li]->%li Shadow:[%li]->%li !\n" , ((ADMM_WaitingAddress *)waitingCell ->head )->pp , (((ADMM_WaitingAddress *)waitingCell ->head )->pp ?*(((ADMM_WaitingAddress *)waitingCell ->head )->pp ):NULL ), ((ADMM_WaitingAddress *)waitingCell ->head )->ppb , (((ADMM_WaitingAddress *)waitingCell ->head )->ppb ?*(((ADMM_WaitingAddress *)waitingCell ->head )->ppb ):NULL )) ;
0313 fflush(stdout);
0314 #endif
0315 inWaitingRebases ->tail = inWaitingRebases ->tail ->tail ;
0316 free(waitingCell ->head ) ;
0317 free(waitingCell ) ;
0318 #ifdef ADMM_COUNTS
0319 --numberOfWaitings ;
0320 #endif
0321 } else {
0322 #ifdef ADMM_TRACE
0323 printf(" no, try again later!\n" ) ;
0324 fflush(stdout);
0325 #endif
0326 inWaitingRebases = inWaitingRebases ->tail ;
0327 }
0328 }
0329 }
0330 #ifdef ADMM_TIME_SEARCHING
0331 endSearchTime = clock() ;
0332 timeSpentSearching += ((double )(endSearchTime -startSearchTime ))/((double )CLOCKS_PER_SEC) ;
0333 #endif
0334 #ifdef ADMM_TIME
0335 endADMMTime = clock() ;
0336 timeSpentInADMM += ((double )(endADMMTime -startADMMTime ))/((double )CLOCKS_PER_SEC) ;
0337 #endif
0338 }
0339
0340 void ADMM_register (void *base, void **alreadyRebased, void *obase, int sizeInBytes , int nbElements
0341 #ifdef ADMM_LABELS
0342 , char *label ) {
0343 #else
0344 ) {char *label = "" ;
0345 #endif
0346 #ifdef ADMM_TIME
0347 startADMMTime = clock() ;
0348 #endif
0349 int rebasePhase = (obase!=0) ;
0350 ADMM_ChunkInfo * newChunkInfo = (ADMM_ChunkInfo *)malloc (sizeof (ADMM_ChunkInfo )) ;
0351 #ifdef ADMM_COUNTS
0352 ++numberOfChunks ;
0353 if (numberOfChunks >peakNumberOfChunks ) peakNumberOfChunks = numberOfChunks ;
0354 ++numberOfRegisterings ;
0355 #endif
0356 #ifdef ADMM_TRACE
0357 if (rebasePhase )
0358 printf("ADMM_register (old:%li=>)%li+%i \"%s\"\n" , obase, base, sizeInBytes , label );
0359 else
0360 printf("ADMM_register %li+%i \"%s\"\n" , base, sizeInBytes , label );
0361 fflush(stdout);
0362 #endif
0363 if (!rebasePhase ) obase = base ;
0364 newChunkInfo ->bases [0] = base ;
0365 newChunkInfo ->bases [1] = obase ;
0366 newChunkInfo ->bases [2] = NULL ;
0367 newChunkInfo ->bases [3] = NULL ;
0368 newChunkInfo ->sizeInBytes = sizeInBytes ;
0369 newChunkInfo ->sizeInBytesb = 0 ;
0370 newChunkInfo ->nbElements = nbElements ;
0371 #ifdef ADMM_TIME_SEARCHING
0372 startSearchTime = clock() ;
0373 #endif
0374 ADMM_insertChunkInfo (newChunkInfo , base, BYBASE ) ;
0375 ADMM_insertChunkInfo (newChunkInfo , obase, BYOBASE ) ;
0376 if (rebasePhase ) {
0377
0378
0379
0380
0381 ADMM_List * inWaitingRebases = admm_waitingRebases ;
0382 ADMM_List * waitingCell ;
0383 while (inWaitingRebases ->tail ) {
0384 waitingCell = inWaitingRebases ->tail ;
0385 #ifdef ADMM_TRACE
0386 printf(" ...retry rebase [%li]->%li ?" , ((ADMM_WaitingAddress *)waitingCell ->head )->pp , (((ADMM_WaitingAddress *)waitingCell ->head )->pp ?*(((ADMM_WaitingAddress *)waitingCell ->head )->pp ):NULL )) ;
0387 fflush(stdout);
0388 #endif
0389 if (alreadyRebased==((ADMM_WaitingAddress *)waitingCell ->head )->pp ) {
0390 #ifdef ADMM_TRACE
0391 printf(" now done => [%li]->%li !\n" , ((ADMM_WaitingAddress *)waitingCell ->head )->pp , (((ADMM_WaitingAddress *)waitingCell ->head )->pp ?*(((ADMM_WaitingAddress *)waitingCell ->head )->pp ):NULL )) ;
0392 fflush(stdout);
0393 #endif
0394 inWaitingRebases ->tail = inWaitingRebases ->tail ->tail ;
0395 free(waitingCell ->head ) ;
0396 free(waitingCell ) ;
0397 } else if (ADMM_chunkInfoSolvesWaiting (newChunkInfo , (ADMM_WaitingAddress *)waitingCell ->head )) {
0398 #ifdef ADMM_TRACE
0399 printf(" yes => [%li]->%li !\n" , ((ADMM_WaitingAddress *)waitingCell ->head )->pp , (((ADMM_WaitingAddress *)waitingCell ->head )->pp ?*(((ADMM_WaitingAddress *)waitingCell ->head )->pp ):NULL )) ;
0400 fflush(stdout);
0401 #endif
0402 inWaitingRebases ->tail = inWaitingRebases ->tail ->tail ;
0403 free(waitingCell ->head ) ;
0404 free(waitingCell ) ;
0405 #ifdef ADMM_COUNTS
0406 --numberOfWaitings ;
0407 #endif
0408 } else {
0409 #ifdef ADMM_TRACE
0410 printf(" no, try again later!\n" ) ;
0411 fflush(stdout);
0412 #endif
0413 inWaitingRebases = inWaitingRebases ->tail ;
0414 }
0415 }
0416 }
0417 #ifdef ADMM_TIME_SEARCHING
0418 endSearchTime = clock() ;
0419 timeSpentSearching += ((double )(endSearchTime -startSearchTime ))/((double )CLOCKS_PER_SEC) ;
0420 #endif
0421 #ifdef ADMM_TIME
0422 endADMMTime = clock() ;
0423 timeSpentInADMM += ((double )(endADMMTime -startADMMTime ))/((double )CLOCKS_PER_SEC) ;
0424 #endif
0425 }
0426
0427 void ADMM_unregisterShadowed (void *base, void *baseb, int *nbElements
0428 #ifdef ADMM_LABELS
0429 , char *label ) {
0430 #else
0431 ) {char *label = "" ;
0432 #endif
0433 #ifdef ADMM_TIME
0434 startADMMTime = clock() ;
0435 #endif
0436 #ifdef ADMM_TRACE
0437 printf("ADMM_unregister %li Shadow: %li \"%s\"\n" , base, baseb, label );
0438 fflush(stdout);
0439 #endif
0440 ADMM_ChunkInfo * foundChunkInfo = NULL ;
0441 #ifdef ADMM_TIME_SEARCHING
0442 startSearchTime = clock() ;
0443 #endif
0444 if (baseb)
0445 foundChunkInfo = ADMM_searchBase (baseb, BYBASEB ) ;
0446 if (!foundChunkInfo )
0447 foundChunkInfo = ADMM_searchBase (base, BYBASE ) ;
0448 #ifdef ADMM_TIME_SEARCHING
0449 endSearchTime = clock() ;
0450 timeSpentSearching += ((double )(endSearchTime -startSearchTime ))/((double )CLOCKS_PER_SEC) ;
0451 #endif
0452 if (foundChunkInfo ) {
0453 *nbElements = foundChunkInfo ->nbElements ;
0454 #ifdef ADMM_TIME_SEARCHING
0455 startSearchTime = clock() ;
0456 #endif
0457 ADMM_removeChunkInfo (foundChunkInfo , BYBASE ) ;
0458 ADMM_removeChunkInfo (foundChunkInfo , BYOBASE ) ;
0459 ADMM_removeChunkInfo (foundChunkInfo , BYBASEB ) ;
0460 ADMM_removeChunkInfo (foundChunkInfo , BYOBASEB ) ;
0461 #ifdef ADMM_TIME_SEARCHING
0462 endSearchTime = clock() ;
0463 timeSpentSearching += ((double )(endSearchTime -startSearchTime ))/((double )CLOCKS_PER_SEC) ;
0464 #endif
0465 ADMM_cleanDeadWaitingsShadowed (base, foundChunkInfo ->sizeInBytes , baseb, foundChunkInfo ->sizeInBytesb ) ;
0466 free(foundChunkInfo ) ;
0467 #ifdef ADMM_COUNTS
0468 ++numberOfUnregisterings ;
0469 --numberOfChunks ;
0470 #endif
0471 }
0472 #ifdef ADMM_TIME
0473 endADMMTime = clock() ;
0474 timeSpentInADMM += ((double )(endADMMTime -startADMMTime ))/((double )CLOCKS_PER_SEC) ;
0475 #endif
0476 }
0477
0478 void ADMM_unregister (void *base, int *nbElements
0479 #ifdef ADMM_LABELS
0480 , char *label ) {
0481 #else
0482 ) {char *label = "" ;
0483 #endif
0484 #ifdef ADMM_TIME
0485 startADMMTime = clock() ;
0486 #endif
0487 #ifdef ADMM_TRACE
0488 printf("ADMM_unregister %li \"%s\"\n" , base, label );
0489 fflush(stdout);
0490 #endif
0491 #ifdef ADMM_TIME_SEARCHING
0492 startSearchTime = clock() ;
0493 #endif
0494 ADMM_ChunkInfo * foundChunkInfo = ADMM_searchBase (base, BYBASE ) ;
0495 #ifdef ADMM_TIME_SEARCHING
0496 endSearchTime = clock() ;
0497 timeSpentSearching += ((double )(endSearchTime -startSearchTime ))/((double )CLOCKS_PER_SEC) ;
0498 #endif
0499 if (foundChunkInfo ) {
0500 *nbElements = foundChunkInfo ->nbElements ;
0501 #ifdef ADMM_TIME_SEARCHING
0502 startSearchTime = clock() ;
0503 #endif
0504 ADMM_removeChunkInfo (foundChunkInfo , BYBASE ) ;
0505 ADMM_removeChunkInfo (foundChunkInfo , BYOBASE ) ;
0506 #ifdef ADMM_TIME_SEARCHING
0507 endSearchTime = clock() ;
0508 timeSpentSearching += ((double )(endSearchTime -startSearchTime ))/((double )CLOCKS_PER_SEC) ;
0509 #endif
0510 ADMM_cleanDeadWaitingsShadowed (base, foundChunkInfo ->sizeInBytes , NULL , 0) ;
0511 free(foundChunkInfo ) ;
0512 #ifdef ADMM_COUNTS
0513 ++numberOfUnregisterings ;
0514 --numberOfChunks ;
0515 #endif
0516 }
0517 #ifdef ADMM_TIME
0518 endADMMTime = clock() ;
0519 timeSpentInADMM += ((double )(endADMMTime -startADMMTime ))/((double )CLOCKS_PER_SEC) ;
0520 #endif
0521 }
0522
0523 void ADMM_rebaseShadowed (void ** pointer, void ** pointerb
0524 #ifdef ADMM_LABELS
0525 , char *label ) {
0526 #else
0527 ) {char *label = "" ;
0528 #endif
0529 #ifdef ADMM_TIME
0530 startADMMTime = clock() ;
0531 #endif
0532 #ifdef ADMM_TRACE
0533 printf(" ADMM_rebase [%li]->%li Shadow:[%li]->%li \"%s\" ?" , pointer, (pointer?*pointer:NULL ), pointerb, (pointerb?*pointerb:NULL ), label ) ;
0534 fflush(stdout);
0535 #endif
0536 ADMM_ChunkInfo * foundChunkInfo = NULL ;
0537 #ifdef ADMM_TIME_SEARCHING
0538 startSearchTime = clock() ;
0539 #endif
0540 if (*pointerb)
0541 foundChunkInfo = ADMM_searchAddress (*pointerb, BYOBASEB ) ;
0542 if (!foundChunkInfo && pointer && *pointer)
0543 foundChunkInfo = ADMM_searchAddress (*pointer, BYOBASE ) ;
0544 #ifdef ADMM_TIME_SEARCHING
0545 endSearchTime = clock() ;
0546 timeSpentSearching += ((double )(endSearchTime -startSearchTime ))/((double )CLOCKS_PER_SEC) ;
0547 #endif
0548 if (foundChunkInfo ) {
0549 if (pointer && *pointer)
0550 *pointer = foundChunkInfo ->bases [BYBASE ]+(*pointer-foundChunkInfo ->bases [BYOBASE ]) ;
0551 if (*pointerb)
0552 *pointerb = foundChunkInfo ->bases [BYBASEB ]+(*pointerb-foundChunkInfo ->bases [BYOBASEB ]) ;
0553 #ifdef ADMM_TRACE
0554 printf(" yes => [%li]->%li Shadow:[%li]->%li !\n" , pointer, (pointer?*pointer:NULL ), pointerb, (pointerb?*pointerb:NULL )) ;
0555 printf(" from (old:%li=>)%li+%i Shadow: (old:%li=>)%li+%i\n" , foundChunkInfo ->bases [BYOBASE ], foundChunkInfo ->bases [BYBASE ], foundChunkInfo ->sizeInBytes , foundChunkInfo ->bases [BYOBASEB ], foundChunkInfo ->bases [BYBASEB ], foundChunkInfo ->sizeInBytesb );
0556 fflush(stdout);
0557 #endif
0558 } else if ((pointer && *pointer) || *pointerb) {
0559 ADMM_addWaitingRebase (pointer, pointerb) ;
0560 #ifdef ADMM_TRACE
0561 long indexInWait , numberInWait ;
0562 ADMM_findRanksInWaitings (pointer, pointerb, &indexInWait , &numberInWait ) ;
0563 printf(" no => add to waiting list [%li/%li]\n" ,indexInWait ,numberInWait ) ;
0564 fflush(stdout);
0565 #endif
0566 } else {
0567 #ifdef ADMM_TRACE
0568 printf(".\n" ) ;
0569 fflush(stdout);
0570 #endif
0571 }
0572 #ifdef ADMM_COUNTS
0573 ++numberOfRebases ;
0574 #endif
0575 #ifdef ADMM_TIME
0576 endADMMTime = clock() ;
0577 timeSpentInADMM += ((double )(endADMMTime -startADMMTime ))/((double )CLOCKS_PER_SEC) ;
0578 #endif
0579 }
0580
0581
0582 void ADMM_rebase (void ** pointer
0583 #ifdef ADMM_LABELS
0584 , char *label ) {
0585 #else
0586 ) {char *label = "" ;
0587 #endif
0588 #ifdef ADMM_TIME
0589 startADMMTime = clock() ;
0590 #endif
0591 #ifdef ADMM_TRACE
0592 printf(" ADMM_rebase [%li]->%li \"%s\" ?" , pointer, (pointer?*pointer:NULL ), label ) ;
0593 fflush(stdout);
0594 #endif
0595 ADMM_ChunkInfo * foundChunkInfo = NULL ;
0596 if (*pointer) {
0597 #ifdef ADMM_TIME_SEARCHING
0598 startSearchTime = clock() ;
0599 #endif
0600 foundChunkInfo = ADMM_searchAddress (*pointer, BYOBASE ) ;
0601 #ifdef ADMM_TIME_SEARCHING
0602 endSearchTime = clock() ;
0603 timeSpentSearching += ((double )(endSearchTime -startSearchTime ))/((double )CLOCKS_PER_SEC) ;
0604 #endif
0605 if (foundChunkInfo ) {
0606 *pointer = foundChunkInfo ->bases [BYBASE ]+(*pointer-foundChunkInfo ->bases [BYOBASE ]) ;
0607 #ifdef ADMM_TRACE
0608 printf(" yes => [%li]->%li !\n" , pointer, (pointer?*pointer:NULL )) ;
0609 printf(" from (old:%li=>)%li+%i Shadow: (old:%li=>)%li+%i\n" , foundChunkInfo ->bases [BYOBASE ], foundChunkInfo ->bases [BYBASE ], foundChunkInfo ->sizeInBytes , foundChunkInfo ->bases [BYOBASEB ], foundChunkInfo ->bases [BYBASEB ], foundChunkInfo ->sizeInBytesb );
0610 fflush(stdout);
0611 #endif
0612 } else {
0613 ADMM_addWaitingRebase (pointer, NULL ) ;
0614 #ifdef ADMM_TRACE
0615 long indexInWait , numberInWait ;
0616 ADMM_findRanksInWaitings (pointer, NULL , &indexInWait , &numberInWait ) ;
0617 printf(" no => add to waiting list [%li/%li]\n" ,indexInWait ,numberInWait ) ;
0618 fflush(stdout);
0619 #endif
0620 }
0621 } else {
0622 #ifdef ADMM_TRACE
0623 printf(".\n" ) ;
0624 fflush(stdout);
0625 #endif
0626 }
0627 #ifdef ADMM_COUNTS
0628 ++numberOfRebases ;
0629 #endif
0630 #ifdef ADMM_TIME
0631 endADMMTime = clock() ;
0632 timeSpentInADMM += ((double )(endADMMTime -startADMMTime ))/((double )CLOCKS_PER_SEC) ;
0633 #endif
0634 }
0635
0636 #ifdef ADMM_COUNTS
0637 void ADMM_showChunks () {
0638 ADMM_List * inChunksByBaseCell = admm_chunksByBaseCell .tail ;
0639 ADMM_ChunkInfo * chunkInfo ;
0640 printf("CHUNKS LIST:\n" ) ;
0641 while (inChunksByBaseCell ) {
0642 chunkInfo = ((ADMM_ChunkInfo *)inChunksByBaseCell ->head ) ;
0643 printf(" (old:%li=>)%li+%i Shadow: (old:%li=>)%li+%i (%i elements)\n" ,
0644 chunkInfo ->bases [BYOBASE ], chunkInfo ->bases [BYBASE ], chunkInfo ->sizeInBytes ,
0645 chunkInfo ->bases [BYOBASEB ], chunkInfo ->bases [BYBASEB ], chunkInfo ->sizeInBytesb ,
0646 chunkInfo ->nbElements );
0647 inChunksByBaseCell = inChunksByBaseCell ->tail ;
0648 }
0649 fflush(stdout);
0650 }
0651 #endif
0652
0653 #ifdef ADMM_COUNTS
0654 void ADMM_showWaitings () {
0655 ADMM_List * inWaitingRebases = admm_waitingRebases ->tail ;
0656 ADMM_WaitingAddress * waitingAddress ;
0657 printf("WAITING LIST:\n" ) ;
0658 while (inWaitingRebases ) {
0659 waitingAddress = (ADMM_WaitingAddress *)inWaitingRebases ->head ;
0660 printf(" [%li]->%li Shadow:[%li]->%li %x %x \n" ,
0661 waitingAddress ->pp , (waitingAddress ->pp ?*(waitingAddress ->pp ):NULL ),
0662 waitingAddress ->ppb , (waitingAddress ->ppb ?*(waitingAddress ->ppb ):NULL ),
0663 waitingAddress ->pp , waitingAddress ->ppb );
0664 inWaitingRebases = inWaitingRebases ->tail ;
0665 }
0666 printf("\n" );
0667 fflush(stdout);
0668 }
0669 #endif
0670
0671 void ADMM_statistics () {
0672 #ifdef ADMM_TIME
0673 printf("Time spent in ADMM:%lf\n" , timeSpentInADMM ) ;
0674 #endif
0675 #ifdef ADMM_TIME_SEARCHING
0676 printf("Time spent searching:%lf\n" , timeSpentSearching ) ;
0677 #endif
0678 #ifdef ADMM_COUNTS
0679 printf("Registerings:%i, Unregisterings:%i, numberOfRebases:%i\n" ,
0680 numberOfRegisterings , numberOfUnregisterings , numberOfRebases ) ;
0681 printf("chunks:%i[peak:%i] waiting:%i[peak:%i]\n" ,
0682 numberOfChunks , peakNumberOfChunks , numberOfWaitings , peakNumberOfWaitings );
0683 ADMM_showChunks () ;
0684 ADMM_showWaitings () ;
0685 #endif
0686 fflush(stdout);
0687 }