Ignore:
Timestamp:
Sep 26, 2017, 11:27:38 PM (7 years ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
5dc26f5
Parents:
201aeb9
Message:

merge

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/libcfa/concurrency/invoke.h

    r201aeb9 rd67cdb7  
    8484      };
    8585
     86      struct __waitfor_mask_t {
     87            short * accepted;                         // the index of the accepted function, -1 if none
     88            struct __acceptable_t * clauses;          // list of acceptable functions, null if any
     89            short size;                               // number of acceptable functions
     90      };
     91
    8692      struct monitor_desc {
    8793            struct spinlock lock;                     // spinlock to protect internal data
     
    9096            struct __condition_stack_t signal_stack;  // stack of conditions to run next once we exit the monitor
    9197            unsigned int recursion;                   // monitor routines can be called recursively, we need to keep track of that
     98            struct __waitfor_mask_t mask;               // mask used to know if some thread is waiting for something while holding the monitor
     99      };
    92100
    93             struct __acceptable_t * acceptables;      // list of acceptable functions, null if any
    94             unsigned short acceptable_count;          // number of acceptable functions
    95             short accepted_index;                     // the index of the accepted function, -1 if none
    96        };
     101      struct __monitor_group_t {
     102            struct monitor_desc ** list;              // currently held monitors
     103            short                  size;              // number of currently held monitors
     104            fptr_t                 func;              // last function that acquired monitors
     105      };
    97106
    98107      struct thread_desc {
    99108            // Core threading fields
    100             struct coroutine_desc cor;                // coroutine body used to store context
    101             struct monitor_desc mon;                  // monitor body used for mutual exclusion
     109            struct coroutine_desc  self_cor;          // coroutine body used to store context
     110            struct monitor_desc    self_mon;          // monitor body used for mutual exclusion
     111            struct monitor_desc *  self_mon_p;        // pointer to monitor with sufficient lifetime for current monitors
     112            struct __monitor_group_t monitors;          // monitors currently held by this thread
    102113
    103114            // Link lists fields
    104115            struct thread_desc * next;                // instrusive link field for threads
    105116
    106             // Current status related to monitors
    107             struct monitor_desc ** current_monitors;  // currently held monitors
    108             unsigned short current_monitor_count;     // number of currently held monitors
    109             fptr_t current_monitor_func;              // last function that acquired monitors
     117
    110118     };
     119
     120     #ifdef __CFORALL__
     121     extern "Cforall" {
     122            static inline monitor_desc * ?[?]( const __monitor_group_t & this, ptrdiff_t index ) {
     123                  return this.list[index];
     124            }
     125
     126            static inline bool ?==?( const __monitor_group_t & lhs, const __monitor_group_t & rhs ) {
     127                  if( (lhs.list != 0) != (rhs.list != 0) ) return false;
     128                  if( lhs.size != rhs.size ) return false;
     129                  if( lhs.func != rhs.func ) return false;
     130
     131                  // Check that all the monitors match
     132                  for( int i = 0; i < lhs.size; i++ ) {
     133                        // If not a match, check next function
     134                        if( lhs[i] != rhs[i] ) return false;
     135                  }
     136
     137                  return true;
     138            }
     139      }
     140      #endif
    111141
    112142#endif //_INVOKE_H_
Note: See TracChangeset for help on using the changeset viewer.