Changeset c124c985 in mainline for uspace/lib/c/generic/fibril.c


Ignore:
Timestamp:
2018-07-16T15:38:16Z (6 years ago)
Author:
Jiří Zárevúcky <jiri.zarevucky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
38d8849
Parents:
c45dc5e1
git-author:
Jiří Zárevúcky <jiri.zarevucky@…> (2018-07-13 23:18:58)
git-committer:
Jiří Zárevúcky <jiri.zarevucky@…> (2018-07-16 15:38:16)
Message:

Add fibril_rmutex_t type and fibril multithreading enablement.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/fibril.c

    rc45dc5e1 rc124c985  
    344344}
    345345
     346static void _runner_fn(void *arg)
     347{
     348        futex_lock(&async_futex);
     349        (void) fibril_switch(FIBRIL_FROM_BLOCKED);
     350        __builtin_unreachable();
     351}
     352
     353/**
     354 * Spawn a given number of runners (i.e. OS threads) immediately, and
     355 * unconditionally. This is meant to be used for tests and debugging.
     356 * Regular programs should just use `fibril_enable_multithreaded()`.
     357 *
     358 * @param n  Number of runners to spawn.
     359 * @return   Number of runners successfully spawned.
     360 */
     361int fibril_test_spawn_runners(int n)
     362{
     363        errno_t rc;
     364
     365        for (int i = 0; i < n; i++) {
     366                thread_id_t tid;
     367                rc = thread_create(_runner_fn, NULL, "fibril runner", &tid);
     368                if (rc != EOK)
     369                        return i;
     370                thread_detach(tid);
     371        }
     372
     373        return n;
     374}
     375
     376/**
     377 * Opt-in to have more than one runner thread.
     378 *
     379 * Currently, a task only ever runs in one thread because multithreading
     380 * might break some existing code.
     381 *
     382 * Eventually, the number of runner threads for a given task should become
     383 * configurable in the environment and this function becomes no-op.
     384 */
     385void fibril_enable_multithreaded(void)
     386{
     387        // TODO: Implement better.
     388        //       For now, 4 total runners is a sensible default.
     389        fibril_test_spawn_runners(3);
     390}
     391
     392/**
     393 * Detach a fibril.
     394 */
     395void fibril_detach(fid_t f)
     396{
     397        // TODO: Currently all fibrils are detached by default, but they
     398        //       won't always be. Code that explicitly spawns fibrils with
     399        //       limited lifetime should call this function.
     400}
     401
    346402/** @}
    347403 */
Note: See TracChangeset for help on using the changeset viewer.