| 555 | /************************************************************************/ |
| 556 | |
| 557 | void CPLVirtualMemUnDeclareThread(CPLVirtualMem *ctxt) |
| 558 | { |
| 559 | if (ctxt->eType == VIRTUAL_MEM_TYPE_FILE_MEMORY_MAPPED) |
| 560 | return; |
| 561 | #ifndef HAVE_5ARGS_MREMAP |
| 562 | CPLVirtualMemVMA *ctxtVMA = reinterpret_cast<CPLVirtualMemVMA *>(ctxt); |
| 563 | pthread_t self = pthread_self(); |
| 564 | IGNORE_OR_ASSERT_IN_DEBUG(!ctxt->bSingleThreadUsage); |
| 565 | CPLAcquireMutex(ctxtVMA->hMutexThreadArray, 1000.0); |
| 566 | for (int i = 0; i < ctxtVMA->nThreads; i++) |
| 567 | { |
| 568 | if (ctxtVMA->pahThreads[i] == self) |
| 569 | { |
| 570 | if (i < ctxtVMA->nThreads - 1) |
| 571 | memmove(ctxtVMA->pahThreads + i + 1, ctxtVMA->pahThreads + i, |
| 572 | (ctxtVMA->nThreads - 1 - i) * sizeof(pthread_t)); |
| 573 | ctxtVMA->nThreads--; |
| 574 | break; |
| 575 | } |
| 576 | } |
| 577 | |
| 578 | CPLReleaseMutex(ctxtVMA->hMutexThreadArray); |
| 579 | #endif |
| 580 | } |
| 581 | |
| 582 | /************************************************************************/ |
| 583 | /* CPLVirtualMemGetPageToFill() */ |