Changeset 581 for trunk/kernel/syscalls
- Timestamp:
- Oct 10, 2018, 3:11:53 PM (6 years ago)
- Location:
- trunk/kernel/syscalls
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kernel/syscalls/shared_include/shared_pthread.h
r566 r581 32 32 33 33 /******************************************************************************************* 34 * These typedef define the POSIX thread related types.34 * These typedef and enum define the shared information related to the POSIX thread. 35 35 ******************************************************************************************/ 36 36 37 typedef unsigned int pthread_mutex_t; 38 typedef unsigned int pthread_mutexattr_t; // TODO not implemented 39 40 typedef unsigned int pthread_cond_t; 41 typedef unsigned int pthread_condattr_t; // TODO not implemented 42 43 typedef unsigned int pthread_rwlock_t; // TODO not implemented 44 typedef unsigned int pthread_rwlockattr_t; // TODO not implemented 45 46 /******************************************************************************************* 47 * This structure and enum define the attributes for the pthread_create() syscall. 48 ******************************************************************************************/ 49 50 typedef unsigned int pthread_t; 37 typedef unsigned int pthread_t; 51 38 52 39 typedef struct pthread_attr_s 53 40 { 54 unsigned int attributes; /*! user defined attributes bit vector*/55 unsigned int cxy; /*! target cluster identifier*/56 unsigned int lid; /*! target core local index*/41 unsigned int attributes; /*! user defined attributes bit vector */ 42 unsigned int cxy; /*! target cluster identifier */ 43 unsigned int lid; /*! target core local index */ 57 44 } 58 45 pthread_attr_t; … … 60 47 enum 61 48 { 62 PT_ATTR_DETACH = 0x0001, /*! user defined not joinable*/63 PT_ATTR_CLUSTER_DEFINED = 0x0002, /*! user defined target cluster*/64 PT_ATTR_CORE_DEFINED = 0x0004, /*! user defined core index in cluster*/49 PT_ATTR_DETACH = 0x0001, /*! user defined not joinable */ 50 PT_ATTR_CLUSTER_DEFINED = 0x0002, /*! user defined target cluster */ 51 PT_ATTR_CORE_DEFINED = 0x0004, /*! user defined core index in cluster */ 65 52 }; 66 53 67 /******************************************************************************************* 68 * Th is enum defines the operation mnemonics for operations on POSIX condition variables.54 /******************************************************************************************* 55 * These typedef and enum define the shared informations related to the POSIX mutex. 69 56 ******************************************************************************************/ 57 58 typedef unsigned int pthread_mutex_t; 59 60 typedef unsigned int pthread_mutexattr_t; // TODO not implemented 61 62 typedef enum 63 { 64 MUTEX_INIT, 65 MUTEX_DESTROY, 66 MUTEX_LOCK, 67 MUTEX_UNLOCK, 68 MUTEX_TRYLOCK, 69 } 70 mutex_operation_t; 71 72 /******************************************************************************************* 73 * These typedef and enum define the shared informations related to the POSIX condvar. 74 ******************************************************************************************/ 75 76 typedef unsigned int pthread_cond_t; 77 78 typedef unsigned int pthread_condattr_t; // TODO not implemented 70 79 71 80 typedef enum … … 79 88 condvar_operation_t; 80 89 90 /******************************************************************************************* 91 * These typedef define and enum the shared informations related to the POSIX rwlock. 92 ******************************************************************************************/ 93 94 typedef unsigned int pthread_rwlock_t; // TODO not implemented 95 96 typedef unsigned int pthread_rwlockattr_t; // TODO not implemented 97 81 98 /******************************************************************************************* 82 * Th is enum defines the operation mnemonics for operations onPOSIX barriers.99 * These typedef and enum define the shared informations related to POSIX barriers. 83 100 ******************************************************************************************/ 101 102 typedef unsigned int pthread_barrier_t; 103 104 typedef struct pthread_barrierattr_s 105 { 106 unsigned int x_size; /*! number of clusters in a row */ 107 unsigned int y_size; /*! number of clusters in a column */ 108 unsigned int nthreads; /*! number of expected threads in a cluster */ 109 } 110 pthread_barrierattr_t; 84 111 85 112 typedef enum … … 91 118 barrier_operation_t; 92 119 93 /******************************************************************************************* 94 * This enum defines the operation mnemonics for operations on POSIX mutex. 95 ******************************************************************************************/ 120 /********************************************************************************************* 121 * These structures define another implementation for the POSIX barrier: 122 * It is implemented as a hierarchical, physically distributed quad-tree, 123 * covering all clusters specified, with the following constraints: 124 * . The involved clusters form a mesh [x_size * y_size] 125 * . The lower left involved cluster is cluster(0,0) 126 * . The number of threads per cluster is the same in all clusters. 127 * 128 * Implementation note: 129 * - The quad three is implemented as a three dimensions array of node[x][y][l] 130 * . [x][y] are the cluster coordinates / max values are (QDT_XMAX-1), (QDT_YMAX-1) 131 * . [l] is the node level / 0 for terminal nodes / (QDT_LMAX-1) for the root node 132 ********************************************************************************************/ 96 133 97 typedef enum 134 /* 135 136 #define QDT_XMAX 16 // max number of clusters in a row 137 #define QDT_YMAX 16 // max number of clusters in a column 138 #define QDT_LMAX 5 // max depth of the quad tree 139 #define QDT_YWIDTH 4 // Y field in cxy, for cxy <=> (x,y) translation 140 #define QDT_YMASK 0xF // Y field in cxy, for cxy <=> (x,y) translation 141 142 typedef struct sqt_node_s 98 143 { 99 MUTEX_INIT, 100 MUTEX_DESTROY, 101 MUTEX_LOCK, 102 MUTEX_UNLOCK, 103 MUTEX_TRYLOCK, 104 } 105 mutex_operation_t; 144 volatile unsigned int sense; // barrier state (toggle) 145 volatile unsigned int count; // number of not arrived tasks 146 unsigned int arity; // number of locally expected tasks 147 unsigned int level; // hierarchical level (0 is bottom) 148 struct sqt_node_s * parent; // pointer on parent node (NULL for root) 149 struct sqt_node_s * child[4]; // pointer on children node (NULL for bottom) 150 } 151 sqt_node_t; 106 152 153 typedef struct pthread_barrier_s 154 { 155 sqt_node_t * node[QDT_XMAX][QDT_YMAX][QDT_LMAX]; 156 } 157 pthread_barrier_t; 107 158 159 */ 108 160 109 161 #endif // _PTHREAD_H_ -
trunk/kernel/syscalls/sys_barrier.c
r508 r581 31 31 #include <remote_barrier.h> 32 32 33 #if DEBUG_SYS_BARRIER 34 ////////////////////////////////////////////////////// 35 static char * sys_barrier_op_str( uint32_t operation ) 36 { 37 if ( operation == BARRIER_INIT ) return "INIT"; 38 else if( operation == BARRIER_DESTROY ) return "DESTROY"; 39 else if( operation == BARRIER_WAIT ) return "WAIT"; 40 else return "undefined"; 41 } 42 #endif 43 33 44 ////////////////////////////////// 34 45 int sys_barrier( void * vaddr, … … 41 52 thread_t * this = CURRENT_THREAD; 42 53 process_t * process = this->process; 54 55 #if DEBUG_SYS_BARRIER 56 uint64_t tm_start; 57 uint64_t tm_end; 58 tm_start = hal_get_cycles(); 59 if( DEBUG_SYS_BARRIER < tm_start ) 60 printk("\n[DBG] %s : thread %x in process %x enter for %s / count %d / cycle %d\n", 61 __FUNCTION__, this->trdid, process->pid, sys_barrier_op_str(operation), count, 62 (uint32_t)tm_start ); 63 #endif 43 64 44 65 // check vaddr in user vspace … … 125 146 } // end switch 126 147 148 #if DEBUG_SYS_BARRIER 149 tm_end = hal_get_cycles(); 150 if( DEBUG_SYS_BARRIER < tm_end ) 151 printk("\n[DBG] %s : thread %x in process %x exit for %s / cost %d / cycle %d\n", 152 __FUNCTION__, this->trdid, process->pid, sys_barrier_op_str(operation), 153 (uint32_t)(tm_end - tm_start), (uint32_t)tm_end ); 154 #endif 155 127 156 return 0; 128 157
Note: See TracChangeset
for help on using the changeset viewer.