@@ -43,6 +43,7 @@ Array<unsigned char> __hxcpp_resource_bytes(String inName);
4343// System access
4444Array<String> __get_args ();
4545double __time_stamp ();
46+ ::cpp::Int64 __time_stamp_ms ();
4647
4748HXCPP_EXTERN_CLASS_ATTRIBUTES void __hxcpp_print_string (const String &inV);
4849HXCPP_EXTERN_CLASS_ATTRIBUTES void __hxcpp_println_string (const String &inV);
@@ -161,7 +162,7 @@ HXCPP_EXTERN_CLASS_ATTRIBUTES String __hxcpp_utf8_string_to_char_bytes(String &i
161162
162163// --- HashRoot ---------------------------------------------------------------------
163164
164- HXCPP_EXTERN_CLASS_ATTRIBUTES int __root_hash_size (Dynamic * rtHash);
165+ HXCPP_EXTERN_CLASS_ATTRIBUTES int __root_hash_size (Dynamic & rtHash);
165166
166167// --- IntHash ----------------------------------------------------------------------
167168
@@ -472,16 +473,102 @@ inline void* _hx_atomic_compare_exchange_ptr(volatile void **a, void *expected,
472473#elif defined(HX_MSVC_ATOMICS)
473474 return _InterlockedCompareExchangePointer ((void *volatile *)a, replacement, expected);
474475#else
475- void *old = *a;
476- *a = replacement;
477- return old;
476+ void *old = *a;
477+ if (old == expected) {
478+ *a = replacement;
479+ }
480+ return old;
478481#endif
479482}
480483
481484inline void * _hx_atomic_compare_exchange_cast_ptr (void *a, void *expected, void *replacement) {
482485 return _hx_atomic_compare_exchange_ptr ((volatile void **)a, expected, replacement);
483486}
484487
488+ #include < atomic>
489+
490+ struct AtomicObject : hx::Object {
491+ std::atomic< ::hx::Object *> aPtr;
492+
493+ AtomicObject (Dynamic val) { aPtr = val.mPtr ; }
494+
495+ void __Mark (hx::MarkContext *__inCtx) {
496+ Dynamic ptr = load ();
497+ HX_MARK_MEMBER (ptr);
498+ }
499+
500+ #ifdef HXCPP_VISIT_ALLOCS
501+ void __Visit (hx::VisitContext *__inCtx) {
502+ hx::Object *obj = aPtr.load ();
503+ HX_VISIT_MEMBER (obj);
504+ aPtr.store (obj);
505+ }
506+ #endif
507+
508+ Dynamic store (Dynamic val) {
509+ aPtr.store (val.mPtr );
510+ HX_OBJ_WB_GET (this , val.mPtr );
511+ return val;
512+ }
513+
514+ Dynamic load () {
515+ return aPtr.load ();
516+ }
517+
518+ Dynamic exchange (Dynamic val) {
519+ Dynamic ret = aPtr.exchange (val.mPtr );
520+ HX_OBJ_WB_GET (this , val.mPtr );
521+ return ret;
522+ }
523+
524+ Dynamic compareExchange (Dynamic expected, Dynamic replacement) {
525+ // Note: using Dynamic instead of hx::Object* is important
526+ // Dynamic has an overloaded == operator, a raw pointer to hx::Object does not.
527+ Dynamic original = aPtr.load ();
528+ while (original == expected) {
529+ if (aPtr.compare_exchange_weak (original.mPtr , replacement.mPtr )) {
530+ HX_OBJ_WB_GET (this , replacement.mPtr );
531+ return original;
532+ } else {
533+ continue ;
534+ }
535+ }
536+ return original;
537+ }
538+ };
539+
540+ inline Dynamic __hxcpp_atomic_object_create (Dynamic value) {
541+ return new AtomicObject (value);
542+ }
543+
544+ inline Dynamic __hxcpp_atomic_object_store (Dynamic dynObj, Dynamic val) {
545+ AtomicObject *obj = dynamic_cast <AtomicObject *>(dynObj.mPtr );
546+ if (!obj)
547+ throw HX_INVALID_OBJECT;
548+ return obj->store (val);
549+ }
550+
551+ inline Dynamic __hxcpp_atomic_object_load (Dynamic dynObj) {
552+ AtomicObject *obj = dynamic_cast <AtomicObject *>(dynObj.mPtr );
553+ if (!obj)
554+ throw HX_INVALID_OBJECT;
555+ return obj->load ();
556+ }
557+
558+ inline Dynamic __hxcpp_atomic_object_exchange (Dynamic dynObj, Dynamic newVal) {
559+ AtomicObject *obj = dynamic_cast <AtomicObject *>(dynObj.mPtr );
560+ if (!obj)
561+ throw HX_INVALID_OBJECT;
562+ return obj->exchange (newVal);
563+ }
564+
565+ inline Dynamic __hxcpp_atomic_object_compare_exchange (Dynamic dynObj, Dynamic expected, Dynamic replacement) {
566+ AtomicObject *obj = dynamic_cast <AtomicObject *>(dynObj.mPtr );
567+ if (!obj)
568+ throw HX_INVALID_OBJECT;
569+ return obj->compareExchange (expected, replacement);
570+ }
571+
485572Array<String> __hxcpp_get_call_stack (bool inSkipLast);
486573Array<String> __hxcpp_get_exception_stack ();
487574#define HXCPP_HAS_CLASSLIST
0 commit comments