Changeset 41269bd in mainline


Ignore:
Timestamp:
2006-06-07T17:28:39Z (19 years ago)
Author:
Ondrej Palkovsky <ondrap@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
ce5bcb4
Parents:
70178b74
Message:

Fixed race condition in async framework on phone disconnect.

Files:
3 edited

Legend:

Unmodified
Added
Removed
  • console/console.c

    r70178b74 r41269bd  
    289289                switch (IPC_GET_METHOD(call)) {
    290290                case IPC_M_PHONE_HUNGUP:
    291                         ipc_answer_fast(callid,0,0,0);
    292291                        /* TODO: Handle hangup */
    293292                        return;
     
    369368                                break;
    370369                        }
    371                        
    372                         /* Commit hangup */
    373                         ipc_answer_fast(callid, 0,0,0);
    374370                        conn->used = 0;
    375371                        return;
  • fb/fb.c

    r70178b74 r41269bd  
    922922                        for (i=1; i < MAX_VIEWPORTS; i++)
    923923                                vport->initialized = 0;
    924                         ipc_answer_fast(callid,0,0,0);
    925924                        return; /* Exit thread */
    926925
  • libc/generic/async.c

    r70178b74 r41269bd  
    132132        ipc_callid_t callid;
    133133        ipc_call_t call;
     134        ipc_callid_t close_callid; /* Identification of closing packet */
    134135        void (*cthread)(ipc_callid_t,ipc_call_t *);
    135136} connection_t;
     
    267268        msg->call = *call;
    268269        list_append(&msg->link, &conn->msg_queue);
     270
     271        if (IPC_GET_METHOD(*call) == IPC_M_PHONE_HUNGUP)
     272                conn->close_callid = callid;
    269273       
    270274        /* If the call is waiting for event, run it */
     
    359363        unsigned long key;
    360364        msg_t *msg;
     365        int close_answered = 0;
    361366
    362367        /* Setup thread local connection pointer */
     
    372377                msg = list_get_instance(PS_connection->msg_queue.next, msg_t, link);
    373378                list_remove(&msg->link);
     379                if (msg->callid == PS_connection->close_callid)
     380                        close_answered = 1;
    374381                ipc_answer_fast(msg->callid, EHANGUP, 0, 0);
    375382                free(msg);
    376383        }
     384        if (PS_connection->close_callid)
     385                ipc_answer_fast(PS_connection->close_callid, 0, 0, 0);
    377386}
    378387
     
    407416        list_initialize(&conn->msg_queue);
    408417        conn->callid = callid;
     418        conn->close_callid = 0;
    409419        if (call)
    410420                conn->call = *call;
Note: See TracChangeset for help on using the changeset viewer.