2019-12-26 15:32:37 -05:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
2014-07-17 13:49:42 -04:00
|
|
|
|
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 3209340)
#lockdown Nick.Penwarden
#rb none
==========================
MAJOR FEATURES + CHANGES
==========================
Change 3209340 on 2016/11/23 by Ben.Marsh
Convert UE4 codebase to an "include what you use" model - where every header just includes the dependencies it needs, rather than every source file including large monolithic headers like Engine.h and UnrealEd.h.
Measured full rebuild times around 2x faster using XGE on Windows, and improvements of 25% or more for incremental builds and full rebuilds on most other platforms.
* Every header now includes everything it needs to compile.
* There's a CoreMinimal.h header that gets you a set of ubiquitous types from Core (eg. FString, FName, TArray, FVector, etc...). Most headers now include this first.
* There's a CoreTypes.h header that sets up primitive UE4 types and build macros (int32, PLATFORM_WIN64, etc...). All headers in Core include this first, as does CoreMinimal.h.
* Every .cpp file includes its matching .h file first.
* This helps validate that each header is including everything it needs to compile.
* No engine code includes a monolithic header such as Engine.h or UnrealEd.h any more.
* You will get a warning if you try to include one of these from the engine. They still exist for compatibility with game projects and do not produce warnings when included there.
* There have only been minor changes to our internal games down to accommodate these changes. The intent is for this to be as seamless as possible.
* No engine code explicitly includes a precompiled header any more.
* We still use PCHs, but they're force-included on the compiler command line by UnrealBuildTool instead. This lets us tune what they contain without breaking any existing include dependencies.
* PCHs are generated by a tool to get a statistical amount of coverage for the source files using it, and I've seeded the new shared PCHs to contain any header included by > 15% of source files.
Tool used to generate this transform is at Engine\Source\Programs\IncludeTool.
[CL 3209342 by Ben Marsh in Main branch]
2016-11-23 15:48:37 -05:00
|
|
|
#include "Linux/DirectoryWatcherLinux.h"
|
|
|
|
|
#include "DirectoryWatcherPrivate.h"
|
2014-07-17 13:49:42 -04:00
|
|
|
|
|
|
|
|
FDirectoryWatcherLinux::FDirectoryWatcherLinux()
|
|
|
|
|
{
|
|
|
|
|
NumRequests = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FDirectoryWatcherLinux::~FDirectoryWatcherLinux()
|
|
|
|
|
{
|
|
|
|
|
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--;
|
|
|
|
|
}
|
|
|
|
|
}
|
2015-05-13 11:15:57 -04:00
|
|
|
|
2014-07-17 13:49:42 -04:00
|
|
|
// Make sure every request that was created is destroyed
|
|
|
|
|
ensure(NumRequests == 0);
|
|
|
|
|
}
|
|
|
|
|
|
Clean up Linux inotify warnings and potential leaks
We still have some duplicate inotify watches, but this first pass will spew a lot more information when we hit inotify limits.
Adds a "DumpINotifyStats" command in non-release builds
Spews global inotify & UE stats, along with physical count of directories, etc.
Canonicalize directory path in FDirectoryWatcherLinux::RegisterDirectoryChangedCallback_Handle
Shootergame was adding 141 duplicate watches for Samples/Games/ShooterGame/Content w/o this. Was 1136, is now 995.
Change PathsToWatchDescriptors tmap to PathNameHashSet
Don't need to store full paths for each watch directory twice
Fix bugs in TestPAL in addition to adding DumpStats() command, which looks ~ like this:
LogDirectoryWatcher: Warning: inotify limits
LogDirectoryWatcher: Warning: max_queued_events: 16384
LogDirectoryWatcher: Warning: max_user_instances: 128
LogDirectoryWatcher: Warning: max_user_watches: 65536
LogDirectoryWatcher: Warning: inotify per-process stats
LogDirectoryWatcher: Warning: systemd (pid 2239) watches:23 instances:3
...
LogDirectoryWatcher: Warning: plugin_host-3.3 (pid 395041) watches:62 instances:1
LogDirectoryWatcher: Warning: plugin_host-3.8 (pid 395044) watches:62 instances:1
LogDirectoryWatcher: Warning: TestPAL (pid 396852) watches:2 instances:1
LogDirectoryWatcher: Warning: Total inotify Watches:392 Instances:28
LogDirectoryWatcher: Warning: Current watch requests
LogDirectoryWatcher: Warning: /var/tmp/DirectoryWatcherTest396852: 2 watches
LogDirectoryWatcher: Warning: Total count:2
The above is also dumped (once) when we fail to init or add a inotify watch.
Need to create better documentation and add a pointer to it, similar to what VSCode does: (hat tip Brandon)
https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-changes-in-this-large-workspace-error-enospc
Related bugs:
; FPS BP Cooking Content - errno = 28, Out of inotify watches
https://jira.it.epicgames.com/browse/UE-125210
; inotify Warnings when Cooking Content for Linux
https://jira.it.epicgames.com/browse/UE-119696
; Time Niagara Sequencer failed to play | Error: Couldn't find file for package
https://jira.it.epicgames.com/browse/UE-89750
; inotify warnings from Linux command line builds
https://jira.it.epicgames.com/browse/UE-76562
#review-17483609 @Brandon.Schaefer, @James.Singer
#jira UE-76562, UE-89750, UE-119696, UE-125210
[CL 17498916 by Michael Sartain in ue5-main branch]
2021-09-13 19:04:54 -04:00
|
|
|
bool FDirectoryWatcherLinux::RegisterDirectoryChangedCallback_Handle(const FString& InDirectory, const FDirectoryChanged& InDelegate, FDelegateHandle& OutHandle, uint32 Flags)
|
2015-01-08 09:29:27 -05:00
|
|
|
{
|
Clean up Linux inotify warnings and potential leaks
We still have some duplicate inotify watches, but this first pass will spew a lot more information when we hit inotify limits.
Adds a "DumpINotifyStats" command in non-release builds
Spews global inotify & UE stats, along with physical count of directories, etc.
Canonicalize directory path in FDirectoryWatcherLinux::RegisterDirectoryChangedCallback_Handle
Shootergame was adding 141 duplicate watches for Samples/Games/ShooterGame/Content w/o this. Was 1136, is now 995.
Change PathsToWatchDescriptors tmap to PathNameHashSet
Don't need to store full paths for each watch directory twice
Fix bugs in TestPAL in addition to adding DumpStats() command, which looks ~ like this:
LogDirectoryWatcher: Warning: inotify limits
LogDirectoryWatcher: Warning: max_queued_events: 16384
LogDirectoryWatcher: Warning: max_user_instances: 128
LogDirectoryWatcher: Warning: max_user_watches: 65536
LogDirectoryWatcher: Warning: inotify per-process stats
LogDirectoryWatcher: Warning: systemd (pid 2239) watches:23 instances:3
...
LogDirectoryWatcher: Warning: plugin_host-3.3 (pid 395041) watches:62 instances:1
LogDirectoryWatcher: Warning: plugin_host-3.8 (pid 395044) watches:62 instances:1
LogDirectoryWatcher: Warning: TestPAL (pid 396852) watches:2 instances:1
LogDirectoryWatcher: Warning: Total inotify Watches:392 Instances:28
LogDirectoryWatcher: Warning: Current watch requests
LogDirectoryWatcher: Warning: /var/tmp/DirectoryWatcherTest396852: 2 watches
LogDirectoryWatcher: Warning: Total count:2
The above is also dumped (once) when we fail to init or add a inotify watch.
Need to create better documentation and add a pointer to it, similar to what VSCode does: (hat tip Brandon)
https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-changes-in-this-large-workspace-error-enospc
Related bugs:
; FPS BP Cooking Content - errno = 28, Out of inotify watches
https://jira.it.epicgames.com/browse/UE-125210
; inotify Warnings when Cooking Content for Linux
https://jira.it.epicgames.com/browse/UE-119696
; Time Niagara Sequencer failed to play | Error: Couldn't find file for package
https://jira.it.epicgames.com/browse/UE-89750
; inotify warnings from Linux command line builds
https://jira.it.epicgames.com/browse/UE-76562
#review-17483609 @Brandon.Schaefer, @James.Singer
#jira UE-76562, UE-89750, UE-119696, UE-125210
[CL 17498916 by Michael Sartain in ue5-main branch]
2021-09-13 19:04:54 -04:00
|
|
|
// Make sure the path is absolute. Without this, we were missing and duplicating some directories.
|
|
|
|
|
FString WatchDirectory = FPaths::ConvertRelativePathToFull(InDirectory);
|
|
|
|
|
FDirectoryWatchRequestLinux** RequestPtr = RequestMap.Find(WatchDirectory);
|
2015-01-08 09:29:27 -05:00
|
|
|
FDirectoryWatchRequestLinux* Request = NULL;
|
|
|
|
|
|
|
|
|
|
if (RequestPtr)
|
|
|
|
|
{
|
|
|
|
|
// There should be no NULL entries in the map
|
|
|
|
|
check (*RequestPtr);
|
|
|
|
|
|
|
|
|
|
Request = *RequestPtr;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Request = new FDirectoryWatchRequestLinux();
|
|
|
|
|
NumRequests++;
|
|
|
|
|
|
|
|
|
|
// Begin reading directory changes
|
Clean up Linux inotify warnings and potential leaks
We still have some duplicate inotify watches, but this first pass will spew a lot more information when we hit inotify limits.
Adds a "DumpINotifyStats" command in non-release builds
Spews global inotify & UE stats, along with physical count of directories, etc.
Canonicalize directory path in FDirectoryWatcherLinux::RegisterDirectoryChangedCallback_Handle
Shootergame was adding 141 duplicate watches for Samples/Games/ShooterGame/Content w/o this. Was 1136, is now 995.
Change PathsToWatchDescriptors tmap to PathNameHashSet
Don't need to store full paths for each watch directory twice
Fix bugs in TestPAL in addition to adding DumpStats() command, which looks ~ like this:
LogDirectoryWatcher: Warning: inotify limits
LogDirectoryWatcher: Warning: max_queued_events: 16384
LogDirectoryWatcher: Warning: max_user_instances: 128
LogDirectoryWatcher: Warning: max_user_watches: 65536
LogDirectoryWatcher: Warning: inotify per-process stats
LogDirectoryWatcher: Warning: systemd (pid 2239) watches:23 instances:3
...
LogDirectoryWatcher: Warning: plugin_host-3.3 (pid 395041) watches:62 instances:1
LogDirectoryWatcher: Warning: plugin_host-3.8 (pid 395044) watches:62 instances:1
LogDirectoryWatcher: Warning: TestPAL (pid 396852) watches:2 instances:1
LogDirectoryWatcher: Warning: Total inotify Watches:392 Instances:28
LogDirectoryWatcher: Warning: Current watch requests
LogDirectoryWatcher: Warning: /var/tmp/DirectoryWatcherTest396852: 2 watches
LogDirectoryWatcher: Warning: Total count:2
The above is also dumped (once) when we fail to init or add a inotify watch.
Need to create better documentation and add a pointer to it, similar to what VSCode does: (hat tip Brandon)
https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-changes-in-this-large-workspace-error-enospc
Related bugs:
; FPS BP Cooking Content - errno = 28, Out of inotify watches
https://jira.it.epicgames.com/browse/UE-125210
; inotify Warnings when Cooking Content for Linux
https://jira.it.epicgames.com/browse/UE-119696
; Time Niagara Sequencer failed to play | Error: Couldn't find file for package
https://jira.it.epicgames.com/browse/UE-89750
; inotify warnings from Linux command line builds
https://jira.it.epicgames.com/browse/UE-76562
#review-17483609 @Brandon.Schaefer, @James.Singer
#jira UE-76562, UE-89750, UE-119696, UE-125210
[CL 17498916 by Michael Sartain in ue5-main branch]
2021-09-13 19:04:54 -04:00
|
|
|
if (!Request->Init(WatchDirectory, Flags))
|
2015-01-08 09:29:27 -05:00
|
|
|
{
|
Clean up Linux inotify warnings and potential leaks
We still have some duplicate inotify watches, but this first pass will spew a lot more information when we hit inotify limits.
Adds a "DumpINotifyStats" command in non-release builds
Spews global inotify & UE stats, along with physical count of directories, etc.
Canonicalize directory path in FDirectoryWatcherLinux::RegisterDirectoryChangedCallback_Handle
Shootergame was adding 141 duplicate watches for Samples/Games/ShooterGame/Content w/o this. Was 1136, is now 995.
Change PathsToWatchDescriptors tmap to PathNameHashSet
Don't need to store full paths for each watch directory twice
Fix bugs in TestPAL in addition to adding DumpStats() command, which looks ~ like this:
LogDirectoryWatcher: Warning: inotify limits
LogDirectoryWatcher: Warning: max_queued_events: 16384
LogDirectoryWatcher: Warning: max_user_instances: 128
LogDirectoryWatcher: Warning: max_user_watches: 65536
LogDirectoryWatcher: Warning: inotify per-process stats
LogDirectoryWatcher: Warning: systemd (pid 2239) watches:23 instances:3
...
LogDirectoryWatcher: Warning: plugin_host-3.3 (pid 395041) watches:62 instances:1
LogDirectoryWatcher: Warning: plugin_host-3.8 (pid 395044) watches:62 instances:1
LogDirectoryWatcher: Warning: TestPAL (pid 396852) watches:2 instances:1
LogDirectoryWatcher: Warning: Total inotify Watches:392 Instances:28
LogDirectoryWatcher: Warning: Current watch requests
LogDirectoryWatcher: Warning: /var/tmp/DirectoryWatcherTest396852: 2 watches
LogDirectoryWatcher: Warning: Total count:2
The above is also dumped (once) when we fail to init or add a inotify watch.
Need to create better documentation and add a pointer to it, similar to what VSCode does: (hat tip Brandon)
https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-changes-in-this-large-workspace-error-enospc
Related bugs:
; FPS BP Cooking Content - errno = 28, Out of inotify watches
https://jira.it.epicgames.com/browse/UE-125210
; inotify Warnings when Cooking Content for Linux
https://jira.it.epicgames.com/browse/UE-119696
; Time Niagara Sequencer failed to play | Error: Couldn't find file for package
https://jira.it.epicgames.com/browse/UE-89750
; inotify warnings from Linux command line builds
https://jira.it.epicgames.com/browse/UE-76562
#review-17483609 @Brandon.Schaefer, @James.Singer
#jira UE-76562, UE-89750, UE-119696, UE-125210
[CL 17498916 by Michael Sartain in ue5-main branch]
2021-09-13 19:04:54 -04:00
|
|
|
UE_LOG(LogDirectoryWatcher, Warning, TEXT("Failed to begin reading directory changes for %s."), *WatchDirectory);
|
2015-01-08 09:29:27 -05:00
|
|
|
delete Request;
|
|
|
|
|
NumRequests--;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
Clean up Linux inotify warnings and potential leaks
We still have some duplicate inotify watches, but this first pass will spew a lot more information when we hit inotify limits.
Adds a "DumpINotifyStats" command in non-release builds
Spews global inotify & UE stats, along with physical count of directories, etc.
Canonicalize directory path in FDirectoryWatcherLinux::RegisterDirectoryChangedCallback_Handle
Shootergame was adding 141 duplicate watches for Samples/Games/ShooterGame/Content w/o this. Was 1136, is now 995.
Change PathsToWatchDescriptors tmap to PathNameHashSet
Don't need to store full paths for each watch directory twice
Fix bugs in TestPAL in addition to adding DumpStats() command, which looks ~ like this:
LogDirectoryWatcher: Warning: inotify limits
LogDirectoryWatcher: Warning: max_queued_events: 16384
LogDirectoryWatcher: Warning: max_user_instances: 128
LogDirectoryWatcher: Warning: max_user_watches: 65536
LogDirectoryWatcher: Warning: inotify per-process stats
LogDirectoryWatcher: Warning: systemd (pid 2239) watches:23 instances:3
...
LogDirectoryWatcher: Warning: plugin_host-3.3 (pid 395041) watches:62 instances:1
LogDirectoryWatcher: Warning: plugin_host-3.8 (pid 395044) watches:62 instances:1
LogDirectoryWatcher: Warning: TestPAL (pid 396852) watches:2 instances:1
LogDirectoryWatcher: Warning: Total inotify Watches:392 Instances:28
LogDirectoryWatcher: Warning: Current watch requests
LogDirectoryWatcher: Warning: /var/tmp/DirectoryWatcherTest396852: 2 watches
LogDirectoryWatcher: Warning: Total count:2
The above is also dumped (once) when we fail to init or add a inotify watch.
Need to create better documentation and add a pointer to it, similar to what VSCode does: (hat tip Brandon)
https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-changes-in-this-large-workspace-error-enospc
Related bugs:
; FPS BP Cooking Content - errno = 28, Out of inotify watches
https://jira.it.epicgames.com/browse/UE-125210
; inotify Warnings when Cooking Content for Linux
https://jira.it.epicgames.com/browse/UE-119696
; Time Niagara Sequencer failed to play | Error: Couldn't find file for package
https://jira.it.epicgames.com/browse/UE-89750
; inotify warnings from Linux command line builds
https://jira.it.epicgames.com/browse/UE-76562
#review-17483609 @Brandon.Schaefer, @James.Singer
#jira UE-76562, UE-89750, UE-119696, UE-125210
[CL 17498916 by Michael Sartain in ue5-main branch]
2021-09-13 19:04:54 -04:00
|
|
|
RequestMap.Add(WatchDirectory, Request);
|
2015-01-08 09:29:27 -05:00
|
|
|
}
|
|
|
|
|
|
2019-01-08 09:58:31 -05:00
|
|
|
OutHandle = Request->AddDelegate(InDelegate, Flags);
|
2015-01-08 09:29:27 -05:00
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-25 20:17:42 -04:00
|
|
|
|
Clean up Linux inotify warnings and potential leaks
We still have some duplicate inotify watches, but this first pass will spew a lot more information when we hit inotify limits.
Adds a "DumpINotifyStats" command in non-release builds
Spews global inotify & UE stats, along with physical count of directories, etc.
Canonicalize directory path in FDirectoryWatcherLinux::RegisterDirectoryChangedCallback_Handle
Shootergame was adding 141 duplicate watches for Samples/Games/ShooterGame/Content w/o this. Was 1136, is now 995.
Change PathsToWatchDescriptors tmap to PathNameHashSet
Don't need to store full paths for each watch directory twice
Fix bugs in TestPAL in addition to adding DumpStats() command, which looks ~ like this:
LogDirectoryWatcher: Warning: inotify limits
LogDirectoryWatcher: Warning: max_queued_events: 16384
LogDirectoryWatcher: Warning: max_user_instances: 128
LogDirectoryWatcher: Warning: max_user_watches: 65536
LogDirectoryWatcher: Warning: inotify per-process stats
LogDirectoryWatcher: Warning: systemd (pid 2239) watches:23 instances:3
...
LogDirectoryWatcher: Warning: plugin_host-3.3 (pid 395041) watches:62 instances:1
LogDirectoryWatcher: Warning: plugin_host-3.8 (pid 395044) watches:62 instances:1
LogDirectoryWatcher: Warning: TestPAL (pid 396852) watches:2 instances:1
LogDirectoryWatcher: Warning: Total inotify Watches:392 Instances:28
LogDirectoryWatcher: Warning: Current watch requests
LogDirectoryWatcher: Warning: /var/tmp/DirectoryWatcherTest396852: 2 watches
LogDirectoryWatcher: Warning: Total count:2
The above is also dumped (once) when we fail to init or add a inotify watch.
Need to create better documentation and add a pointer to it, similar to what VSCode does: (hat tip Brandon)
https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-changes-in-this-large-workspace-error-enospc
Related bugs:
; FPS BP Cooking Content - errno = 28, Out of inotify watches
https://jira.it.epicgames.com/browse/UE-125210
; inotify Warnings when Cooking Content for Linux
https://jira.it.epicgames.com/browse/UE-119696
; Time Niagara Sequencer failed to play | Error: Couldn't find file for package
https://jira.it.epicgames.com/browse/UE-89750
; inotify warnings from Linux command line builds
https://jira.it.epicgames.com/browse/UE-76562
#review-17483609 @Brandon.Schaefer, @James.Singer
#jira UE-76562, UE-89750, UE-119696, UE-125210
[CL 17498916 by Michael Sartain in ue5-main branch]
2021-09-13 19:04:54 -04:00
|
|
|
bool FDirectoryWatcherLinux::UnregisterDirectoryChangedCallback_Handle(const FString& InDirectory, FDelegateHandle InHandle)
|
2015-01-08 09:29:27 -05:00
|
|
|
{
|
Clean up Linux inotify warnings and potential leaks
We still have some duplicate inotify watches, but this first pass will spew a lot more information when we hit inotify limits.
Adds a "DumpINotifyStats" command in non-release builds
Spews global inotify & UE stats, along with physical count of directories, etc.
Canonicalize directory path in FDirectoryWatcherLinux::RegisterDirectoryChangedCallback_Handle
Shootergame was adding 141 duplicate watches for Samples/Games/ShooterGame/Content w/o this. Was 1136, is now 995.
Change PathsToWatchDescriptors tmap to PathNameHashSet
Don't need to store full paths for each watch directory twice
Fix bugs in TestPAL in addition to adding DumpStats() command, which looks ~ like this:
LogDirectoryWatcher: Warning: inotify limits
LogDirectoryWatcher: Warning: max_queued_events: 16384
LogDirectoryWatcher: Warning: max_user_instances: 128
LogDirectoryWatcher: Warning: max_user_watches: 65536
LogDirectoryWatcher: Warning: inotify per-process stats
LogDirectoryWatcher: Warning: systemd (pid 2239) watches:23 instances:3
...
LogDirectoryWatcher: Warning: plugin_host-3.3 (pid 395041) watches:62 instances:1
LogDirectoryWatcher: Warning: plugin_host-3.8 (pid 395044) watches:62 instances:1
LogDirectoryWatcher: Warning: TestPAL (pid 396852) watches:2 instances:1
LogDirectoryWatcher: Warning: Total inotify Watches:392 Instances:28
LogDirectoryWatcher: Warning: Current watch requests
LogDirectoryWatcher: Warning: /var/tmp/DirectoryWatcherTest396852: 2 watches
LogDirectoryWatcher: Warning: Total count:2
The above is also dumped (once) when we fail to init or add a inotify watch.
Need to create better documentation and add a pointer to it, similar to what VSCode does: (hat tip Brandon)
https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-changes-in-this-large-workspace-error-enospc
Related bugs:
; FPS BP Cooking Content - errno = 28, Out of inotify watches
https://jira.it.epicgames.com/browse/UE-125210
; inotify Warnings when Cooking Content for Linux
https://jira.it.epicgames.com/browse/UE-119696
; Time Niagara Sequencer failed to play | Error: Couldn't find file for package
https://jira.it.epicgames.com/browse/UE-89750
; inotify warnings from Linux command line builds
https://jira.it.epicgames.com/browse/UE-76562
#review-17483609 @Brandon.Schaefer, @James.Singer
#jira UE-76562, UE-89750, UE-119696, UE-125210
[CL 17498916 by Michael Sartain in ue5-main branch]
2021-09-13 19:04:54 -04:00
|
|
|
// Make sure the path is absolute
|
|
|
|
|
FString WatchDirectory = FPaths::ConvertRelativePathToFull(InDirectory);
|
|
|
|
|
FDirectoryWatchRequestLinux** RequestPtr = RequestMap.Find(WatchDirectory);
|
2015-01-08 09:29:27 -05:00
|
|
|
|
|
|
|
|
if (RequestPtr)
|
|
|
|
|
{
|
|
|
|
|
// There should be no NULL entries in the map
|
|
|
|
|
check (*RequestPtr);
|
|
|
|
|
|
|
|
|
|
FDirectoryWatchRequestLinux* Request = *RequestPtr;
|
|
|
|
|
|
|
|
|
|
if (Request->RemoveDelegate(InHandle))
|
|
|
|
|
{
|
|
|
|
|
if (!Request->HasDelegates())
|
|
|
|
|
{
|
|
|
|
|
// Remove from the active map and add to the pending delete list
|
Clean up Linux inotify warnings and potential leaks
We still have some duplicate inotify watches, but this first pass will spew a lot more information when we hit inotify limits.
Adds a "DumpINotifyStats" command in non-release builds
Spews global inotify & UE stats, along with physical count of directories, etc.
Canonicalize directory path in FDirectoryWatcherLinux::RegisterDirectoryChangedCallback_Handle
Shootergame was adding 141 duplicate watches for Samples/Games/ShooterGame/Content w/o this. Was 1136, is now 995.
Change PathsToWatchDescriptors tmap to PathNameHashSet
Don't need to store full paths for each watch directory twice
Fix bugs in TestPAL in addition to adding DumpStats() command, which looks ~ like this:
LogDirectoryWatcher: Warning: inotify limits
LogDirectoryWatcher: Warning: max_queued_events: 16384
LogDirectoryWatcher: Warning: max_user_instances: 128
LogDirectoryWatcher: Warning: max_user_watches: 65536
LogDirectoryWatcher: Warning: inotify per-process stats
LogDirectoryWatcher: Warning: systemd (pid 2239) watches:23 instances:3
...
LogDirectoryWatcher: Warning: plugin_host-3.3 (pid 395041) watches:62 instances:1
LogDirectoryWatcher: Warning: plugin_host-3.8 (pid 395044) watches:62 instances:1
LogDirectoryWatcher: Warning: TestPAL (pid 396852) watches:2 instances:1
LogDirectoryWatcher: Warning: Total inotify Watches:392 Instances:28
LogDirectoryWatcher: Warning: Current watch requests
LogDirectoryWatcher: Warning: /var/tmp/DirectoryWatcherTest396852: 2 watches
LogDirectoryWatcher: Warning: Total count:2
The above is also dumped (once) when we fail to init or add a inotify watch.
Need to create better documentation and add a pointer to it, similar to what VSCode does: (hat tip Brandon)
https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-changes-in-this-large-workspace-error-enospc
Related bugs:
; FPS BP Cooking Content - errno = 28, Out of inotify watches
https://jira.it.epicgames.com/browse/UE-125210
; inotify Warnings when Cooking Content for Linux
https://jira.it.epicgames.com/browse/UE-119696
; Time Niagara Sequencer failed to play | Error: Couldn't find file for package
https://jira.it.epicgames.com/browse/UE-89750
; inotify warnings from Linux command line builds
https://jira.it.epicgames.com/browse/UE-76562
#review-17483609 @Brandon.Schaefer, @James.Singer
#jira UE-76562, UE-89750, UE-119696, UE-125210
[CL 17498916 by Michael Sartain in ue5-main branch]
2021-09-13 19:04:54 -04:00
|
|
|
RequestMap.Remove(WatchDirectory);
|
2015-01-08 09:29:27 -05:00
|
|
|
RequestsPendingDelete.AddUnique(Request);
|
|
|
|
|
|
|
|
|
|
// Signal to end the watch which will mark this request for deletion
|
|
|
|
|
Request->EndWatchRequest();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2014-07-17 13:49:42 -04:00
|
|
|
void FDirectoryWatcherLinux::Tick(float DeltaSeconds)
|
|
|
|
|
{
|
|
|
|
|
// Delete unregistered requests
|
|
|
|
|
for (int32 RequestIdx = RequestsPendingDelete.Num() - 1; RequestIdx >= 0; --RequestIdx)
|
|
|
|
|
{
|
|
|
|
|
FDirectoryWatchRequestLinux* Request = RequestsPendingDelete[RequestIdx];
|
|
|
|
|
delete Request;
|
|
|
|
|
NumRequests--;
|
|
|
|
|
RequestsPendingDelete.RemoveAt(RequestIdx);
|
|
|
|
|
}
|
|
|
|
|
|
Clean up Linux inotify warnings and potential leaks
We still have some duplicate inotify watches, but this first pass will spew a lot more information when we hit inotify limits.
Adds a "DumpINotifyStats" command in non-release builds
Spews global inotify & UE stats, along with physical count of directories, etc.
Canonicalize directory path in FDirectoryWatcherLinux::RegisterDirectoryChangedCallback_Handle
Shootergame was adding 141 duplicate watches for Samples/Games/ShooterGame/Content w/o this. Was 1136, is now 995.
Change PathsToWatchDescriptors tmap to PathNameHashSet
Don't need to store full paths for each watch directory twice
Fix bugs in TestPAL in addition to adding DumpStats() command, which looks ~ like this:
LogDirectoryWatcher: Warning: inotify limits
LogDirectoryWatcher: Warning: max_queued_events: 16384
LogDirectoryWatcher: Warning: max_user_instances: 128
LogDirectoryWatcher: Warning: max_user_watches: 65536
LogDirectoryWatcher: Warning: inotify per-process stats
LogDirectoryWatcher: Warning: systemd (pid 2239) watches:23 instances:3
...
LogDirectoryWatcher: Warning: plugin_host-3.3 (pid 395041) watches:62 instances:1
LogDirectoryWatcher: Warning: plugin_host-3.8 (pid 395044) watches:62 instances:1
LogDirectoryWatcher: Warning: TestPAL (pid 396852) watches:2 instances:1
LogDirectoryWatcher: Warning: Total inotify Watches:392 Instances:28
LogDirectoryWatcher: Warning: Current watch requests
LogDirectoryWatcher: Warning: /var/tmp/DirectoryWatcherTest396852: 2 watches
LogDirectoryWatcher: Warning: Total count:2
The above is also dumped (once) when we fail to init or add a inotify watch.
Need to create better documentation and add a pointer to it, similar to what VSCode does: (hat tip Brandon)
https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-changes-in-this-large-workspace-error-enospc
Related bugs:
; FPS BP Cooking Content - errno = 28, Out of inotify watches
https://jira.it.epicgames.com/browse/UE-125210
; inotify Warnings when Cooking Content for Linux
https://jira.it.epicgames.com/browse/UE-119696
; Time Niagara Sequencer failed to play | Error: Couldn't find file for package
https://jira.it.epicgames.com/browse/UE-89750
; inotify warnings from Linux command line builds
https://jira.it.epicgames.com/browse/UE-76562
#review-17483609 @Brandon.Schaefer, @James.Singer
#jira UE-76562, UE-89750, UE-119696, UE-125210
[CL 17498916 by Michael Sartain in ue5-main branch]
2021-09-13 19:04:54 -04:00
|
|
|
FDirectoryWatchRequestLinux::ProcessNotifications(RequestMap);
|
2014-07-17 13:49:42 -04:00
|
|
|
}
|
Clean up Linux inotify warnings and potential leaks
We still have some duplicate inotify watches, but this first pass will spew a lot more information when we hit inotify limits.
Adds a "DumpINotifyStats" command in non-release builds
Spews global inotify & UE stats, along with physical count of directories, etc.
Canonicalize directory path in FDirectoryWatcherLinux::RegisterDirectoryChangedCallback_Handle
Shootergame was adding 141 duplicate watches for Samples/Games/ShooterGame/Content w/o this. Was 1136, is now 995.
Change PathsToWatchDescriptors tmap to PathNameHashSet
Don't need to store full paths for each watch directory twice
Fix bugs in TestPAL in addition to adding DumpStats() command, which looks ~ like this:
LogDirectoryWatcher: Warning: inotify limits
LogDirectoryWatcher: Warning: max_queued_events: 16384
LogDirectoryWatcher: Warning: max_user_instances: 128
LogDirectoryWatcher: Warning: max_user_watches: 65536
LogDirectoryWatcher: Warning: inotify per-process stats
LogDirectoryWatcher: Warning: systemd (pid 2239) watches:23 instances:3
...
LogDirectoryWatcher: Warning: plugin_host-3.3 (pid 395041) watches:62 instances:1
LogDirectoryWatcher: Warning: plugin_host-3.8 (pid 395044) watches:62 instances:1
LogDirectoryWatcher: Warning: TestPAL (pid 396852) watches:2 instances:1
LogDirectoryWatcher: Warning: Total inotify Watches:392 Instances:28
LogDirectoryWatcher: Warning: Current watch requests
LogDirectoryWatcher: Warning: /var/tmp/DirectoryWatcherTest396852: 2 watches
LogDirectoryWatcher: Warning: Total count:2
The above is also dumped (once) when we fail to init or add a inotify watch.
Need to create better documentation and add a pointer to it, similar to what VSCode does: (hat tip Brandon)
https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-changes-in-this-large-workspace-error-enospc
Related bugs:
; FPS BP Cooking Content - errno = 28, Out of inotify watches
https://jira.it.epicgames.com/browse/UE-125210
; inotify Warnings when Cooking Content for Linux
https://jira.it.epicgames.com/browse/UE-119696
; Time Niagara Sequencer failed to play | Error: Couldn't find file for package
https://jira.it.epicgames.com/browse/UE-89750
; inotify warnings from Linux command line builds
https://jira.it.epicgames.com/browse/UE-76562
#review-17483609 @Brandon.Schaefer, @James.Singer
#jira UE-76562, UE-89750, UE-119696, UE-125210
[CL 17498916 by Michael Sartain in ue5-main branch]
2021-09-13 19:04:54 -04:00
|
|
|
|
|
|
|
|
bool FDirectoryWatcherLinux::DumpStats()
|
|
|
|
|
{
|
|
|
|
|
FDirectoryWatchRequestLinux::DumpStats(RequestMap);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|