/** * Asynchronous version of #putAll(std::map<VarItem,VarItem> *data, int lifespan, int maxidle) */ int RemoteCache::putAllAsync(std::map<VarItem,VarItem> *data, int lifespan, int maxidle) { #ifdef NOT_THREAD_SAFE return putAll(data, lifespan, maxidle); #endif // mel by vracet i chyby, asi pocet neulozenych polozek int max_threads = transportFactory->get_key_owners_num(); if(lifespan < 0) { lifespan = this->default_lifespan; } if(maxidle < 0) { maxidle = this->default_maxidle; } std::map<VarItem,VarItem>::iterator pos; int *rets = new int[data->size()]; pthread_t *threads = new pthread_t[data->size()]; thread_args *t_args = new thread_args[data->size()]; int i =0; for (pos = (*data).begin(); pos != (*data).end(); ++pos) { t_args[i].RC = this; t_args[i].key = &pos->first; t_args[i].value = &pos->second; t_args[i].lifespan = lifespan; t_args[i].maxidle = maxidle; rets[i] = pthread_create( &threads[i], NULL, put_provider, (void*) &t_args[i]); i++; if(i>= max_threads) { // limit number of threads pthread_join( threads[i-max_threads], NULL); } } int start = data->size() - max_threads; if(start < 0) { start = 0; } for(int j = start; j<data->size(); j++) { pthread_join( threads[j], NULL); // std::cout<<"Thread "<<j<<" returns: "<<rets[j]<<std::endl; } delete [] rets; delete [] t_args; delete [] threads; // std::cout << "done"<<std::endl; return 0; }
JHashMap::JHashMap(JMap* m):JAbstractMap(getClazz()){ jint s=((m->size() / DEFAULT_LOAD_FACTOR) + 1 ? (m->size() / DEFAULT_LOAD_FACTOR) + 1 : DEFAULT_INITIAL_CAPACITY); init(s,DEFAULT_LOAD_FACTOR); putAll(m); }