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

Changeset 1cab2f41 in mainline


Ignore:
Timestamp:
2009-06-26T15:05:36Z (12 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master
Children:
af65b72
Parents:
103bb68
Message:

Do not use the pending mechanism in devmap.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/devmap/devmap.c

    r103bb68 r1cab2f41  
    4646#include <string.h>
    4747#include <ipc/devmap.h>
    48 #include <assert.h>
    4948
    5049#define NAME  "devmap"
     
    8584} devmap_device_t;
    8685
    87 /** Pending lookup structure. */
    88 typedef struct {
    89         link_t link;
    90         char *name;              /**< Device name */
    91         ipc_callid_t callid;     /**< Call ID waiting for the lookup */
    92 } pending_req_t;
    93 
    9486LIST_INITIALIZE(devices_list);
    9587LIST_INITIALIZE(drivers_list);
    96 LIST_INITIALIZE(pending_req);
    97 
    98 static bool pending_new_dev = false;
    99 static FIBRIL_CONDVAR_INITIALIZE(pending_cv);
    10088
    10189/* Locking order:
     
    10795
    10896static FIBRIL_MUTEX_INITIALIZE(devices_list_mutex);
     97static FIBRIL_CONDVAR_INITIALIZE(devices_list_cv);
    10998static FIBRIL_MUTEX_INITIALIZE(drivers_list_mutex);
    11099static FIBRIL_MUTEX_INITIALIZE(create_handle_mutex);
     
    344333        return EOK;
    345334}
    346 
    347 
    348 /** Process pending lookup requests */
    349 static void process_pending_lookup(void)
    350 {
    351         link_t *cur;
    352 
    353 loop:
    354         fibril_mutex_lock(&devices_list_mutex);
    355         while (!pending_new_dev)
    356                 fibril_condvar_wait(&pending_cv, &devices_list_mutex);
    357 rescan:
    358         for (cur = pending_req.next; cur != &pending_req; cur = cur->next) {
    359                 pending_req_t *pr = list_get_instance(cur, pending_req_t, link);
    360                
    361                 const devmap_device_t *dev = devmap_device_find_name(pr->name);
    362                 if (!dev)
    363                         continue;
    364                
    365                 ipc_answer_1(pr->callid, EOK, dev->handle);
    366                
    367                 free(pr->name);
    368                 list_remove(cur);
    369                 free(pr);
    370                
    371                 goto rescan;
    372         }
    373         pending_new_dev = false;
    374         fibril_mutex_unlock(&devices_list_mutex);
    375         goto loop;
    376 }
    377 
    378335
    379336/** Register instance of device
     
    453410       
    454411        fibril_mutex_unlock(&device->driver->devices_mutex);
    455         pending_new_dev = true;
    456         fibril_condvar_signal(&pending_cv);
     412        fibril_condvar_broadcast(&devices_list_cv);
    457413        fibril_mutex_unlock(&devices_list_mutex);
    458414       
     
    541497       
    542498        fibril_mutex_lock(&devices_list_mutex);
    543 
    544         /*
    545          * Find device name in linked list of known devices.
    546          */
    547         const devmap_device_t *dev = devmap_device_find_name(name);
     499        const devmap_device_t *dev;
     500recheck:
     501
     502        /*
     503         * Find device name in the list of known devices.
     504         */
     505        dev = devmap_device_find_name(name);
    548506       
    549507        /*
     
    552510        if (dev == NULL) {
    553511                if (IPC_GET_ARG1(*icall) & IPC_FLAG_BLOCKING) {
    554                         /* Blocking lookup, add to pending list */
    555                         pending_req_t *pr = (pending_req_t *) malloc(sizeof(pending_req_t));
    556                         if (!pr) {
    557                                 fibril_mutex_unlock(&devices_list_mutex);
    558                                 ipc_answer_0(iid, ENOMEM);
    559                                 free(name);
    560                                 return;
    561                         }
    562                        
    563                         pr->name = name;
    564                         pr->callid = iid;
    565                         list_append(&pr->link, &pending_req);
    566                         fibril_mutex_unlock(&devices_list_mutex);
    567                         return;
     512                        /* Blocking lookup */
     513                        fibril_condvar_wait(&devices_list_cv,
     514                            &devices_list_mutex);
     515                        goto recheck;
    568516                }
    569517               
     
    837785        async_set_client_connection(devmap_connection);
    838786
    839         /* Create a fibril for handling pending device lookups */
    840         fid_t fid = fibril_create(process_pending_lookup, NULL);
    841         assert(fid);
    842         fibril_add_ready(fid);
    843        
    844787        /* Register device mapper at naming service */
    845788        ipcarg_t phonead;
Note: See TracChangeset for help on using the changeset viewer.