44 ABTI_UB_ASSERT(ABTI_initialized());
45 ABTI_UB_ASSERT(neweventual);
51 ABTI_eventual *p_eventual;
53 size_t arg_nbytes = nbytes;
55 abt_errno =
ABTU_malloc(
sizeof(ABTI_eventual), (
void **)&p_eventual);
56 ABTI_CHECK_ERROR(abt_errno);
58 ABTD_spinlock_clear(&p_eventual->lock);
60 p_eventual->nbytes = arg_nbytes;
61 if (arg_nbytes == 0) {
62 p_eventual->value = NULL;
64 abt_errno =
ABTU_malloc(arg_nbytes, &p_eventual->value);
65 if (ABTI_IS_ERROR_CHECK_ENABLED && abt_errno !=
ABT_SUCCESS) {
67 ABTI_HANDLE_ERROR(abt_errno);
70 ABTI_waitlist_init(&p_eventual->waitlist);
72 *neweventual = ABTI_eventual_get_handle(p_eventual);
104 ABTI_UB_ASSERT(ABTI_initialized());
105 ABTI_UB_ASSERT(eventual);
107 ABTI_eventual *p_eventual = ABTI_eventual_get_ptr(*eventual);
108 ABTI_CHECK_NULL_EVENTUAL_PTR(p_eventual);
113 ABTD_spinlock_acquire(&p_eventual->lock);
114 ABTI_UB_ASSERT(ABTI_waitlist_is_empty(&p_eventual->waitlist));
116 if (p_eventual->value)
175 ABTI_UB_ASSERT(ABTI_initialized());
177 ABTI_local *p_local = ABTI_local_get_local();
178 ABTI_eventual *p_eventual = ABTI_eventual_get_ptr(eventual);
179 ABTI_CHECK_NULL_EVENTUAL_PTR(p_eventual);
181 #ifndef ABT_CONFIG_ENABLE_VER_20_API
183 if (ABTI_IS_ERROR_CHECK_ENABLED && p_local) {
184 ABTI_xstream *p_local_xstream = ABTI_local_get_xstream(p_local);
185 ABTI_CHECK_TRUE(p_local_xstream->p_thread->type &
186 ABTI_THREAD_TYPE_YIELDABLE,
191 ABTD_spinlock_acquire(&p_eventual->lock);
193 ABTI_waitlist_wait_and_unlock(&p_local, &p_eventual->waitlist,
198 ABTD_spinlock_release(&p_eventual->lock);
204 *value = p_eventual->value;
250 ABTI_UB_ASSERT(ABTI_initialized());
251 ABTI_UB_ASSERT(is_ready);
253 ABTI_eventual *p_eventual = ABTI_eventual_get_ptr(eventual);
254 ABTI_CHECK_NULL_EVENTUAL_PTR(p_eventual);
257 ABTD_spinlock_acquire(&p_eventual->lock);
260 *value = p_eventual->value;
263 ABTD_spinlock_release(&p_eventual->lock);
317 ABTI_UB_ASSERT(ABTI_initialized());
318 ABTI_UB_ASSERT(value || nbytes <= 0);
320 ABTI_local *p_local = ABTI_local_get_local();
321 ABTI_eventual *p_eventual = ABTI_eventual_get_ptr(eventual);
322 ABTI_CHECK_NULL_EVENTUAL_PTR(p_eventual);
324 size_t arg_nbytes = nbytes;
325 #ifndef ABT_CONFIG_ENABLE_VER_20_API
333 ABTD_spinlock_acquire(&p_eventual->lock);
337 if (p_eventual->value)
338 memcpy(p_eventual->value, value, arg_nbytes);
341 ABTI_waitlist_broadcast(p_local, &p_eventual->waitlist);
342 ABTD_spinlock_release(&p_eventual->lock);
344 ABTD_spinlock_release(&p_eventual->lock);
379 ABTI_UB_ASSERT(ABTI_initialized());
381 ABTI_eventual *p_eventual = ABTI_eventual_get_ptr(eventual);
382 ABTI_CHECK_NULL_EVENTUAL_PTR(p_eventual);
384 ABTD_spinlock_acquire(&p_eventual->lock);
385 ABTI_UB_ASSERT(ABTI_waitlist_is_empty(&p_eventual->waitlist));
387 ABTD_spinlock_release(&p_eventual->lock);