Changeset 0a8f070 in mainline for uspace/lib/c/generic/async/client.c


Ignore:
Timestamp:
2019-08-07T02:33:03Z (6 years ago)
Author:
Matthieu Riolo <matthieu.riolo@…>
Children:
fe86d9d
Parents:
103939e
git-author:
Michal Koutný <xm.koutny+hos@…> (2015-08-16 16:04:14)
git-committer:
Matthieu Riolo <matthieu.riolo@…> (2019-08-07 02:33:03)
Message:

Create taskman server (extracts task-related operations from naming service)

  • Exploits initial phones connected to spawn parent instead of NS.
  • session_ns changed to session_primary (setup during taskman-loader handshake).
  • Task creation moved from NS to taskman (no clonable services anymore).
  • Other task-related operations implementation is to come (task_retval is temporarily dummy).
  • Async framework: implicit connections — create fibrils for calls that arrived through initial phone.

Conflicts:

abi/include/abi/ipc/methods.h
boot/Makefile.common
uspace/Makefile
uspace/app/trace/ipcp.c
uspace/lib/c/generic/async.c
uspace/lib/c/generic/libc.c
uspace/lib/c/generic/loader.c
uspace/lib/c/generic/ns.c
uspace/lib/c/generic/private/async.h
uspace/lib/c/generic/private/ns.h
uspace/lib/c/generic/task.c
uspace/lib/c/include/async.h
uspace/lib/c/include/ipc/services.h
uspace/lib/c/include/ipc/taskman.h
uspace/lib/c/include/loader/pcb.h
uspace/lib/c/include/ns.h
uspace/srv/loader/main.c
uspace/srv/ns/clonable.c
uspace/srv/ns/ns.c

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/async/client.c

    r103939e r0a8f070  
    124124static fibril_rmutex_t message_mutex;
    125125
    126 /** Naming service session */
    127 async_sess_t session_ns;
     126/** Primary session (spawn parent, later naming service) */
     127async_sess_t *session_primary = NULL;
    128128
    129129/** Message data */
     
    168168static FIBRIL_CONDVAR_INITIALIZE(avail_phone_cv);
    169169
     170
     171static async_sess_t *create_session_primary(void)
     172{
     173        async_sess_t *session = (async_sess_t *) malloc(sizeof(async_sess_t));
     174
     175        if (session != NULL) {
     176                session_ns->iface = 0;
     177                session->mgmt = EXCHANGE_ATOMIC;
     178                session->phone = PHONE_INITIAL;
     179                session->arg1 = 0;
     180                session->arg2 = 0;
     181                session->arg3 = 0;
     182               
     183                fibril_mutex_initialize(&session->remote_state_mtx);
     184                session->remote_state_data = NULL;
     185               
     186                list_initialize(&session->exch_list);
     187                fibril_mutex_initialize(&session->mutex);
     188                atomic_set(&session->refcnt, 0);
     189                &session.exchanges = 0;
     190        }
     191
     192        return session;
     193}
     194
     195
    170196/** Initialize the async framework.
    171197 *
    172198 */
    173 void __async_client_init(void)
     199void __async_client_init(async_sess_t *session)
    174200{
    175201        if (fibril_rmutex_initialize(&message_mutex) != EOK)
    176202                abort();
    177203
    178         session_ns.iface = 0;
    179         session_ns.mgmt = EXCHANGE_ATOMIC;
    180         session_ns.phone = PHONE_NS;
    181         session_ns.arg1 = 0;
    182         session_ns.arg2 = 0;
    183         session_ns.arg3 = 0;
    184 
    185         fibril_mutex_initialize(&session_ns.remote_state_mtx);
    186         session_ns.remote_state_data = NULL;
    187 
    188         list_initialize(&session_ns.exch_list);
    189         fibril_mutex_initialize(&session_ns.mutex);
    190         session_ns.exchanges = 0;
     204        if (session == NULL) {
     205                session_primary = create_session_primary();
     206        } else {
     207                session_primary = session;
     208        }
     209
     210        if (session_primary == NULL)
     211                abort();
    191212}
    192213
     
    807828        *out_phone = (cap_phone_handle_t) ipc_get_arg5(&result);
    808829        return EOK;
     830}
     831
     832/** Injects another session instead of original primary session
     833 *
     834 * @param  session  Session to naming service.
     835 *
     836 * @return old primary session (to spawn parent)
     837 */
     838async_sess_t *async_session_primary_swap(async_sess_t *session)
     839{
     840        assert(session_primary->phone == PHONE_INITIAL);
     841
     842        async_sess_t *old_primary = session_primary;
     843        session_primary = session;
     844        return old_primary;
    809845}
    810846
Note: See TracChangeset for help on using the changeset viewer.