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


Ignore:
File:
1 edited

Legend:

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

    r03f4acf r5cc9eba  
    5656#define NULL_SERVICES  256
    5757
     58/** Callback session */
     59typedef struct {
     60        link_t cb_sess_list;
     61        async_sess_t *sess;
     62} cb_sess_t;
     63
    5864LIST_INITIALIZE(services_list);
    5965LIST_INITIALIZE(namespaces_list);
     
    8692
    8793static FIBRIL_MUTEX_INITIALIZE(callback_sess_mutex);
    88 static async_sess_t *callback_sess = NULL;
     94static LIST_INITIALIZE(callback_sess_list);
    8995
    9096service_id_t loc_create_id(void)
     
    608614        size_t act_size;
    609615        loc_service_t *svc;
     616        char *fqn;
    610617       
    611618        if (!async_data_read_receive(&callid, &size)) {
     
    625632        }
    626633       
    627         act_size = str_size(svc->name);
     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);
    628642        if (act_size > size) {
     643                free(fqn);
    629644                fibril_mutex_unlock(&services_list_mutex);
    630645                async_answer_0(callid, EOVERFLOW);
     
    633648        }
    634649       
    635         sysarg_t retval = async_data_read_finalize(callid, svc->name,
     650        sysarg_t retval = async_data_read_finalize(callid, fqn,
    636651            min(size, act_size));
     652        free(fqn);
    637653       
    638654        fibril_mutex_unlock(&services_list_mutex);
     
    790806}
    791807
    792 /** Find ID for category specified by name.
    793  *
    794  * On success, answer will contain EOK int retval and service ID in arg1.
     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.
    795814 * On failure, error code will be sent in retval.
    796815 *
     
    798817static void loc_callback_create(ipc_callid_t iid, ipc_call_t *icall)
    799818{
    800         async_sess_t *cb_sess = async_callback_receive(EXCHANGE_SERIALIZE);
     819        cb_sess_t *cb_sess = calloc(1, sizeof(cb_sess_t));
    801820        if (cb_sess == NULL) {
    802821                async_answer_0(iid, ENOMEM);
     
    804823        }
    805824       
     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       
    806835        fibril_mutex_lock(&callback_sess_mutex);
    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;
     836        list_append(&cb_sess->cb_sess_list, &callback_sess_list);
    814837        fibril_mutex_unlock(&callback_sess_mutex);
    815838       
     
    820843{
    821844        fibril_mutex_lock(&callback_sess_mutex);
    822 
    823         if (callback_sess != NULL) {
    824                 async_exch_t *exch = async_exchange_begin(callback_sess);
     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);
    825852                async_msg_0(exch, LOC_EVENT_CAT_CHANGE);
    826853                async_exchange_end(exch);
    827854        }
    828 
     855       
    829856        fibril_mutex_unlock(&callback_sess_mutex);
    830857}
Note: See TracChangeset for help on using the changeset viewer.