Changeset 37c57f2 in mainline


Ignore:
Timestamp:
2006-03-16T20:56:22Z (19 years ago)
Author:
Ondrej Palkovsky <ondrap@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
ff14c520
Parents:
6a22fcb
Message:

Added task_print.
Fixed ipc to support connect_me_to.

Files:
6 edited

Legend:

Unmodified
Added
Removed
  • arch/amd64/src/interrupt.c

    r6a22fcb r37c57f2  
    4646{
    4747        char *symbol;
    48         __u64 *x = &istate->stack[0];
     48/*      __u64 *x = &istate->stack[0]; */
    4949
    5050        if (!(symbol=get_symtab_entry(istate->rip)))
     
    6161        printf("%%r14=%Q, %%r15=%Q, %%rsp=%Q\n",istate->r14,istate->r15,&istate->stack[0]);
    6262        printf("%%rbp=%Q\n",istate->rbp);
     63/*     
    6364        printf("stack: %Q, %Q, %Q\n", x[5], x[6], x[7]);
    6465        printf("       %Q, %Q, %Q\n", x[8], x[9], x[10]);
    6566        printf("       %Q, %Q, %Q\n", x[11], x[12], x[13]);
    6667        printf("       %Q, %Q, %Q\n", x[14], x[15], x[16]);
     68*/
    6769}
    6870
  • generic/include/ipc/ipc.h

    r6a22fcb r37c57f2  
    100100 *                       indicating that it wants to be connected to some
    101101 *                       service
     102 *                     - arg1/2 are user specified, arg3 contains
     103 *                       address of the phone that should be connected
     104 *                       (TODO: it leaks to userspace)
    102105 *   recepient         -  if ipc_answer == 0, then accept connection
    103106 *                     -  otherwise connection refused
     
    171174extern void ipc_call_init(call_t *call);
    172175extern void ipc_forward(call_t *call, answerbox_t *newbox,answerbox_t *oldbox);
     176extern void task_print_list(void);
    173177
    174178extern answerbox_t *ipc_phone_0;
  • generic/src/console/cmd.c

    r6a22fcb r37c57f2  
    5454#include <proc/scheduler.h>
    5555#include <proc/thread.h>
     56#include <proc/task.h>
    5657
    5758/** Data and methods for 'help' command. */
     
    254255};
    255256
     257static int cmd_tasks(cmd_arg_t *argv);
     258static cmd_info_t tasks_info = {
     259        .name = "tasks",
     260        .description = "List all tasks",
     261        .func = cmd_tasks,
     262        .argc = 0
     263};
     264
    256265
    257266static int cmd_sched(cmd_arg_t *argv);
     
    339348        &sched_info,
    340349        &threads_info,
     350        &tasks_info,
    341351        &tlb_info,
    342352        &version_info,
     
    629639}
    630640
     641/** Command for listings Task information
     642 *
     643 * @param argv Ignores
     644 *
     645 * @return Always 1
     646 */
     647int cmd_tasks(cmd_arg_t * argv) {
     648        task_print_list();
     649        return 1;
     650}
     651
    631652/** Command for listings Thread information
    632653 *
  • generic/src/ipc/sysipc.c

    r6a22fcb r37c57f2  
    3636#include <ipc/ipc.h>
    3737#include <ipc/sysipc.h>
     38
     39
    3840#include <print.h>
     41#include <arch.h>
     42#include <proc/thread.h>
    3943
    4044/* TODO: multi-threaded connect-to-me can cause race condition
     
    138142{
    139143        if (IPC_GET_METHOD(call->data) == IPC_M_CONNECTTOME)
     144                return 1;
     145        if (IPC_GET_METHOD(call->data) == IPC_M_CONNECTMETO)
    140146                return 1;
    141147        return 0;
     
    156162                        phone_connect(phoneid,&answer->sender->answerbox);
    157163                }
     164        } else if (IPC_GET_METHOD(*olddata) == IPC_M_CONNECTMETO) {
     165                /* If the users accepted call, connect */
     166                if (!IPC_GET_RETVAL(answer->data)) {
     167                        printf("Connecting Phone %P\n",IPC_GET_ARG3(*olddata));
     168                        ipc_phone_connect((phone_t *)IPC_GET_ARG3(*olddata),
     169                                          &TASK->answerbox);
     170                }
    158171        }
    159172}
     
    319332 *
    320333 * The arg1 and arg2 are changed in the forwarded message
     334 *
     335 * Warning: If implementing non-fast version, make sure that
     336 *          arg3 is not rewritten for certain system IPC
    321337 */
    322338__native sys_ipc_forward_fast(__native callid, __native phoneid,
     
    437453                               &phone->callee->task->taskid,
    438454                               sizeof(TASK->taskid));
     455
    439456        return IPC_GET_RETVAL(call.data);
    440457}
     
    449466        call_t call;
    450467        phone_t *phone;
     468        int newphid;
    451469
    452470        phone = get_phone(phoneid);
    453471        if (!phone)
    454472                return ENOENT;
     473
     474        newphid = phone_alloc();
     475        if (newphid < 0)
     476                return ELIMIT;
    455477
    456478        ipc_call_init(&call);
     
    458480        IPC_SET_ARG1(call.data, arg1);
    459481        IPC_SET_ARG2(call.data, arg2);
     482        IPC_SET_ARG3(call.data, (__native)&TASK->phones[newphid]);
    460483
    461484        ipc_call_sync(phone, &call);
    462         if (!IPC_GET_RETVAL(call.data)) {
    463                 /* Everybody accepted, we should be connected by now */
    464         }
    465 
    466         return 0;
     485
     486        if (IPC_GET_RETVAL(call.data)) { /* Connection failed */
     487                phone_dealloc(newphid);
     488                return IPC_GET_RETVAL(call.data);
     489        }
     490
     491        return newphid;
    467492}
    468493
     
    486511restart:       
    487512        call = ipc_wait_for_call(&TASK->answerbox, flags);
    488         printf("Received call %P from sender: %P\n", call, call->sender);
    489513
    490514        if (call->flags & IPC_CALL_ANSWERED) {
  • generic/src/proc/task.c

    r6a22fcb r37c57f2  
    3939#include <ipc/ipc.h>
    4040#include <memstr.h>
     41#include <print.h>
    4142
    4243#include <elf.h>
     
    132133        return task;
    133134}
     135
     136/** Print task list */
     137void task_print_list(void)
     138{
     139        link_t *cur;
     140        task_t *t;
     141        ipl_t ipl;
     142        int i;
     143       
     144        /* Messing with thread structures, avoid deadlock */
     145        ipl = interrupts_disable();
     146        spinlock_lock(&tasks_lock);
     147
     148        for (cur=tasks_head.next; cur!=&tasks_head; cur=cur->next) {
     149                t = list_get_instance(cur, task_t, tasks_link);
     150                spinlock_lock(&t->lock);
     151                printf("Task: %Q ActiveCalls: %d", t->taskid,
     152                       atomic_get(&t->active_calls));
     153                for (i=0; i < IPC_MAX_PHONES; i++) {
     154                        if (t->phones[i].callee)
     155                                printf(" Ph(%d): %P ", i,t->phones[i].callee);
     156                }
     157                printf("\n");
     158                spinlock_unlock(&t->lock);
     159        }
     160
     161        spinlock_unlock(&tasks_lock);
     162        interrupts_restore(ipl);
     163       
     164}
  • generic/src/proc/thread.c

    r6a22fcb r37c57f2  
    413413                if (t->cpu)
    414414                        printf("cpu%d ", t->cpu->id);
    415                
    416415                printf("\n");
    417416        }
    418417
    419418        spinlock_unlock(&threads_lock);
    420         interrupts_enable();
    421 }
     419        interrupts_restore(ipl);
     420}
Note: See TracChangeset for help on using the changeset viewer.