Changeset 62d62db for libcfa/src/concurrency
- Timestamp:
- Jun 12, 2023, 6:06:26 PM (15 months ago)
- Branches:
- ast-experimental, master
- Children:
- e172f42
- Parents:
- 24d6572 (diff), 38e266ca (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- libcfa/src/concurrency
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/actor.hfa
r24d6572 r62d62db 13 13 #endif // CFA_DEBUG 14 14 15 #define DEBUG_ABORT( cond, string ) CFA_DEBUG( if ( cond ) abort( string ) ) 16 15 17 // Define the default number of processors created in the executor. Must be greater than 0. 16 18 #define __DEFAULT_EXECUTOR_PROCESSORS__ 2 … … 42 44 struct executor; 43 45 44 enum Allocation { Nodelete, Delete, Destroy, Finished }; // allocation status45 46 typedef Allocation (*__receive_fn)(actor &, message &);46 enum allocation { Nodelete, Delete, Destroy, Finished }; // allocation status 47 48 typedef allocation (*__receive_fn)(actor &, message &); 47 49 struct request { 48 50 actor * receiver; … … 393 395 struct actor { 394 396 size_t ticket; // executor-queue handle 395 Allocation allocation_; // allocation action397 allocation allocation_; // allocation action 396 398 inline virtual_dtor; 397 399 }; … … 400 402 // Once an actor is allocated it must be sent a message or the actor system cannot stop. Hence, its receive 401 403 // member must be called to end it 402 verifyf( __actor_executor_, "Creating actor before calling start_actor_system() can cause undefined behaviour.\n" );404 DEBUG_ABORT( __actor_executor_ == 0p, "Creating actor before calling start_actor_system() can cause undefined behaviour.\n" ); 403 405 allocation_ = Nodelete; 404 406 ticket = __get_next_ticket( *__actor_executor_ ); … … 430 432 431 433 struct message { 432 Allocation allocation_; // allocation action434 allocation allocation_; // allocation action 433 435 inline virtual_dtor; 434 436 }; … … 437 439 this.allocation_ = Nodelete; 438 440 } 439 static inline void ?{}( message & this, Allocation allocation) {440 memcpy( &this.allocation_, &alloc ation, sizeof(allocation) ); // optimization to elide ctor441 verifyf( this.allocation_ != Finished, "The Finished Allocation status is not supported for message types.\n");441 static inline void ?{}( message & this, allocation alloc ) { 442 memcpy( &this.allocation_, &alloc, sizeof(allocation) ); // optimization to elide ctor 443 DEBUG_ABORT( this.allocation_ == Finished, "The Finished allocation status is not supported for message types.\n" ); 442 444 } 443 445 static inline void ^?{}( message & this ) with(this) { … … 453 455 } // switch 454 456 } 455 static inline void set_allocation( message & this, Allocation state ) {457 static inline void set_allocation( message & this, allocation state ) { 456 458 this.allocation_ = state; 457 459 } 458 460 459 461 static inline void deliver_request( request & this ) { 462 DEBUG_ABORT( this.receiver->ticket == (unsigned long int)MAX, "Attempted to send message to deleted/dead actor\n" ); 460 463 this.receiver->allocation_ = this.fn( *this.receiver, *this.msg ); 461 464 check_message( *this.msg ); … … 631 634 632 635 static inline void send( actor & this, request & req ) { 633 verifyf( this.ticket != (unsigned long int)MAX, "Attempted to send message to deleted/dead actor\n" );636 DEBUG_ABORT( this.ticket == (unsigned long int)MAX, "Attempted to send message to deleted/dead actor\n" ); 634 637 send( *__actor_executor_, req, this.ticket ); 635 638 } … … 680 683 // assigned at creation to __base_msg_finished to avoid unused message warning 681 684 message __base_msg_finished @= { .allocation_ : Finished }; 682 struct __ DeleteMsg { inline message; } DeleteMsg = __base_msg_finished;683 struct __ DestroyMsg { inline message; } DestroyMsg = __base_msg_finished;684 struct __ FinishedMsg { inline message; } FinishedMsg = __base_msg_finished;685 686 Allocation receive( actor & this, __DeleteMsg& msg ) { return Delete; }687 Allocation receive( actor & this, __DestroyMsg& msg ) { return Destroy; }688 Allocation receive( actor & this, __FinishedMsg& msg ) { return Finished; }689 685 struct __delete_msg_t { inline message; } delete_msg = __base_msg_finished; 686 struct __destroy_msg_t { inline message; } destroy_msg = __base_msg_finished; 687 struct __finished_msg_t { inline message; } finished_msg = __base_msg_finished; 688 689 allocation receive( actor & this, __delete_msg_t & msg ) { return Delete; } 690 allocation receive( actor & this, __destroy_msg_t & msg ) { return Destroy; } 691 allocation receive( actor & this, __finished_msg_t & msg ) { return Finished; } 692 -
libcfa/src/concurrency/atomic.hfa
r24d6572 r62d62db 10 10 // Created On : Thu May 25 15:22:46 2023 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu May 25 15:24:45202313 // Update Count : 112 // Last Modified On : Fri Jun 9 13:36:47 2023 13 // Update Count : 46 14 14 // 15 15 16 #define LOAD( lock ) (__atomic_load_n( &(lock), __ATOMIC_SEQ_CST )) 17 #define LOADM( lock, memorder ) (__atomic_load_n( &(lock), memorder )) 18 #define STORE( lock, assn ) (__atomic_store_n( &(lock), assn, __ATOMIC_SEQ_CST )) 19 #define STOREM( lock, assn, memorder ) (__atomic_store_n( &(lock), assn, memorder )) 20 #define CLR( lock ) (__atomic_clear( &(lock), __ATOMIC_RELEASE )) 21 #define CLRM( lock, memorder ) (__atomic_clear( &(lock), memorder )) 22 #define TAS( lock ) (__atomic_test_and_set( &(lock), __ATOMIC_ACQUIRE )) 23 #define TASM( lock, memorder ) (__atomic_test_and_set( &(lock), memorder )) 24 #define CAS( change, comp, assn ) ({typeof(comp) __temp = (comp); __atomic_compare_exchange_n( &(change), &(__temp), (assn), false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST ); }) 25 #define CASM( change, comp, assn, memorder... ) ({typeof(comp) * __temp = &(comp); __atomic_compare_exchange_n( &(change), &(__temp), (assn), false, memorder, memorder ); }) 26 #define CASV( change, comp, assn ) (__atomic_compare_exchange_n( &(change), &(comp), (assn), false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST )) 27 #define CASVM( change, comp, assn, memorder... ) (__atomic_compare_exchange_n( &(change), &(comp), (assn), false, memorder, memorder )) 28 #define FAS( change, assn ) (__atomic_exchange_n( &(change), (assn), __ATOMIC_SEQ_CST )) 29 #define FASM( change, assn, memorder ) (__atomic_exchange_n( &(change), (assn), memorder )) 30 #define FAI( change, Inc ) (__atomic_fetch_add( &(change), (Inc), __ATOMIC_SEQ_CST )) 31 #define FAIM( change, Inc, memorder ) (__atomic_fetch_add( &(change), (Inc), memorder )) 16 #define LOAD( val ) (LOADM( val, __ATOMIC_SEQ_CST)) 17 #define LOADM( val, memorder ) (__atomic_load_n( &(val), memorder)) 18 19 #define STORE( val, assn ) (STOREM( val, assn, __ATOMIC_SEQ_CST)) 20 #define STOREM( val, assn, memorder ) (__atomic_store_n( &(val), assn, memorder)) 21 22 #define TAS( lock ) (TASM( lock, __ATOMIC_ACQUIRE)) 23 #define TASM( lock, memorder ) (__atomic_test_and_set( &(lock), memorder)) 24 25 #define TASCLR( lock ) (TASCLRM( lock, __ATOMIC_RELEASE)) 26 #define TASCLRM( lock, memorder ) (__atomic_clear( &(lock), memorder)) 27 28 #define FAS( assn, replace ) (FASM(assn, replace, __ATOMIC_SEQ_CST)) 29 #define FASM( assn, replace, memorder ) (__atomic_exchange_n( &(assn), (replace), memorder)) 30 31 #define FAI( assn, Inc ) (__atomic_fetch_add( &(assn), (Inc), __ATOMIC_SEQ_CST)) 32 #define FAIM( assn, Inc, memorder ) (__atomic_fetch_add( &(assn), (Inc), memorder)) 33 34 // Use __sync because __atomic with 128-bit CAA can result in calls to pthread_mutex_lock. 35 36 // #define CAS( assn, comp, replace ) (CASM( assn, comp, replace, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) 37 // #define CASM( assn, comp, replace, memorder... ) ({ \ 38 // typeof(comp) __temp = (comp); \ 39 // __atomic_compare_exchange_n( &(assn), &(__temp), (replace), false, memorder ); \ 40 // }) 41 #define CAS( assn, comp, replace ) (__sync_bool_compare_and_swap( &assn, comp, replace)) 42 #define CASM( assn, comp, replace, memorder... ) _Static_assert( false, "memory order unsupported for CAS macro" ); 43 44 // #define CASV( assn, comp, replace ) (__atomic_compare_exchange_n( &(assn), &(comp), (replace), false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST )) 45 // #define CASVM( assn, comp, replace, memorder... ) (__atomic_compare_exchange_n( &(assn), &(comp), (replace), false, memorder, memorder )) 46 #define CASV( assn, comp, replace ) ({ \ 47 typeof(comp) temp = comp; \ 48 typeof(comp) old = __sync_val_compare_and_swap( &(assn), (comp), (replace) ); \ 49 old == temp ? true : (comp = old, false); \ 50 }) 51 #define CASVM( assn, comp, replace, memorder... ) _Static_assert( false, "memory order unsupported for CASV macro" ); -
libcfa/src/concurrency/channel.hfa
r24d6572 r62d62db 51 51 vtable(channel_closed) channel_closed_vt; 52 52 53 static inline bool is_insert( channel_closed & e ) { return e lem != 0p; }54 static inline bool is_remove( channel_closed & e ) { return e lem == 0p; }53 static inline bool is_insert( channel_closed & e ) { return e.elem != 0p; } 54 static inline bool is_remove( channel_closed & e ) { return e.elem == 0p; } 55 55 56 56 // #define CHAN_STATS // define this to get channel stats printed in dtor -
libcfa/src/concurrency/locks.hfa
r24d6572 r62d62db 32 32 #include "select.hfa" 33 33 34 #include <fstream.hfa>35 36 34 // futex headers 37 35 #include <linux/futex.h> /* Definition of FUTEX_* constants */
Note: See TracChangeset
for help on using the changeset viewer.