99class HAZELCAST_API atomic_long :
public cp_proxy
102 atomic_long(
const std::string& name,
103 client::spi::ClientContext& context,
105 const std::string& object_name);
145 boost::future<int64_t>
get();
161 boost::future<int64_t>
get_and_set(int64_t new_value);
182 boost::future<void>
set(int64_t new_value);
190 boost::future<void>
alter(
const F& function)
205 auto f = to_data(function);
206 return alter_data(f, alter_result_type::NEW_VALUE);
220 auto f = to_data(function);
221 return alter_data(f, alter_result_type::OLD_VALUE);
232 template<
typename F,
typename R>
233 boost::future<boost::optional<R>>
apply(
const F& function)
235 auto f = to_data(function);
236 return to_object<R>(apply_data(f));
240 static constexpr const char* SERVICE_NAME =
"hz:raft:atomicLongService";
244 enum alter_result_type
256 boost::future<int64_t> alter_data(
257 client::serialization::pimpl::data& function_data,
258 alter_result_type result_type);
260 boost::future<boost::optional<client::serialization::pimpl::data>>
261 apply_data(client::serialization::pimpl::data& function_data);
267class HAZELCAST_API atomic_reference :
public cp_proxy
270 atomic_reference(
const std::string& name,
271 client::spi::ClientContext& context,
272 const raft_group_id& group_id,
273 const std::string& object_name);
276 boost::future<boost::optional<typename std::remove_pointer<T>::type>> get()
278 return to_object<typename std::remove_pointer<T>::type>(get_data());
282 boost::future<boost::optional<typename std::remove_pointer<T>::type>> set(
285 return to_object<typename std::remove_pointer<T>::type>(
286 set_data(to_data<
typename std::remove_pointer<T>::type>(new_value)));
290 boost::future<boost::optional<typename std::remove_pointer<T>::type>>
291 get_and_set(T new_value)
293 return to_object<typename std::remove_pointer<T>::type>(
295 to_data<
typename std::remove_pointer<T>::type>(new_value)));
298 template<
typename T,
typename V>
299 boost::future<bool> compare_and_set(T expect, V update)
301 return compare_and_set_data(
302 to_data<
typename std::remove_pointer<T>::type>(expect),
303 to_data<
typename std::remove_pointer<V>::type>(update));
306 boost::future<bool> is_null();
308 boost::future<void> clear();
311 boost::future<bool> contains(T value)
313 return contains_data(
314 to_data<
typename std::remove_pointer<T>::type>(value));
318 boost::future<void> alter(
const F& function)
320 return alter_data(to_data(function));
323 template<
typename T,
typename F>
324 boost::future<boost::optional<typename std::remove_pointer<T>::type>>
325 alter_and_get(
const F& function)
327 return to_object<typename std::remove_pointer<T>::type>(
328 alter_and_get_data(to_data(function)));
331 template<
typename T,
typename F>
332 boost::future<boost::optional<typename std::remove_pointer<T>::type>>
333 get_and_alter(
const F& function)
335 return to_object<typename std::remove_pointer<T>::type>(
336 get_and_alter_data(to_data(function)));
339 template<
typename R,
typename F>
340 boost::future<boost::optional<R>> apply(
const F& function)
342 return to_object<R>(apply_data(to_data(function)));
346 static constexpr const char* SERVICE_NAME =
"hz:raft:atomicRefService";
348 enum struct return_value_type
355 boost::future<boost::optional<client::serialization::pimpl::data>>
358 boost::future<boost::optional<client::serialization::pimpl::data>> set_data(
359 const client::serialization::pimpl::data& new_value_data);
361 boost::future<boost::optional<client::serialization::pimpl::data>>
362 get_and_set_data(
const client::serialization::pimpl::data& new_value_data);
364 boost::future<bool> compare_and_set_data(
365 const client::serialization::pimpl::data& expect_data,
366 const client::serialization::pimpl::data& update_data);
368 boost::future<bool> contains_data(
369 const client::serialization::pimpl::data& value_data);
371 boost::future<void> alter_data(
372 const client::serialization::pimpl::data& function_data);
374 boost::future<boost::optional<client::serialization::pimpl::data>>
375 alter_and_get_data(
const client::serialization::pimpl::data& function_data);
377 boost::future<boost::optional<client::serialization::pimpl::data>>
378 get_and_alter_data(
const client::serialization::pimpl::data& function_data);
380 boost::future<boost::optional<client::serialization::pimpl::data>>
381 apply_data(
const client::serialization::pimpl::data& function_data);
383 boost::future<boost::optional<client::serialization::pimpl::data>>
384 invoke_apply(
const client::serialization::pimpl::data function_data,
385 return_value_type return_type,
389class HAZELCAST_API latch :
public cp_proxy
392 latch(
const std::string& name,
393 client::spi::ClientContext& context,
394 const raft_group_id& group_id,
395 const std::string& object_name);
408 boost::future<bool> try_set_count(int32_t count);
415 boost::future<int32_t> get_count();
429 boost::future<void> count_down();
438 boost::future<bool> try_wait();
449 boost::future<void> wait();
480 boost::future<std::cv_status> wait_for(std::chrono::milliseconds timeout);
491 template<
typename Clock,
typename Duration>
492 boost::future<std::cv_status> wait_until(
493 const std::chrono::time_point<Clock, Duration>& timeout_time)
495 return wait_for(std::chrono::duration_cast<std::chrono::milliseconds>(
496 timeout_time - Clock::now()));
500 static constexpr const char* SERVICE_NAME =
"hz:raft:countDownLatchService";
502 boost::future<int32_t> get_round();
504 void count_down(
int round, boost::uuids::uuid invocation_uid);
517 static constexpr int64_t INVALID_FENCE = 0L;
519 fenced_lock(
const std::string& name,
520 client::spi::ClientContext& context,
521 const raft_group_id& group_id,
522 const std::string& object_name);
561 boost::future<void> lock();
633 boost::future<int64_t> lock_and_get_fence();
667 boost::future<bool> try_lock();
697 boost::future<bool> try_lock(std::chrono::milliseconds timeout);
772 boost::future<int64_t> try_lock_and_get_fence();
856 boost::future<int64_t> try_lock_and_get_fence(
857 std::chrono::milliseconds timeout);
867 boost::future<void> unlock();
886 boost::future<int64_t> get_fence();
897 boost::future<bool> is_locked();
908 boost::future<bool> is_locked_by_current_thread();
920 boost::future<int32_t> get_lock_count();
927 const raft_group_id& get_group_id();
929 friend HAZELCAST_API
bool operator==(
const fenced_lock& lhs,
930 const fenced_lock& rhs);
936 struct lock_ownership_state
943 bool is_locked_by(int64_t session, int64_t thread);
948 static constexpr const char* SERVICE_NAME =
"hz:raft:lockService";
951 util::SynchronizedMap<int64_t, int64_t> locked_session_ids_;
953 void verify_locked_session_id_if_present(int64_t thread_id,
955 bool should_release);
957 void throw_lock_ownership_lost(int64_t session_id)
const;
959 void throw_illegal_monitor_state()
const;
961 boost::future<int64_t> do_lock(int64_t session_id,
963 boost::uuids::uuid invocation_uid);
965 boost::future<int64_t> do_try_lock(int64_t session_id,
967 boost::uuids::uuid invocation_uid,
968 std::chrono::milliseconds timeout);
970 boost::future<bool> do_unlock(int64_t session_id,
972 boost::uuids::uuid invocation_uid);
974 boost::future<lock_ownership_state> do_get_lock_ownership_state();
976 void invalidate_session(int64_t session_id);
978 void verify_no_locked_session_id_present(int64_t thread_id);
1088 virtual boost::future<void> acquire(int32_t permits = 1) = 0;
1112 virtual boost::future<void> release(int32_t permits = 1) = 0;
1121 boost::future<bool> try_acquire(int32_t permits = 1);
1156 boost::future<bool> try_acquire_for(std::chrono::milliseconds rel_time,
1157 int32_t permits = 1);
1163 template<
class Clock,
class Duration>
1164 boost::future<bool> try_acquire_until(
1165 const std::chrono::time_point<Clock, Duration>& abs_time,
1166 int32_t permits = 1)
1168 auto now = Clock::now();
1169 return try_acquire_for(
1170 std::chrono::duration_cast<std::chrono::milliseconds>(abs_time - now),
1185 boost::future<bool> init(int32_t permits);
1194 boost::future<int32_t> available_permits();
1201 virtual boost::future<int32_t> drain_permits() = 0;
1212 boost::future<void> reduce_permits(int32_t reduction);
1223 boost::future<void> increase_permits(int32_t increase);
1226 static constexpr const char* SERVICE_NAME =
"hz:raft:semaphoreService";
1229 const std::string& proxy_name,
1230 client::spi::ClientContext* context,
1231 const raft_group_id& group_id,
1232 const std::string& object_name,
1233 internal::session::proxy_session_manager& session_manager);
1235 virtual boost::future<bool> try_acquire_for_millis(
1237 std::chrono::milliseconds timeout) = 0;
1239 virtual int64_t get_thread_id() = 0;
1241 virtual boost::future<void> do_change_permits(int32_t delta) = 0;
1243 boost::future<void> do_release(int32_t permits,
1245 int64_t session_id);
1318class HAZELCAST_API raft_proxy_factory
1321 raft_proxy_factory(client::spi::ClientContext& context);
1323 static std::string without_default_group_name(
const std::string& n);
1325 static std::string object_name_for_proxy(
const std::string& name);
1327 template<
typename T>
1328 boost::future<std::shared_ptr<T>> create_proxy(
const std::string& name)
1330 auto proxy_name = without_default_group_name(name);
1331 auto object_name = object_name_for_proxy(proxy_name);
1332 return get_group_id(proxy_name, object_name)
1333 .then([=](boost::future<raft_group_id> f) {
1334 auto group_id = f.get();
1335 return create<T>(std::move(group_id), proxy_name, object_name);
1340 client::spi::ClientContext& context_;
1341 util::SynchronizedMap<std::string, fenced_lock> lock_proxies_;
1347 static constexpr const char* DEFAULT_GROUP_NAME =
"default";
1349 template<
typename T,
1350 typename =
typename std::enable_if<
1351 std::is_same<atomic_long, T>::value ||
1352 std::is_same<atomic_reference, T>::value ||
1353 std::is_same<latch, T>::value>::type>
1355 const std::string& proxy_name,
1356 const std::string& object_name)
1358 return std::make_shared<T>(
1359 proxy_name, context_, std::move(group_id), object_name);
1362 std::shared_ptr<fenced_lock> create_fenced_lock(
1364 const std::string& proxy_name,
1365 const std::string& object_name);
1367 template<
typename T,
1368 typename =
typename std::enable_if<
1369 std::is_same<fenced_lock, T>::value>::type>
1370 std::shared_ptr<fenced_lock> create(
raft_group_id&& group_id,
1371 const std::string& proxy_name,
1372 const std::string& object_name)
1374 return create_fenced_lock(std::move(group_id), proxy_name, object_name);
1377 std::shared_ptr<counting_semaphore> create_semaphore(
1379 const std::string& proxy_name,
1380 const std::string& object_name);
1382 template<
typename T,
1383 typename =
typename std::enable_if<
1384 std::is_same<counting_semaphore, T>::value>::type>
1385 std::shared_ptr<counting_semaphore> create(
raft_group_id&& group_id,
1386 const std::string& proxy_name,
1387 const std::string& object_name)
1389 return create_semaphore(std::move(group_id), proxy_name, object_name);
1392 boost::future<raft_group_id> get_group_id(
const std::string& proxy_name,
1393 const std::string& object_name);