Changes in uspace/srv/loc/loc.c [77a69ea:03f4acf] in mainline


Ignore:
File:
1 edited

Legend:

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

    r77a69ea 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.
     796 *
    815797 */
    816798static void loc_callback_create(ipc_callid_t iid, ipc_call_t *icall)
    817799{
    818         cb_sess_t *cb_sess;
    819        
    820         cb_sess = calloc(1, sizeof(cb_sess_t));
     800        async_sess_t *cb_sess = async_callback_receive(EXCHANGE_SERIALIZE);
    821801        if (cb_sess == NULL) {
    822802                async_answer_0(iid, ENOMEM);
     
    824804        }
    825805       
    826         async_sess_t *sess = async_callback_receive(EXCHANGE_SERIALIZE);
    827         if (sess == NULL) {
    828                 free(cb_sess);
    829                 async_answer_0(iid, ENOMEM);
    830                 return;
    831         }
    832        
    833         cb_sess->sess = sess;
    834         link_initialize(&cb_sess->cb_sess_list);
    835        
    836806        fibril_mutex_lock(&callback_sess_mutex);
    837         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;
    838814        fibril_mutex_unlock(&callback_sess_mutex);
    839815       
     
    844820{
    845821        fibril_mutex_lock(&callback_sess_mutex);
    846        
    847         list_foreach(callback_sess_list, link) {
    848                 cb_sess_t *cb_sess;
    849                
    850                 cb_sess = list_get_instance(link, cb_sess_t, cb_sess_list);
    851                
    852                 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);
    853825                async_msg_0(exch, LOC_EVENT_CAT_CHANGE);
    854826                async_exchange_end(exch);
    855827        }
    856        
     828
    857829        fibril_mutex_unlock(&callback_sess_mutex);
    858830}
Note: See TracChangeset for help on using the changeset viewer.