void FDirectoryWatcherWindows::Tick( float DeltaSeconds ) { TArray<HANDLE> DirectoryHandles; TMap<FString, FDirectoryWatchRequestWindows*> InvalidRequestsToDelete; // Find all handles to listen to and invalid requests to delete for (TMap<FString, FDirectoryWatchRequestWindows*>::TConstIterator RequestIt(RequestMap); RequestIt; ++RequestIt) { if ( RequestIt.Value()->IsPendingDelete() ) { InvalidRequestsToDelete.Add(RequestIt.Key(), RequestIt.Value()); } else { DirectoryHandles.Add(RequestIt.Value()->GetDirectoryHandle()); } } // Remove all invalid requests from the request map and add them to the pending delete list so they will be deleted below for (TMap<FString, FDirectoryWatchRequestWindows*>::TConstIterator RequestIt(InvalidRequestsToDelete); RequestIt; ++RequestIt) { RequestMap.Remove(RequestIt.Key()); RequestsPendingDelete.AddUnique(RequestIt.Value()); } // Trigger any file changed delegates that are queued up if ( DirectoryHandles.Num() > 0 ) { MsgWaitForMultipleObjectsEx(DirectoryHandles.Num(), DirectoryHandles.GetData(), 0, QS_ALLEVENTS, MWMO_ALERTABLE); } // Delete any stale or invalid requests for ( int32 RequestIdx = RequestsPendingDelete.Num() - 1; RequestIdx >= 0; --RequestIdx ) { FDirectoryWatchRequestWindows* Request = RequestsPendingDelete[RequestIdx]; if ( Request->IsPendingDelete() ) { // This request is safe to delete. Delete and remove it from the list delete Request; NumRequests--; RequestsPendingDelete.RemoveAt(RequestIdx); } } // Finally, trigger any file change notification delegates for (TMap<FString, FDirectoryWatchRequestWindows*>::TConstIterator RequestIt(RequestMap); RequestIt; ++RequestIt) { RequestIt.Value()->ProcessPendingNotifications(); } }
// Generic method implementing fake blocking call requests int RequestBlockingCall(int callerFrameworkId, int producerBindKey, int requestId, unsigned int & streamSize, uvm_ml_stream_t stream, bool & useTrueBlocking, uvm_ml_time_unit & timeUnit, double & timeValue, unsigned int * respstreamSize = NULL, uvm_ml_stream_t respstream = NULL, uvm_ml_time * delay = NULL) { BpConnectionClass * provider = BpInterconnect::GetSingleProvider(callerFrameworkId, producerBindKey); // Meantime implemented only the preepmptive blocking call assert (BpInterconnect::FrameworksCompatibleBlocking(*BpInterconnect::GetFramework(callerFrameworkId), *(provider->GetFrmw()))); // TBD: issue a proper error if (BpInterconnect::GetFramework(callerFrameworkId)->SupportsTrueBlocking() && provider->GetFrmw()->SupportsTrueBlocking()) { useTrueBlocking = true; return DoIt(*provider, streamSize, stream, respstreamSize, respstream, delay, timeUnit, timeValue); } else { useTrueBlocking = false; return RequestIt(*provider, requestId, callerFrameworkId, streamSize, stream, respstreamSize, respstream, delay, timeUnit, timeValue); } }
FDirectoryWatcherLinux::~FDirectoryWatcherLinux() { #if WITH_DIRECTORY_WATCHER if (RequestMap.Num() != 0) { // Delete any remaining requests here. These requests are likely from modules which are still loaded at the time that this module unloads. for (TMap<FString, FDirectoryWatchRequestLinux*>::TConstIterator RequestIt(RequestMap); RequestIt; ++RequestIt) { if (ensure(RequestIt.Value())) { delete RequestIt.Value(); NumRequests--; } } RequestMap.Empty(); } if (RequestsPendingDelete.Num() != 0) { for (int32 RequestIdx = 0; RequestIdx < RequestsPendingDelete.Num(); ++RequestIdx) { delete RequestsPendingDelete[RequestIdx]; NumRequests--; } } #endif // WITH_DIRECTORY_WATCHER // Make sure every request that was created is destroyed ensure(NumRequests == 0); }
FDirectoryWatcherWindows::~FDirectoryWatcherWindows() { if ( RequestMap.Num() != 0 ) { // Delete any remaining requests here. These requests are likely from modules which are still loaded at the time that this module unloads. for (TMap<FString, FDirectoryWatchRequestWindows*>::TConstIterator RequestIt(RequestMap); RequestIt; ++RequestIt) { if ( ensure(RequestIt.Value()) ) { // make sure we end the watch request, as we may get a callback if a request is in flight RequestIt.Value()->EndWatchRequest(); delete RequestIt.Value(); NumRequests--; } } RequestMap.Empty(); } if ( RequestsPendingDelete.Num() != 0 ) { for ( int32 RequestIdx = 0; RequestIdx < RequestsPendingDelete.Num(); ++RequestIdx ) { delete RequestsPendingDelete[RequestIdx]; NumRequests--; } } // Make sure every request that was created is destroyed ensure(NumRequests == 0); }
void FDirectoryWatcherMac::Tick( float DeltaSeconds ) { // Delete unregistered requests for ( int32 RequestIdx = RequestsPendingDelete.Num() - 1; RequestIdx >= 0; --RequestIdx ) { FDirectoryWatchRequestMac* Request = RequestsPendingDelete[RequestIdx]; delete Request; NumRequests--; RequestsPendingDelete.RemoveAt(RequestIdx); } // Trigger any file change notification delegates for (TMap<FString, FDirectoryWatchRequestMac*>::TConstIterator RequestIt(RequestMap); RequestIt; ++RequestIt) { RequestIt.Value()->ProcessPendingNotifications(); } }