/*! * Delete global message queue */ int sys__delete_msg_queue ( void *p ) { /* parameter on thread stack */ msg_q *msgq; /* local variables */ kgmsg_q *gmsgq; msgq = *( (msg_q **) p ); ASSERT_ERRNO_AND_EXIT ( msgq, E_INVALID_HANDLE ); msgq = U2K_GET_ADR ( msgq, k_get_active_process () ); gmsgq = msgq->handle; ASSERT_ERRNO_AND_EXIT ( gmsgq->id == msgq->id, E_INVALID_HANDLE ); k_msgq_clean ( &gmsgq->mq ); k_release_all_threads ( &gmsgq->mq.thrq ); k_free_unique_id ( gmsgq->id ); kfree ( gmsgq ); msgq->id = 0; msgq->handle = NULL; EXIT ( SUCCESS ); }
/*! * End current thread (exit from it) * \param status Exit status number */ int sys__thread_exit ( void *p ) { int status; status = *( (int *) p ); active_thread->state = THR_STATE_PASSIVE; active_thread->ref_cnt--; active_thread->exit_status = status; #ifdef MESSAGES k_msgq_clean ( &active_thread->msg.msgq ); #endif /* release thread stack */ if ( active_thread->stack ) kfree ( active_thread->stack ); k_delete_thread_private_storage ( active_thread, active_thread->private_storage ); if ( !active_thread->ref_cnt ) { k_remove_thread_descriptor ( active_thread ); active_thread = NULL; } else { k_release_all_threads ( &active_thread->join_queue ); } k_schedule_threads (); return 0; }
/*! * End current thread (exit from it) * \param status Exit status number */ int sys__thread_exit ( void *p ) { int status; status = *( (int *) p ); active_thread->state = THR_STATE_PASSIVE; active_thread->ref_cnt--; active_thread->exit_status = status; active_thread->proc->thr_count--; #ifdef MESSAGES k_msgq_clean ( &active_thread->msg.msgq ); #endif /* release thread stack */ if ( active_thread->stack ) { if ( active_thread->proc->m.start ) /* user level thread */ ffs_free ( active_thread->proc->stack_pool, active_thread->stack ); else /* kernel level thread */ kfree ( active_thread->stack ); } k_delete_thread_private_storage ( active_thread, active_thread->private_storage ); if ( active_thread->proc->thr_count == 0 && active_thread->proc->pi ) { /* last (non-kernel) thread - remove process */ ASSERT ( list_remove ( &procs, FIRST, &active_thread->proc->all ) ); active_thread->proc->prog->started = FALSE; kfree ( active_thread->proc ); } if ( !active_thread->ref_cnt ) { k_remove_thread_descriptor ( active_thread ); active_thread = NULL; } else { k_release_all_threads ( &active_thread->join_queue ); } k_schedule_threads (); return 0; }
/*! * Delete global message queue */ int sys__delete_msg_queue ( msg_q *msgq ) { kgmsg_q *gmsgq; ASSERT_ERRNO_AND_EXIT ( msgq, E_INVALID_HANDLE ); gmsgq = msgq->handle; ASSERT_ERRNO_AND_EXIT ( gmsgq->id == msgq->id, E_INVALID_HANDLE ); k_msgq_clean ( &gmsgq->mq ); k_release_all_threads ( &gmsgq->mq.thrq ); k_free_unique_id ( gmsgq->id ); kfree ( gmsgq ); msgq->id = 0; msgq->handle = NULL; EXIT ( SUCCESS ); }