Changes in uspace/srv/ns/task.c [007e6efa:96b02eb9] in mainline


Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/ns/task.c

    r007e6efa r96b02eb9  
    4343
    4444#define TASK_HASH_TABLE_CHAINS  256
    45 #define P2I_HASH_TABLE_CHAINS   256
     45#define P2I_HASH_TABLE_CHAINS  256
     46
     47static int get_id_by_phone(sysarg_t phone_hash, task_id_t *id);
    4648
    4749/* TODO:
     
    5557typedef struct {
    5658        link_t link;
    57        
    58         task_id_t id;    /**< Task ID. */
    59         bool finished;   /**< Task is done. */
    60         bool have_rval;  /**< Task returned a value. */
    61         int retval;      /**< The return value. */
     59        task_id_t id;   /**< Task ID. */
     60        bool finished;  /**< Task is done. */
     61        bool have_rval; /**< Task returned a value. */
     62        int retval;     /**< The return value. */
    6263} hashed_task_t;
    6364
     
    7071 *
    7172 */
    72 static hash_index_t task_hash(unsigned long key[])
     73static hash_index_t task_hash(unsigned long *key)
    7374{
    7475        assert(key);
    75         return (LOWER32(key[0]) % TASK_HASH_TABLE_CHAINS);
     76        return (LOWER32(*key) % TASK_HASH_TABLE_CHAINS);
    7677}
    7778
     
    123124typedef struct {
    124125        link_t link;
    125         sysarg_t in_phone_hash;  /**< Incoming phone hash. */
    126         task_id_t id;            /**< Task ID. */
     126        sysarg_t phash;    /**< Task ID. */
     127        task_id_t id;    /**< Task ID. */
    127128} p2i_entry_t;
    128129
     
    130131 *
    131132 * @param key Array of keys.
    132  *
    133133 * @return Hash index corresponding to key[0].
    134134 *
    135135 */
    136 static hash_index_t p2i_hash(unsigned long key[])
     136static hash_index_t p2i_hash(unsigned long *key)
    137137{
    138138        assert(key);
    139         return (key[0] % TASK_HASH_TABLE_CHAINS);
     139        return (*key % TASK_HASH_TABLE_CHAINS);
    140140}
    141141
     
    154154        assert(keys == 1);
    155155        assert(item);
    156        
    157         p2i_entry_t *entry = hash_table_get_instance(item, p2i_entry_t, link);
    158        
    159         return (key[0] == entry->in_phone_hash);
     156
     157        p2i_entry_t *e = hash_table_get_instance(item, p2i_entry_t, link);
     158
     159        return (key[0] == e->phash);
    160160}
    161161
     
    197197                return ENOMEM;
    198198        }
    199        
     199
    200200        if (!hash_table_create(&phone_to_id, P2I_HASH_TABLE_CHAINS,
    201201            1, &p2i_ops)) {
     
    205205       
    206206        list_initialize(&pending_wait);
     207       
    207208        return EOK;
    208209}
     
    237238                            ht->retval);
    238239                }
    239                
     240
    240241                hash_table_remove(&task_hash_table, keys, 2);
    241242                list_remove(cur);
     
    249250        sysarg_t retval;
    250251        task_exit_t texit;
    251        
     252
    252253        unsigned long keys[2] = {
    253254                LOWER32(id),
    254255                UPPER32(id)
    255256        };
    256        
     257
    257258        link_t *link = hash_table_find(&task_hash_table, keys);
    258259        hashed_task_t *ht = (link != NULL) ?
    259260            hash_table_get_instance(link, hashed_task_t, link) : NULL;
    260        
     261
    261262        if (ht == NULL) {
    262263                /* No such task exists. */
     
    264265                return;
    265266        }
    266        
     267
    267268        if (!ht->finished) {
    268269                /* Add to pending list */
     
    274275                }
    275276               
    276                 link_initialize(&pr->link);
    277277                pr->id = id;
    278278                pr->callid = callid;
     
    293293int ns_task_id_intro(ipc_call_t *call)
    294294{
     295        task_id_t id;
    295296        unsigned long keys[2];
    296        
    297         task_id_t id = MERGE_LOUP32(IPC_GET_ARG1(*call), IPC_GET_ARG2(*call));
     297        link_t *link;
     298        p2i_entry_t *e;
     299        hashed_task_t *ht;
     300
     301        id = MERGE_LOUP32(IPC_GET_ARG1(*call), IPC_GET_ARG2(*call));
     302
    298303        keys[0] = call->in_phone_hash;
    299        
    300         link_t *link = hash_table_find(&phone_to_id, keys);
     304
     305        link = hash_table_find(&phone_to_id, keys);
    301306        if (link != NULL)
    302307                return EEXISTS;
    303        
    304         p2i_entry_t *entry = (p2i_entry_t *) malloc(sizeof(p2i_entry_t));
    305         if (entry == NULL)
     308
     309        e = (p2i_entry_t *) malloc(sizeof(p2i_entry_t));
     310        if (e == NULL)
    306311                return ENOMEM;
    307        
    308         hashed_task_t *ht = (hashed_task_t *) malloc(sizeof(hashed_task_t));
     312
     313        ht = (hashed_task_t *) malloc(sizeof(hashed_task_t));
    309314        if (ht == NULL)
    310315                return ENOMEM;
    311        
    312         /*
    313          * Insert into the phone-to-id map.
    314          */
    315        
    316         link_initialize(&entry->link);
    317         entry->in_phone_hash = call->in_phone_hash;
    318         entry->id = id;
    319         hash_table_insert(&phone_to_id, keys, &entry->link);
    320        
    321         /*
    322          * Insert into the main table.
    323          */
    324        
     316
     317        /* Insert to phone-to-id map. */
     318
     319        link_initialize(&e->link);
     320        e->phash = call->in_phone_hash;
     321        e->id = id;
     322        hash_table_insert(&phone_to_id, keys, &e->link);
     323
     324        /* Insert to main table. */
     325
    325326        keys[0] = LOWER32(id);
    326327        keys[1] = UPPER32(id);
    327        
     328
    328329        link_initialize(&ht->link);
    329330        ht->id = id;
     
    332333        ht->retval = -1;
    333334        hash_table_insert(&task_hash_table, keys, &ht->link);
    334        
     335
    335336        return EOK;
    336337}
    337338
    338 static int get_id_by_phone(sysarg_t phone_hash, task_id_t *id)
    339 {
    340         unsigned long keys[1] = {phone_hash};
    341        
    342         link_t *link = hash_table_find(&phone_to_id, keys);
    343         if (link == NULL)
    344                 return ENOENT;
    345        
    346         p2i_entry_t *entry = hash_table_get_instance(link, p2i_entry_t, link);
    347         *id = entry->id;
    348        
    349         return EOK;
    350 }
    351 
    352339int ns_task_retval(ipc_call_t *call)
    353340{
    354341        task_id_t id;
    355         int rc = get_id_by_phone(call->in_phone_hash, &id);
     342        unsigned long keys[2];
     343        int rc;
     344
     345        rc = get_id_by_phone(call->in_phone_hash, &id);
    356346        if (rc != EOK)
    357347                return rc;
    358        
    359         unsigned long keys[2] = {
    360                 LOWER32(id),
    361                 UPPER32(id)
    362         };
     348
     349        keys[0] = LOWER32(id);
     350        keys[1] = UPPER32(id);
    363351       
    364352        link_t *link = hash_table_find(&task_hash_table, keys);
     
    366354            hash_table_get_instance(link, hashed_task_t, link) : NULL;
    367355       
    368         if ((ht == NULL) || (ht->finished))
     356        if ((ht == NULL) || ht->finished)
    369357                return EINVAL;
    370        
     358
    371359        ht->finished = true;
    372360        ht->have_rval = true;
    373361        ht->retval = IPC_GET_ARG1(*call);
    374        
     362
    375363        return EOK;
    376364}
     
    379367{
    380368        unsigned long keys[2];
    381        
    382369        task_id_t id;
    383         int rc = get_id_by_phone(call->in_phone_hash, &id);
     370        int rc;
     371
     372        rc = get_id_by_phone(call->in_phone_hash, &id);
    384373        if (rc != EOK)
    385374                return rc;
    386        
     375
    387376        /* Delete from phone-to-id map. */
    388377        keys[0] = call->in_phone_hash;
    389378        hash_table_remove(&phone_to_id, keys, 1);
    390        
     379
    391380        /* Mark task as finished. */
    392381        keys[0] = LOWER32(id);
    393382        keys[1] = UPPER32(id);
    394        
     383
    395384        link_t *link = hash_table_find(&task_hash_table, keys);
    396385        hashed_task_t *ht =
     
    398387        if (ht == NULL)
    399388                return EOK;
    400        
     389
    401390        ht->finished = true;
    402        
     391
     392        return EOK;
     393}
     394
     395static int get_id_by_phone(sysarg_t phone_hash, task_id_t *id)
     396{
     397        unsigned long keys[1];
     398        link_t *link;
     399        p2i_entry_t *e;
     400
     401        keys[0] = phone_hash;
     402        link = hash_table_find(&phone_to_id, keys);
     403        if (link == NULL)
     404                return ENOENT;
     405
     406        e = hash_table_get_instance(link, p2i_entry_t, link);
     407        *id = e->id;
     408
    403409        return EOK;
    404410}
Note: See TracChangeset for help on using the changeset viewer.