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);
      }
  }
Ejemplo n.º 3
0
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();
    }
}