source: libcfa/src/concurrency/thread.cfa @ 50b8885

ADTarm-ehast-experimentalenumforall-pointer-decayjacob/cs343-translationjenkins-sandboxnew-astnew-ast-unique-exprpthread-emulationqualifiedEnum
Last change on this file since 50b8885 was 3381ed7, checked in by Thierry Delisle <tdelisle@…>, 4 years ago

Added park/unpark primitives thread and removed BlockInternal?.
Converted monitors to use park unpark.
Intrusive Queue now mark next field when thread is inside queue.
Added several asserts to kernel and monitor.
Added a few tests for park and unpark.

  • Property mode set to 100644
File size: 2.3 KB
RevLine 
[78b3f52]1//
2// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
[75a17f1]7// thread.c --
[78b3f52]8//
9// Author           : Thierry Delisle
[f07e037]10// Created On       : Tue Jan 17 12:27:26 2017
[6b0b624]11// Last Modified By : Peter A. Buhr
[121be3e]12// Last Modified On : Wed Dec  4 09:17:49 2019
13// Update Count     : 9
[78b3f52]14//
15
[2026bb6]16#define __cforall_thread__
17
[58b6d1b]18#include "thread.hfa"
[78b3f52]19
[73abe95]20#include "kernel_private.hfa"
[8118303]21
22#define __CFA_INVOKE_PRIVATE__
23#include "invoke.h"
24
[bd98b58]25extern "C" {
[8fcbb4c]26        #include <fenv.h>
[bd98b58]27        #include <stddef.h>
28}
29
[b10affd]30//extern volatile thread_local processor * this_processor;
[8118303]31
32//-----------------------------------------------------------------------------
33// Thread ctors and dtors
[de6319f]34void ?{}(thread_desc & this, const char * const name, cluster & cl, void * storage, size_t storageSize ) with( this ) {
[121be3e]35        context{ 0p, 0p };
[de6319f]36        self_cor{ name, storage, storageSize };
[e8e457e]37        state = Start;
[3381ed7]38        preempted = __NO_PREEMPTION;
[82c948c]39        curr_cor = &self_cor;
[65deb18]40        self_mon.owner = &this;
41        self_mon.recursion = 1;
42        self_mon_p = &self_mon;
[de6319f]43        curr_cluster = &cl;
[121be3e]44        next = 0p;
[de94a60]45
[121be3e]46        node.next = 0p;
47        node.prev = 0p;
[a1a17a7]48        doregister(curr_cluster, this);
[5ea06d6]49
[65deb18]50        monitors{ &self_mon_p, 1, (fptr_t)0 };
[8118303]51}
52
[65deb18]53void ^?{}(thread_desc& this) with( this ) {
[a1a17a7]54        unregister(curr_cluster, this);
[65deb18]55        ^self_cor{};
[8118303]56}
57
[242a902]58forall( dtype T | sized(T) | is_thread(T) | { void ?{}(T&); } )
[65deb18]59void ?{}( scoped(T)& this ) with( this ) {
60        handle{};
[09f357ec]61        __thrd_start(handle, main);
[8118303]62}
63
[242a902]64forall( dtype T, ttype P | sized(T) | is_thread(T) | { void ?{}(T&, P); } )
[65deb18]65void ?{}( scoped(T)& this, P params ) with( this ) {
66        handle{ params };
[09f357ec]67        __thrd_start(handle, main);
[8118303]68}
69
[9f1695b]70forall( dtype T | sized(T) | is_thread(T) )
[65deb18]71void ^?{}( scoped(T)& this ) with( this ) {
72        ^handle{};
[8118303]73}
74
75//-----------------------------------------------------------------------------
76// Starting and stopping threads
[0c92c9f]77forall( dtype T | is_thread(T) )
[09f357ec]78void __thrd_start( T & this, void (*main_p)(T &) ) {
[e8e457e]79        thread_desc * this_thrd = get_thread(this);
[8118303]80
[1c273d0]81        disable_interrupts();
[09f357ec]82        CtxStart(main_p, get_coroutine(this), this, CtxInvokeThread);
83
[e8e457e]84        this_thrd->context.[SP, FP] = this_thrd->self_cor.context.[SP, FP];
85        verify( this_thrd->context.SP );
[8118303]86
[e8e457e]87        ScheduleThread(this_thrd);
[36982fc]88        enable_interrupts( __cfaabi_dbg_ctx );
[8118303]89}
90
[78b3f52]91// Local Variables: //
92// mode: c //
93// tab-width: 4 //
[6a3d2e7]94// End: //
Note: See TracBrowser for help on using the repository browser.