Beispiel #1
0
        /// <summary>
        /// Returns an engine to the pool so it can be reused
        /// </summary>
        /// <param name="engine">Engine to return</param>
        public virtual void ReturnEngineToPool(IJsEngine engine)
        {
            EngineMetadata metadata;

            if (!_metadata.TryGetValue(engine, out metadata))
            {
                // This engine was from another pool. This could happen if a pool is recycled
                // and replaced with a different one (like what ReactJS.NET does when any
                // loaded files change). Let's just pretend we never saw it.
                engine.Dispose();
                return;
            }

            metadata.InUse = false;
            var usageCount = metadata.UsageCount;

            if (_config.MaxUsagesPerEngine > 0 && usageCount >= _config.MaxUsagesPerEngine)
            {
                // Engine has been reused the maximum number of times, recycle it.
                DisposeEngine(engine);
                return;
            }

            if (
                _config.GarbageCollectionInterval > 0 &&
                usageCount % _config.GarbageCollectionInterval == 0 &&
                engine.SupportsGarbageCollection()
                )
            {
                engine.CollectGarbage();
            }

            _availableEngines.Add(engine);
        }
Beispiel #2
0
        /// <summary>
        /// Collecs garbage in the specified engine.
        /// </summary>
        /// <param name="engine">Engine to collect garbage in</param>
        public static void CollectGarbage(this IJsEngine engine)
        {
            if (!engine.SupportsGarbageCollection())
            {
                throw new InvalidOperationException("Engine doesn't support garbage collection.");
            }

            V8CollectGarbage(engine);
        }
Beispiel #3
0
		/// <summary>
		/// Returns an engine to the pool so it can be reused
		/// </summary>
		/// <param name="engine">Engine to return</param>
		public virtual void ReturnEngineToPool(IJsEngine engine)
		{
			if (!_metadata.ContainsKey(engine))
			{
				// This engine was from another pool. This could happen if a pool is recycled
				// and replaced with a different one (like what ReactJS.NET does when any 
				// loaded files change). Let's just pretend we never saw it.
				engine.Dispose();
				return;
			}

			_metadata[engine].InUse = false;
			var usageCount = _metadata[engine].UsageCount;
            if (_config.MaxUsagesPerEngine > 0 && usageCount >= _config.MaxUsagesPerEngine)
			{
				// Engine has been reused the maximum number of times, recycle it.
				DisposeEngine(engine);
				return;
			}

			if (
				_config.GarbageCollectionInterval > 0 && 
				usageCount % _config.GarbageCollectionInterval == 0 &&
				engine.SupportsGarbageCollection()
			)
			{
				engine.CollectGarbage();
			}

			_availableEngines.Add(engine);
		}