mirror of
https://github.com/esiur/esiur-dotnet.git
synced 2025-05-06 03:32:57 +00:00
mem leak
This commit is contained in:
parent
c68b58c3a2
commit
b61df304ea
@ -1,7 +1,7 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netstandard2.0</TargetFramework>
|
<TargetFramework>netstandard2.1</TargetFramework>
|
||||||
<AssemblyName>Esiur.Stores.EntityCore</AssemblyName>
|
<AssemblyName>Esiur.Stores.EntityCore</AssemblyName>
|
||||||
<Authors>Ahmed Kh. Zamil</Authors>
|
<Authors>Ahmed Kh. Zamil</Authors>
|
||||||
<Company>Esiur Foundation</Company>
|
<Company>Esiur Foundation</Company>
|
||||||
@ -12,7 +12,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.1.4" />
|
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="5.0.0" />
|
||||||
<PackageReference Include="System.Collections" Version="4.3.0" />
|
<PackageReference Include="System.Collections" Version="4.3.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ namespace Esiur.Stores.EntityCore
|
|||||||
public ConventionSet ModifyConventions(ConventionSet conventionSet)
|
public ConventionSet ModifyConventions(ConventionSet conventionSet)
|
||||||
{
|
{
|
||||||
var extension = _options.FindExtension<EsiurExtensionOptions>();
|
var extension = _options.FindExtension<EsiurExtensionOptions>();
|
||||||
conventionSet.ModelFinalizedConventions.Add(new EsiurProxyRewrite(
|
conventionSet.ModelFinalizingConventions.Add(new EsiurProxyRewrite(
|
||||||
extension,
|
extension,
|
||||||
_conventionSetBuilderDependencies));
|
_conventionSetBuilderDependencies));
|
||||||
return conventionSet;
|
return conventionSet;
|
||||||
|
@ -40,7 +40,7 @@ using Microsoft.EntityFrameworkCore.Metadata.Internal;
|
|||||||
|
|
||||||
namespace Esiur.Stores.EntityCore
|
namespace Esiur.Stores.EntityCore
|
||||||
{
|
{
|
||||||
public class EsiurProxyRewrite : IModelFinalizedConvention
|
public class EsiurProxyRewrite : IModelFinalizingConvention
|
||||||
{
|
{
|
||||||
private static readonly MethodInfo _createInstance
|
private static readonly MethodInfo _createInstance
|
||||||
= typeof(EsiurProxyRewrite).GetTypeInfo().GetDeclaredMethod(nameof(EsiurProxyRewrite.CreateInstance));
|
= typeof(EsiurProxyRewrite).GetTypeInfo().GetDeclaredMethod(nameof(EsiurProxyRewrite.CreateInstance));
|
||||||
@ -94,7 +94,7 @@ namespace Esiur.Stores.EntityCore
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void ProcessModelFinalized(IConventionModelBuilder modelBuilder, IConventionContext<IConventionModelBuilder> context)
|
public void ProcessModelFinalizing(IConventionModelBuilder modelBuilder, IConventionContext<IConventionModelBuilder> context)
|
||||||
{
|
{
|
||||||
foreach (var entityType in modelBuilder.Metadata.GetEntityTypes())
|
foreach (var entityType in modelBuilder.Metadata.GetEntityTypes())
|
||||||
{
|
{
|
||||||
@ -106,7 +106,7 @@ namespace Esiur.Stores.EntityCore
|
|||||||
var binding = (InstantiationBinding)entityType[CoreAnnotationNames.ConstructorBinding];
|
var binding = (InstantiationBinding)entityType[CoreAnnotationNames.ConstructorBinding];
|
||||||
#pragma warning restore EF1001 // Internal EF Core API usage.
|
#pragma warning restore EF1001 // Internal EF Core API usage.
|
||||||
if (binding == null)
|
if (binding == null)
|
||||||
_directBindingConvention.ProcessModelFinalized(modelBuilder, context);
|
_directBindingConvention.ProcessModelFinalizing(modelBuilder, context);
|
||||||
|
|
||||||
#pragma warning disable EF1001 // Internal EF Core API usage.
|
#pragma warning disable EF1001 // Internal EF Core API usage.
|
||||||
binding = (InstantiationBinding)entityType[CoreAnnotationNames.ConstructorBinding];
|
binding = (InstantiationBinding)entityType[CoreAnnotationNames.ConstructorBinding];
|
||||||
@ -145,5 +145,7 @@ namespace Esiur.Stores.EntityCore
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
{
|
{
|
||||||
"profiles": {
|
"profiles": {
|
||||||
"Esiur.Stores.EntityCore": {
|
"Esiur.Stores.EntityCore": {
|
||||||
"commandName": "Project",
|
"commandName": "Project"
|
||||||
"commandLineArgs": "--migrate"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,7 +1,7 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netstandard2.0</TargetFramework>
|
<TargetFramework>netstandard2.1</TargetFramework>
|
||||||
<Authors>Ahmed Kh. Zamil</Authors>
|
<Authors>Ahmed Kh. Zamil</Authors>
|
||||||
<Company>Esiur</Company>
|
<Company>Esiur</Company>
|
||||||
<Product>Esiur MongoDB Store</Product>
|
<Product>Esiur MongoDB Store</Product>
|
||||||
|
@ -62,17 +62,20 @@ namespace Esiur.Data
|
|||||||
|
|
||||||
public void Sort()
|
public void Sort()
|
||||||
{
|
{
|
||||||
|
lock(syncRoot)
|
||||||
list.Sort();
|
list.Sort();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Sort(IComparer<T> comparer)
|
public void Sort(IComparer<T> comparer)
|
||||||
{
|
{
|
||||||
list.Sort(comparer);
|
lock (syncRoot)
|
||||||
|
list.Sort(comparer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Sort(Comparison<T> comparison)
|
public void Sort(Comparison<T> comparison)
|
||||||
{
|
{
|
||||||
list.Sort(comparison);
|
lock (syncRoot)
|
||||||
|
list.Sort(comparison);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<T> Where(Func<T, bool> predicate)
|
public IEnumerable<T> Where(Func<T, bool> predicate)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netstandard2.0</TargetFramework>
|
<TargetFramework>netstandard2.1</TargetFramework>
|
||||||
<Description>Distributed Resources Platform</Description>
|
<Description>Distributed Resources Platform</Description>
|
||||||
<Copyright>Ahmed Kh. Zamil</Copyright>
|
<Copyright>Ahmed Kh. Zamil</Copyright>
|
||||||
<PackageLicenseUrl>https://github.com/Esiur/Esiur-dotnet/blob/master/LICENSE</PackageLicenseUrl>
|
<PackageLicenseUrl>https://github.com/Esiur/Esiur-dotnet/blob/master/LICENSE</PackageLicenseUrl>
|
||||||
@ -52,7 +52,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="System.Diagnostics.StackTrace" Version="4.3.0" />
|
<PackageReference Include="System.Diagnostics.StackTrace" Version="4.3.0" />
|
||||||
<PackageReference Include="System.Dynamic.Runtime" Version="4.3.0" />
|
<PackageReference Include="System.Dynamic.Runtime" Version="4.3.0" />
|
||||||
<PackageReference Include="System.Interactive.Async" Version="4.1.1" />
|
<PackageReference Include="System.Interactive.Async" Version="5.0.0" />
|
||||||
<PackageReference Include="System.Net.NameResolution" Version="4.3.0" />
|
<PackageReference Include="System.Net.NameResolution" Version="4.3.0" />
|
||||||
<PackageReference Include="System.Net.NetworkInformation" Version="4.3.0" />
|
<PackageReference Include="System.Net.NetworkInformation" Version="4.3.0" />
|
||||||
<PackageReference Include="System.Net.Security" Version="4.3.2" />
|
<PackageReference Include="System.Net.Security" Version="4.3.2" />
|
||||||
|
@ -62,9 +62,6 @@ namespace Esiur.Net.IIP
|
|||||||
|
|
||||||
Session session;
|
Session session;
|
||||||
|
|
||||||
|
|
||||||
List<IResource> attachedResources = new List<IResource>();
|
|
||||||
|
|
||||||
AsyncReply<bool> openReply;
|
AsyncReply<bool> openReply;
|
||||||
|
|
||||||
byte[] localPasswordOrToken;
|
byte[] localPasswordOrToken;
|
||||||
@ -291,8 +288,8 @@ namespace Esiur.Net.IIP
|
|||||||
|
|
||||||
void init()
|
void init()
|
||||||
{
|
{
|
||||||
var q = queue;
|
//var q = queue;
|
||||||
q.Then((x) =>
|
queue.Then((x) =>
|
||||||
{
|
{
|
||||||
if (x.Type == DistributedResourceQueueItem.DistributedResourceQueueItemType.Event)
|
if (x.Type == DistributedResourceQueueItem.DistributedResourceQueueItemType.Event)
|
||||||
x.Resource._EmitEventByIndex(x.Index, (object[])x.Value);
|
x.Resource._EmitEventByIndex(x.Index, (object[])x.Value);
|
||||||
@ -308,6 +305,7 @@ namespace Esiur.Net.IIP
|
|||||||
|
|
||||||
public override void Destroy()
|
public override void Destroy()
|
||||||
{
|
{
|
||||||
|
UnsubscribeAll();
|
||||||
this.OnReady = null;
|
this.OnReady = null;
|
||||||
this.OnError = null;
|
this.OnError = null;
|
||||||
base.Destroy();
|
base.Destroy();
|
||||||
@ -1146,13 +1144,14 @@ namespace Esiur.Net.IIP
|
|||||||
Server?.Membership.Logout(session);
|
Server?.Membership.Logout(session);
|
||||||
Warehouse.Remove(this);
|
Warehouse.Remove(this);
|
||||||
ready = false;
|
ready = false;
|
||||||
|
UnsubscribeAll();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
public AsyncBag<T> Children<T>(IResource resource)
|
public AsyncBag<T> Children<T>(IResource resource)
|
||||||
{
|
{
|
||||||
if (Codec.IsLocalResource(resource, this))
|
if (Codec.IsLocalReso turce(resource, this))
|
||||||
return (resource as DistributedResource).children.Where(x => x.GetType() == typeof(T)).Select(x => (T)x);
|
return (resource as DistributedResource).children.Where(x => x.GetType() == typeof(T)).Select(x => (T)x);
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
@ -54,6 +54,9 @@ namespace Esiur.Net.IIP
|
|||||||
|
|
||||||
volatile uint callbackCounter = 0;
|
volatile uint callbackCounter = 0;
|
||||||
|
|
||||||
|
List<IResource> subscriptions = new List<IResource>();
|
||||||
|
object subscriptionsLock = new object();
|
||||||
|
|
||||||
AsyncQueue<DistributedResourceQueueItem> queue = new AsyncQueue<DistributedResourceQueueItem>();
|
AsyncQueue<DistributedResourceQueueItem> queue = new AsyncQueue<DistributedResourceQueueItem>();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -459,10 +462,14 @@ namespace Esiur.Net.IIP
|
|||||||
var r = res as IResource;
|
var r = res as IResource;
|
||||||
|
|
||||||
// unsubscribe
|
// unsubscribe
|
||||||
r.Instance.ResourceEventOccurred -= Instance_EventOccurred;
|
Unsubscribe(r);
|
||||||
r.Instance.CustomResourceEventOccurred -= Instance_CustomEventOccurred;
|
|
||||||
r.Instance.ResourceModified -= Instance_PropertyModified;
|
//r.Instance.ResourceEventOccurred -= Instance_EventOccurred;
|
||||||
r.Instance.ResourceDestroyed -= Instance_ResourceDestroyed;
|
//r.Instance.CustomResourceEventOccurred -= Instance_CustomEventOccurred;
|
||||||
|
//r.Instance.ResourceModified -= Instance_PropertyModified;
|
||||||
|
//r.Instance.ResourceDestroyed -= Instance_ResourceDestroyed;
|
||||||
|
|
||||||
|
|
||||||
// r.Instance.Children.OnAdd -= Children_OnAdd;
|
// r.Instance.Children.OnAdd -= Children_OnAdd;
|
||||||
// r.Instance.Children.OnRemoved -= Children_OnRemoved;
|
// r.Instance.Children.OnRemoved -= Children_OnRemoved;
|
||||||
|
|
||||||
@ -471,7 +478,7 @@ namespace Esiur.Net.IIP
|
|||||||
// Console.WriteLine("Attach {0} {1}", r.Instance.Link, r.Instance.Id);
|
// Console.WriteLine("Attach {0} {1}", r.Instance.Link, r.Instance.Id);
|
||||||
|
|
||||||
// add it to attached resources so GC won't remove it from memory
|
// add it to attached resources so GC won't remove it from memory
|
||||||
attachedResources.Add(r);
|
///attachedResources.Add(r);
|
||||||
|
|
||||||
var link = DC.ToBytes(r.Instance.Link);
|
var link = DC.ToBytes(r.Instance.Link);
|
||||||
|
|
||||||
@ -501,10 +508,13 @@ namespace Esiur.Net.IIP
|
|||||||
|
|
||||||
|
|
||||||
// subscribe
|
// subscribe
|
||||||
r.Instance.ResourceEventOccurred += Instance_EventOccurred;
|
//r.Instance.ResourceEventOccurred += Instance_EventOccurred;
|
||||||
r.Instance.CustomResourceEventOccurred += Instance_CustomEventOccurred;
|
//r.Instance.CustomResourceEventOccurred += Instance_CustomEventOccurred;
|
||||||
r.Instance.ResourceModified += Instance_PropertyModified;
|
//r.Instance.ResourceModified += Instance_PropertyModified;
|
||||||
r.Instance.ResourceDestroyed += Instance_ResourceDestroyed;
|
//r.Instance.ResourceDestroyed += Instance_ResourceDestroyed;
|
||||||
|
|
||||||
|
Subscribe(r);
|
||||||
|
|
||||||
//r.Instance.Children.OnAdd += Children_OnAdd;
|
//r.Instance.Children.OnAdd += Children_OnAdd;
|
||||||
//r.Instance.Children.OnRemoved += Children_OnRemoved;
|
//r.Instance.Children.OnRemoved += Children_OnRemoved;
|
||||||
|
|
||||||
@ -582,20 +592,25 @@ namespace Esiur.Net.IIP
|
|||||||
{
|
{
|
||||||
var r = res as IResource;
|
var r = res as IResource;
|
||||||
// unsubscribe
|
// unsubscribe
|
||||||
r.Instance.ResourceEventOccurred -= Instance_EventOccurred;
|
Unsubscribe(r);
|
||||||
r.Instance.CustomResourceEventOccurred -= Instance_CustomEventOccurred;
|
|
||||||
r.Instance.ResourceModified -= Instance_PropertyModified;
|
//r.Instance.ResourceEventOccurred -= Instance_EventOccurred;
|
||||||
r.Instance.ResourceDestroyed -= Instance_ResourceDestroyed;
|
//r.Instance.CustomResourceEventOccurred -= Instance_CustomEventOccurred;
|
||||||
|
//r.Instance.ResourceModified -= Instance_PropertyModified;
|
||||||
|
//r.Instance.ResourceDestroyed -= Instance_ResourceDestroyed;
|
||||||
|
|
||||||
//r.Instance.Children.OnAdd -= Children_OnAdd;
|
//r.Instance.Children.OnAdd -= Children_OnAdd;
|
||||||
//r.Instance.Children.OnRemoved -= Children_OnRemoved;
|
//r.Instance.Children.OnRemoved -= Children_OnRemoved;
|
||||||
|
|
||||||
//r.Instance.Attributes.OnModified -= Attributes_OnModified;
|
//r.Instance.Attributes.OnModified -= Attributes_OnModified;
|
||||||
|
|
||||||
// subscribe
|
// subscribe
|
||||||
r.Instance.ResourceEventOccurred += Instance_EventOccurred;
|
//r.Instance.ResourceEventOccurred += Instance_EventOccurred;
|
||||||
r.Instance.CustomResourceEventOccurred += Instance_CustomEventOccurred;
|
//r.Instance.CustomResourceEventOccurred += Instance_CustomEventOccurred;
|
||||||
r.Instance.ResourceModified += Instance_PropertyModified;
|
//r.Instance.ResourceModified += Instance_PropertyModified;
|
||||||
r.Instance.ResourceDestroyed += Instance_ResourceDestroyed;
|
//r.Instance.ResourceDestroyed += Instance_ResourceDestroyed;
|
||||||
|
|
||||||
|
Subscribe(r);
|
||||||
//r.Instance.Children.OnAdd += Children_OnAdd;
|
//r.Instance.Children.OnAdd += Children_OnAdd;
|
||||||
//r.Instance.Children.OnRemoved += Children_OnRemoved;
|
//r.Instance.Children.OnRemoved += Children_OnRemoved;
|
||||||
|
|
||||||
@ -621,14 +636,16 @@ namespace Esiur.Net.IIP
|
|||||||
{
|
{
|
||||||
if (res != null)
|
if (res != null)
|
||||||
{
|
{
|
||||||
var r = res as IResource;
|
//var r = res as IResource;
|
||||||
r.Instance.ResourceEventOccurred -= Instance_EventOccurred;
|
//r.Instance.ResourceEventOccurred -= Instance_EventOccurred;
|
||||||
r.Instance.CustomResourceEventOccurred -= Instance_CustomEventOccurred;
|
//r.Instance.CustomResourceEventOccurred -= Instance_CustomEventOccurred;
|
||||||
r.Instance.ResourceModified -= Instance_PropertyModified;
|
//r.Instance.ResourceModified -= Instance_PropertyModified;
|
||||||
r.Instance.ResourceDestroyed -= Instance_ResourceDestroyed;
|
//r.Instance.ResourceDestroyed -= Instance_ResourceDestroyed;
|
||||||
|
|
||||||
|
Unsubscribe(res);
|
||||||
|
|
||||||
// remove from attached resources
|
// remove from attached resources
|
||||||
attachedResources.Remove(res);
|
//attachedResources.Remove(res);
|
||||||
|
|
||||||
// reply ok
|
// reply ok
|
||||||
SendReply(IIPPacket.IIPPacketAction.DetachResource, callback).Done();
|
SendReply(IIPPacket.IIPPacketAction.DetachResource, callback).Done();
|
||||||
@ -2190,12 +2207,60 @@ namespace Esiur.Net.IIP
|
|||||||
return reply;
|
return reply;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Subscribe(IResource resource)
|
||||||
|
{
|
||||||
|
lock (subscriptionsLock)
|
||||||
|
{
|
||||||
|
resource.Instance.ResourceEventOccurred += Instance_EventOccurred;
|
||||||
|
resource.Instance.CustomResourceEventOccurred += Instance_CustomEventOccurred;
|
||||||
|
resource.Instance.ResourceModified += Instance_PropertyModified;
|
||||||
|
resource.Instance.ResourceDestroyed += Instance_ResourceDestroyed;
|
||||||
|
|
||||||
|
subscriptions.Add(resource);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Unsubscribe(IResource resource)
|
||||||
|
{
|
||||||
|
lock (subscriptionsLock)
|
||||||
|
{
|
||||||
|
// do something with the list...
|
||||||
|
resource.Instance.ResourceEventOccurred -= Instance_EventOccurred;
|
||||||
|
resource.Instance.CustomResourceEventOccurred -= Instance_CustomEventOccurred;
|
||||||
|
resource.Instance.ResourceModified -= Instance_PropertyModified;
|
||||||
|
resource.Instance.ResourceDestroyed -= Instance_ResourceDestroyed;
|
||||||
|
|
||||||
|
subscriptions.Remove(resource);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UnsubscribeAll()
|
||||||
|
{
|
||||||
|
lock(subscriptionsLock)
|
||||||
|
{
|
||||||
|
foreach(var resource in subscriptions)
|
||||||
|
{
|
||||||
|
resource.Instance.ResourceEventOccurred -= Instance_EventOccurred;
|
||||||
|
resource.Instance.CustomResourceEventOccurred -= Instance_CustomEventOccurred;
|
||||||
|
resource.Instance.ResourceModified -= Instance_PropertyModified;
|
||||||
|
resource.Instance.ResourceDestroyed -= Instance_ResourceDestroyed;
|
||||||
|
}
|
||||||
|
|
||||||
|
subscriptions.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void Instance_ResourceDestroyed(IResource resource)
|
private void Instance_ResourceDestroyed(IResource resource)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
Unsubscribe(resource);
|
||||||
// compose the packet
|
// compose the packet
|
||||||
SendEvent(IIPPacket.IIPPacketEvent.ResourceDestroyed)
|
SendEvent(IIPPacket.IIPPacketEvent.ResourceDestroyed)
|
||||||
.AddUInt32(resource.Instance.Id)
|
.AddUInt32(resource.Instance.Id)
|
||||||
.Done();
|
.Done();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Instance_PropertyModified(IResource resource, string name, object newValue)
|
private void Instance_PropertyModified(IResource resource, string name, object newValue)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user