Changes in uspace/srv/loc/loc.c [763e0cd:cce8a83] in mainline


Ignore:
File:
1 edited

Legend:

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

    r763e0cd rcce8a83  
    8484/** Service directory ogranized by categories (yellow pages) */
    8585static categ_dir_t cdir;
    86 
    87 static FIBRIL_MUTEX_INITIALIZE(callback_sess_mutex);
    88 static async_sess_t *callback_sess = NULL;
    8986
    9087service_id_t loc_create_id(void)
     
    536533}
    537534
    538 static void loc_category_get_name(ipc_callid_t iid, ipc_call_t *icall)
    539 {
    540         ipc_callid_t callid;
    541         size_t size;
    542         size_t act_size;
    543         category_t *cat;
    544        
    545         if (!async_data_read_receive(&callid, &size)) {
    546                 async_answer_0(callid, EREFUSED);
    547                 async_answer_0(iid, EREFUSED);
    548                 return;
    549         }
    550        
    551         fibril_mutex_lock(&cdir.mutex);
    552        
    553         cat = category_get(&cdir, IPC_GET_ARG1(*icall));
    554         if (cat == NULL) {
    555                 fibril_mutex_unlock(&cdir.mutex);
    556                 async_answer_0(callid, ENOENT);
    557                 async_answer_0(iid, ENOENT);
    558                 return;
    559         }
    560        
    561         act_size = str_size(cat->name);
    562         if (act_size > size) {
    563                 fibril_mutex_unlock(&cdir.mutex);
    564                 async_answer_0(callid, EOVERFLOW);
    565                 async_answer_0(iid, EOVERFLOW);
    566                 return;
    567         }
    568        
    569         sysarg_t retval = async_data_read_finalize(callid, cat->name,
    570             min(size, act_size));
    571        
    572         fibril_mutex_unlock(&cdir.mutex);
    573        
    574         async_answer_0(iid, retval);
    575 }
    576 
    577535static void loc_service_get_name(ipc_callid_t iid, ipc_call_t *icall)
    578536{
     
    613571        async_answer_0(iid, retval);
    614572}
     573
    615574
    616575/** Connect client to the service.
     
    769728 *
    770729 */
    771 static void loc_callback_create(ipc_callid_t iid, ipc_call_t *icall)
    772 {
    773         async_sess_t *cb_sess = async_callback_receive(EXCHANGE_SERIALIZE);
    774         if (cb_sess == NULL) {
    775                 async_answer_0(iid, ENOMEM);
    776                 return;
    777         }
    778        
    779         fibril_mutex_lock(&callback_sess_mutex);
    780         if (callback_sess != NULL) {
    781                 fibril_mutex_unlock(&callback_sess_mutex);
    782                 async_answer_0(iid, EEXIST);
    783                 return;
    784         }
    785        
    786         callback_sess = cb_sess;
    787         fibril_mutex_unlock(&callback_sess_mutex);
    788        
    789         async_answer_0(iid, EOK);
    790 }
    791 
    792 void loc_category_change_event(void)
    793 {
    794         fibril_mutex_lock(&callback_sess_mutex);
    795 
    796         if (callback_sess != NULL) {
    797                 async_exch_t *exch = async_exchange_begin(callback_sess);
    798                 async_msg_0(exch, LOC_EVENT_CAT_CHANGE);
    799                 async_exchange_end(exch);
    800         }
    801 
    802         fibril_mutex_unlock(&callback_sess_mutex);
    803 }
    804 
    805 /** Find ID for category specified by name.
    806  *
    807  * On success, answer will contain EOK int retval and service ID in arg1.
    808  * On failure, error code will be sent in retval.
    809  *
    810  */
    811730static void loc_category_get_id(ipc_callid_t iid, ipc_call_t *icall)
    812731{
     
    12101129
    12111130        async_answer_0(iid, retval);
    1212 
    1213         loc_category_change_event();
    12141131}
    12151132
     
    12391156
    12401157        cat = category_new("serial");
    1241         categ_dir_add_cat(&cdir, cat);
    1242 
    1243         cat = category_new("usbhc");
    12441158        categ_dir_add_cat(&cdir, cat);
    12451159
     
    13301244                        loc_namespace_get_id(callid, &call);
    13311245                        break;
    1332                 case LOC_CALLBACK_CREATE:
    1333                         loc_callback_create(callid, &call);
    1334                         break;
    13351246                case LOC_CATEGORY_GET_ID:
    13361247                        loc_category_get_id(callid, &call);
    1337                         break;
    1338                 case LOC_CATEGORY_GET_NAME:
    1339                         loc_category_get_name(callid, &call);
    13401248                        break;
    13411249                case LOC_CATEGORY_GET_SVCS:
Note: See TracChangeset for help on using the changeset viewer.