Changeset 457 for trunk/kernel/libk/remote_sem.c
- Timestamp:
- Aug 2, 2018, 11:47:13 AM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kernel/libk/remote_sem.c
r436 r457 22 22 */ 23 23 24 #include <hal_ types.h>24 #include <hal_kernel_types.h> 25 25 #include <hal_remote.h> 26 26 #include <thread.h> … … 75 75 76 76 /////////////////////////////////////////// 77 error_t remote_sem_create( intptr_t vaddr, 78 uint32_t value ) 79 { 77 error_t remote_sem_create( intptr_t vaddr, 78 uint32_t value, 79 xptr_t sem_xp_xp ) 80 { 81 remote_sem_t * sem_ptr; 80 82 xptr_t sem_xp; 81 remote_sem_t * sem_ptr;82 83 83 84 // get pointer on local process descriptor … … 103 104 { 104 105 rpc_kcm_alloc_client( ref_cxy , KMEM_SEM , &sem_xp ); 105 sem_ptr = (remote_sem_t *)GET_PTR( sem_xp );106 } 107 108 if( sem_xp == XPTR_NULL ) return ENOMEM;106 sem_ptr = GET_PTR( sem_xp ); 107 } 108 109 if( sem_xp == XPTR_NULL ) return -1; 109 110 110 111 // initialise semaphore 111 112 hal_remote_sw ( XPTR( ref_cxy , &sem_ptr->count ) , value ); 112 113 hal_remote_spt( XPTR( ref_cxy , &sem_ptr->ident ) , (void *)vaddr ); 113 114 114 remote_spinlock_init( XPTR( ref_cxy , &sem_ptr->lock ) ); 115 115 xlist_root_init( XPTR( ref_cxy , &sem_ptr->root ) ); … … 119 119 xptr_t root_xp = XPTR( ref_cxy , &ref_ptr->sem_root ); 120 120 xptr_t xp_list = XPTR( ref_cxy , &sem_ptr->list ); 121 122 121 remote_spinlock_lock( XPTR( ref_cxy , &ref_ptr->sync_lock ) ); 123 122 xlist_add_first( root_xp , xp_list ); 124 123 remote_spinlock_unlock( XPTR( ref_cxy , &ref_ptr->sync_lock ) ); 125 124 125 // write extended pointer on semaphore in calling thread buffer 126 hal_remote_swd( sem_xp_xp , sem_xp ); 127 126 128 return 0; 127 129 128 } // en remote_sem_ init()130 } // en remote_sem_create() 129 131 130 132 //////////////////////////////////////// … … 139 141 // get reference process cluster and local pointer 140 142 cxy_t ref_cxy = GET_CXY( ref_xp ); 141 process_t * ref_ptr = (process_t *)GET_PTR( ref_xp );143 process_t * ref_ptr = GET_PTR( ref_xp ); 142 144 143 145 // get semaphore cluster and local pointer … … 148 150 remote_spinlock_lock( XPTR( sem_cxy , &sem_ptr->lock ) ); 149 151 150 // get remote pointer on waiting queue 151 xptr_t root_xp = (xptr_t)hal_remote_lwd( XPTR( sem_cxy , &sem_ptr->root ));152 // get remote pointer on waiting queue root 153 xptr_t root_xp = XPTR( sem_cxy , &sem_ptr->root ); 152 154 153 155 if( !xlist_is_empty( root_xp ) ) // user error … … 184 186 } // end remote_sem_destroy() 185 187 186 ////////////////////////////////// 188 ///////////////////////////////////// 187 189 void remote_sem_wait( xptr_t sem_xp ) 188 190 { 189 191 // get semaphore cluster and local pointer 190 192 cxy_t sem_cxy = GET_CXY( sem_xp ); 191 remote_sem_t * sem_ptr = (remote_sem_t *)GET_PTR( sem_xp );193 remote_sem_t * sem_ptr = GET_PTR( sem_xp ); 192 194 193 195 // get lock protecting semaphore … … 210 212 211 213 // register thread in waiting queue 212 xptr_t root_xp = (xptr_t)hal_remote_lwd( XPTR( sem_cxy , &sem_ptr->root ));213 xptr_t thread_xp = XPTR( local_cxy , this);214 xlist_add_last( root_xp , thread_xp );214 xptr_t root_xp = XPTR( sem_cxy , &sem_ptr->root ); 215 xptr_t list_xp = XPTR( local_cxy , &this->wait_list ); 216 xlist_add_last( root_xp , list_xp ); 215 217 216 218 // release lock … … 228 230 // get semaphore cluster and local pointer 229 231 cxy_t sem_cxy = GET_CXY( sem_xp ); 230 remote_sem_t * sem_ptr = (remote_sem_t *)GET_PTR( sem_xp );232 remote_sem_t * sem_ptr = GET_PTR( sem_xp ); 231 233 232 234 // get lock protecting semaphore 233 235 remote_spinlock_lock( XPTR( sem_cxy , &sem_ptr->lock ) ); 234 236 237 // get semaphore current value 238 uint32_t count = hal_remote_lw( XPTR( sem_cxy , &sem_ptr->count ) ); 239 235 240 // get remote pointer on waiting queue root 236 xptr_t root_xp = (xptr_t)hal_remote_lwd( XPTR( sem_cxy , &sem_ptr->root ));241 xptr_t root_xp = XPTR( sem_cxy , &sem_ptr->root ); 237 242 238 243 if( xlist_is_empty( root_xp ) ) // no waiting thread 239 244 { 240 // get semaphore current value241 uint32_t count = hal_remote_lw( XPTR( sem_cxy , &sem_ptr->count ) );242 243 245 // increment semaphore value 244 246 hal_remote_sw( XPTR( sem_cxy , &sem_ptr->count ) , count + 1 ); … … 251 253 // get thread cluster and local poiner 252 254 cxy_t thread_cxy = GET_CXY( thread_xp ); 253 thread_t * thread_ptr = (thread_t *)GET_PTR( thread_xp );254 255 // remove th e thread from the waiting queue, and unblock255 thread_t * thread_ptr = GET_PTR( thread_xp ); 256 257 // remove this thread from the waiting queue, and unblock it 256 258 xlist_unlink( XPTR( thread_cxy , &thread_ptr->wait_list ) ); 257 259 thread_unblock( thread_xp , THREAD_BLOCKED_SEM ); … … 270 272 // get semaphore cluster and local pointer 271 273 cxy_t sem_cxy = GET_CXY( sem_xp ); 272 remote_sem_t * sem_ptr = (remote_sem_t *)GET_PTR( sem_xp );274 remote_sem_t * sem_ptr = GET_PTR( sem_xp ); 273 275 274 276 *data = hal_remote_lw( XPTR( sem_cxy , &sem_ptr->count ) );
Note: See TracChangeset
for help on using the changeset viewer.