Changes in uspace/srv/loc/loc.c [5cc9eba:03f4acf] in mainline


Ignore:
File:
1 edited

Legend:

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

    r5cc9eba r03f4acf  
    5656#define NULL_SERVICES  256
    5757
    58 /** Callback session */
    59 typedef struct {
    60         link_t cb_sess_list;
    61         async_sess_t *sess;
    62 } cb_sess_t;
    63 
    6458LIST_INITIALIZE(services_list);
    6559LIST_INITIALIZE(namespaces_list);
     
    9286
    9387static FIBRIL_MUTEX_INITIALIZE(callback_sess_mutex);
    94 static LIST_INITIALIZE(callback_sess_list);
     88static async_sess_t *callback_sess = NULL;
    9589
    9690service_id_t loc_create_id(void)
     
    614608        size_t act_size;
    615609        loc_service_t *svc;
    616         char *fqn;
    617610       
    618611        if (!async_data_read_receive(&callid, &size)) {
     
    632625        }
    633626       
    634         if (asprintf(&fqn, "%s/%s", svc->namespace->name, svc->name) < 0) {
    635                 fibril_mutex_unlock(&services_list_mutex);
    636                 async_answer_0(callid, ENOMEM);
    637                 async_answer_0(iid, ENOMEM);
    638                 return;
    639         }
    640        
    641         act_size = str_size(fqn);
     627        act_size = str_size(svc->name);
    642628        if (act_size > size) {
    643                 free(fqn);
    644629                fibril_mutex_unlock(&services_list_mutex);
    645630                async_answer_0(callid, EOVERFLOW);
     
    648633        }
    649634       
    650         sysarg_t retval = async_data_read_finalize(callid, fqn,
     635        sysarg_t retval = async_data_read_finalize(callid, svc->name,
    651636            min(size, act_size));
    652         free(fqn);
    653637       
    654638        fibril_mutex_unlock(&services_list_mutex);
     
    806790}
    807791
    808 /** Create callback connection.
    809  *
    810  * Create callback connection which will be used to send category change
    811  * events.
    812  *
    813  * On success, answer will contain EOK int retval.
     792/** Find ID for category specified by name.
     793 *
     794 * On success, answer will contain EOK int retval and service ID in arg1.
    814795 * On failure, error code will be sent in retval.
    815796 *
     
    817798static void loc_callback_create(ipc_callid_t iid, ipc_call_t *icall)
    818799{
    819         cb_sess_t *cb_sess = calloc(1, sizeof(cb_sess_t));
     800        async_sess_t *cb_sess = async_callback_receive(EXCHANGE_SERIALIZE);
    820801        if (cb_sess == NULL) {
    821802                async_answer_0(iid, ENOMEM);
     
    823804        }
    824805       
    825         async_sess_t *sess = async_callback_receive(EXCHANGE_SERIALIZE);
    826         if (sess == NULL) {
    827                 free(cb_sess);
    828                 async_answer_0(iid, ENOMEM);
    829                 return;
    830         }
    831        
    832         cb_sess->sess = sess;
    833         link_initialize(&cb_sess->cb_sess_list);
    834        
    835806        fibril_mutex_lock(&callback_sess_mutex);
    836         list_append(&cb_sess->cb_sess_list, &callback_sess_list);
     807        if (callback_sess != NULL) {
     808                fibril_mutex_unlock(&callback_sess_mutex);
     809                async_answer_0(iid, EEXIST);
     810                return;
     811        }
     812       
     813        callback_sess = cb_sess;
    837814        fibril_mutex_unlock(&callback_sess_mutex);
    838815       
     
    843820{
    844821        fibril_mutex_lock(&callback_sess_mutex);
    845        
    846         list_foreach(callback_sess_list, link) {
    847                 cb_sess_t *cb_sess;
    848                
    849                 cb_sess = list_get_instance(link, cb_sess_t, cb_sess_list);
    850                
    851                 async_exch_t *exch = async_exchange_begin(cb_sess->sess);
     822
     823        if (callback_sess != NULL) {
     824                async_exch_t *exch = async_exchange_begin(callback_sess);
    852825                async_msg_0(exch, LOC_EVENT_CAT_CHANGE);
    853826                async_exchange_end(exch);
    854827        }
    855        
     828
    856829        fibril_mutex_unlock(&callback_sess_mutex);
    857830}
Note: See TracChangeset for help on using the changeset viewer.