Beispiel #1
0
        /// <summary>
        /// Waits uninterruptibly for <paramref name="new_value"/> to be loaded.
        /// </summary>
        /// <param name="key">The key associated with the laoding value.</param>
        /// <param name="loading_value_reference"></param>
        /// <param name="new_value"></param>
        /// <returns></returns>
        T GetUninterruptibly(string key,
                             LoadingValueReference <T> loading_value_reference, IFuture <T> new_value)
        {
            T value = default(T);

            try {
                value = Uninterruptibles.GetUninterruptibly(new_value);

                // Cache loader should never returns null for reference types.
                if (IsNull(value))
                {
                    throw new InvalidCacheLoadException(
                              "CacheLoader returned a null for key " + key + ".");
                }
                // TODO(neylor.silva): Record load success stats.
                StoreLoadedValue(key, loading_value_reference, value);
                return(value);
            } finally {
                if (IsNull(value))
                {
                    // TODO(neylor.silva): Record load exception stats.
                    RemoveLoadingValue(key, loading_value_reference);
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// Run a set of threads making changes to the deprecations
        /// concurrently with another set of threads calling get()
        /// and set() on Configuration objects.
        /// </summary>
        /// <exception cref="System.Exception"/>
        public virtual void TestConcurrentDeprecateAndManipulate()
        {
            int NumThreadIds     = 10;
            int NumKeysPerThread = 1000;
            ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(2 * NumThreadIds
                                                                                   , new ThreadFactoryBuilder().SetDaemon(true).SetNameFormat("testConcurrentDeprecateAndManipulate modification thread %d"
                                                                                                                                              ).Build());
            CountDownLatch         latch = new CountDownLatch(1);
            AtomicInteger          highestModificationThreadId = new AtomicInteger(1);
            IList <Future <Void> > futures = new List <Future <Void> >();

            for (int i = 0; i < NumThreadIds; i++)
            {
                futures.AddItem(executor.Schedule(new _Callable_363(latch, highestModificationThreadId
                                                                    , NumKeysPerThread), 0, TimeUnit.Seconds));
            }
            AtomicInteger highestAccessThreadId = new AtomicInteger(1);

            for (int i_1 = 0; i_1 < NumThreadIds; i_1++)
            {
                futures.AddItem(executor.Schedule(new _Callable_382(latch, highestAccessThreadId,
                                                                    NumKeysPerThread), 0, TimeUnit.Seconds));
            }
            latch.CountDown();
            // allow all threads to proceed
            foreach (Future <Void> future in futures)
            {
                Uninterruptibles.GetUninterruptibly(future);
            }
        }
 public T WaitForValue()
 {
     return(Uninterruptibles.GetUninterruptibly(this));
 }