Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/proc/thread.c

    r96b02eb9 rdf58e44  
    239239 * Switch thread to the ready state.
    240240 *
    241  * @param t Thread to make ready.
     241 * @param thread Thread to make ready.
    242242 *
    243243 */
     
    246246        irq_spinlock_lock(&thread->lock, true);
    247247       
    248         ASSERT(!(thread->state == Ready));
     248        ASSERT(thread->state != Ready);
    249249       
    250250        int i = (thread->priority < RQ_COUNT - 1)
     
    338338       
    339339        thread->interrupted = false;
     340        thread->btrace = false;
    340341        thread->detached = false;
    341342        waitq_initialize(&thread->join_wq);
     
    535536/** Detach thread.
    536537 *
    537  * Mark the thread as detached, if the thread is already in the Lingering
    538  * state, deallocate its resources.
     538 * Mark the thread as detached. If the thread is already
     539 * in the Lingering state, deallocate its resources.
    539540 *
    540541 * @param thread Thread to be detached.
     
    740741        ASSERT(interrupts_disabled());
    741742        ASSERT(irq_spinlock_locked(&threads_lock));
    742 
     743       
    743744        thread_iterator_t iterator;
    744745       
     
    751752}
    752753
     754void thread_stack_trace(thread_id_t thread_id)
     755{
     756        irq_spinlock_lock(&threads_lock, true);
     757       
     758        thread_t *thread = thread_find_by_id(thread_id);
     759        if (thread == NULL) {
     760                printf("No such thread.\n");
     761                irq_spinlock_unlock(&threads_lock, true);
     762                return;
     763        }
     764       
     765        irq_spinlock_lock(&thread->lock, false);
     766       
     767        /*
     768         * Schedule a stack trace to be printed
     769         * just before the thread is scheduled next.
     770         *
     771         * If the thread is sleeping then try to interrupt
     772         * the sleep. Any request for printing an uspace stack
     773         * trace from within the kernel should be always
     774         * considered a last resort debugging means, therefore
     775         * forcing the thread's sleep to be interrupted
     776         * is probably justifiable.
     777         */
     778       
     779        bool sleeping = false;
     780        istate_t *istate = thread->udebug.uspace_state;
     781        if (istate != NULL) {
     782                printf("Scheduling thread stack trace.\n");
     783                thread->btrace = true;
     784                if (thread->state == Sleeping)
     785                        sleeping = true;
     786        } else
     787                printf("Thread interrupt state not available.\n");
     788       
     789        irq_spinlock_unlock(&thread->lock, false);
     790       
     791        if (sleeping)
     792                waitq_interrupt_sleep(thread);
     793       
     794        irq_spinlock_unlock(&threads_lock, true);
     795}
    753796
    754797/** Process syscall to create new thread.
     
    793836                                 * has already been created. We need to undo its
    794837                                 * creation now.
    795                                  *
    796838                                 */
    797839                               
     
    815857                 * THREAD_B events for threads that already existed
    816858                 * and could be detected with THREAD_READ before.
    817                  *
    818859                 */
    819860                udebug_thread_b_event_attach(thread, TASK);
Note: See TracChangeset for help on using the changeset viewer.