Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset f53cc81 in mainline


Ignore:
Timestamp:
2009-10-10T21:50:22Z (11 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
master
Children:
b6ee5b1
Parents:
4f5edcf6
Message:

Separate timeout-specific wait data from generic wait data in awaiter_t.

Location:
uspace/lib/libc
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/libc/generic/async.c

    r4f5edcf6 rf53cc81  
    235235static void insert_timeout(awaiter_t *wd)
    236236{
    237         wd->timedout = false;
    238         wd->inlist = true;
     237        wd->to_event.occurred = false;
     238        wd->to_event.inlist = true;
    239239       
    240240        link_t *tmp = timeout_list.next;
    241241        while (tmp != &timeout_list) {
    242                 awaiter_t *cur = list_get_instance(tmp, awaiter_t, link);
    243                
    244                 if (tv_gteq(&cur->expires, &wd->expires))
     242                awaiter_t *cur;
     243               
     244                cur = list_get_instance(tmp, awaiter_t, to_event.link);
     245                if (tv_gteq(&cur->to_event.expires, &wd->to_event.expires))
    245246                        break;
    246                
    247247                tmp = tmp->next;
    248248        }
    249249       
    250         list_append(&wd->link, tmp);
     250        list_append(&wd->to_event.link, tmp);
    251251}
    252252
     
    295295               
    296296                /* If in timeout list, remove it */
    297                 if (conn->wdata.inlist) {
    298                         conn->wdata.inlist = false;
    299                         list_remove(&conn->wdata.link);
     297                if (conn->wdata.to_event.inlist) {
     298                        conn->wdata.to_event.inlist = false;
     299                        list_remove(&conn->wdata.to_event.link);
    300300                }
    301301               
     
    385385       
    386386        if (usecs) {
    387                 gettimeofday(&conn->wdata.expires, NULL);
    388                 tv_add(&conn->wdata.expires, usecs);
     387                gettimeofday(&conn->wdata.to_event.expires, NULL);
     388                tv_add(&conn->wdata.to_event.expires, usecs);
    389389        } else
    390                 conn->wdata.inlist = false;
     390                conn->wdata.to_event.inlist = false;
    391391       
    392392        /* If nothing in queue, wait until something arrives */
     
    410410                 */
    411411                futex_down(&async_futex);
    412                 if ((usecs) && (conn->wdata.timedout)
     412                if ((usecs) && (conn->wdata.to_event.occurred)
    413413                    && (list_empty(&conn->msg_queue))) {
    414414                        /* If we timed out -> exit */
     
    605605        link_t *cur = timeout_list.next;
    606606        while (cur != &timeout_list) {
    607                 awaiter_t *waiter = list_get_instance(cur, awaiter_t, link);
    608                
    609                 if (tv_gt(&waiter->expires, &tv))
     607                awaiter_t *waiter;
     608               
     609                waiter = list_get_instance(cur, awaiter_t, to_event.link);
     610                if (tv_gt(&waiter->to_event.expires, &tv))
    610611                        break;
    611                
     612
    612613                cur = cur->next;
    613                
    614                 list_remove(&waiter->link);
    615                 waiter->inlist = false;
    616                 waiter->timedout = true;
     614
     615                list_remove(&waiter->to_event.link);
     616                waiter->to_event.inlist = false;
     617                waiter->to_event.occurred = true;
    617618               
    618619                /*
     
    651652                if (!list_empty(&timeout_list)) {
    652653                        awaiter_t *waiter = list_get_instance(timeout_list.next,
    653                             awaiter_t, link);
     654                            awaiter_t, to_event.link);
    654655                       
    655656                        struct timeval tv;
    656657                        gettimeofday(&tv, NULL);
    657658                       
    658                         if (tv_gteq(&tv, &waiter->expires)) {
     659                        if (tv_gteq(&tv, &waiter->to_event.expires)) {
    659660                                futex_up(&async_futex);
    660661                                handle_expired_timeouts();
    661662                                continue;
    662663                        } else
    663                                 timeout = tv_sub(&waiter->expires, &tv);
     664                                timeout = tv_sub(&waiter->to_event.expires,
     665                                    &tv);
    664666                } else
    665667                        timeout = SYNCH_NO_TIMEOUT;
     
    762764       
    763765        /* Remove message from timeout list */
    764         if (msg->wdata.inlist)
    765                 list_remove(&msg->wdata.link);
     766        if (msg->wdata.to_event.inlist)
     767                list_remove(&msg->wdata.to_event.link);
    766768       
    767769        msg->done = true;
     
    802804        msg->dataptr = dataptr;
    803805       
    804         msg->wdata.inlist = false;
     806        msg->wdata.to_event.inlist = false;
    805807        /* We may sleep in the next method, but it will use its own mechanism */
    806808        msg->wdata.active = true;
     
    842844        msg->dataptr = dataptr;
    843845       
    844         msg->wdata.inlist = false;
     846        msg->wdata.to_event.inlist = false;
    845847        /* We may sleep in next method, but it will use its own mechanism */
    846848        msg->wdata.active = true;
     
    871873        msg->wdata.fid = fibril_get_id();
    872874        msg->wdata.active = false;
    873         msg->wdata.inlist = false;
     875        msg->wdata.to_event.inlist = false;
    874876       
    875877        /* Leave the async_futex locked when entering this function */
     
    909911        }
    910912       
    911         gettimeofday(&msg->wdata.expires, NULL);
    912         tv_add(&msg->wdata.expires, timeout);
     913        gettimeofday(&msg->wdata.to_event.expires, NULL);
     914        tv_add(&msg->wdata.to_event.expires, timeout);
    913915       
    914916        msg->wdata.fid = fibril_get_id();
     
    950952        msg->wdata.active = false;
    951953       
    952         gettimeofday(&msg->wdata.expires, NULL);
    953         tv_add(&msg->wdata.expires, timeout);
     954        gettimeofday(&msg->wdata.to_event.expires, NULL);
     955        tv_add(&msg->wdata.to_event.expires, timeout);
    954956       
    955957        futex_down(&async_futex);
  • uspace/lib/libc/include/async_priv.h

    r4f5edcf6 rf53cc81  
    4141#include <bool.h>
    4242
    43 /** Structures of this type represent a waiting fibril. */
     43/** Structures of this type are used to track the timeout events. */
    4444typedef struct {
    45         /** Expiration time. */
    46         struct timeval expires;
    47        
    4845        /** If true, this struct is in the timeout list. */
    4946        bool inlist;
     
    5249        link_t link;
    5350       
     51        /** If true, we have timed out. */
     52        bool occurred;
     53
     54        /** Expiration time. */
     55        struct timeval expires;
     56} to_event_t;
     57
     58/** Structures of this type represent a waiting fibril. */
     59typedef struct {
    5460        /** Identification of and link to the waiting fibril. */
    5561        fid_t fid;
     
    5763        /** If true, this fibril is currently active. */
    5864        bool active;
    59        
    60         /** If true, we have timed out. */
    61         bool timedout;
     65
     66        /** Timeout wait data. */
     67        to_event_t to_event;
    6268} awaiter_t;
    6369
Note: See TracChangeset for help on using the changeset viewer.