source: tests/io/away_fair.cfa@ ba897d21

ADT ast-experimental pthread-emulation qualifiedEnum
Last change on this file since ba897d21 was 496f92ed, checked in by Thierry Delisle <tdelisle@…>, 4 years ago

Enabled away_fair test and added more randomness to it.

  • Property mode set to 100644
File size: 2.2 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2022 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//
7// away_fair.cfa -- Test that spinning doesn't cause submissions to get stuck.
8// This test should work without io_uring but isn't very useful without
9//
10// Author : Thierry Delisle
11// Created On : Wed Mar 2 12:56:51 2022
12// Last Modified By :
13// Last Modified On :
14// Update Count :
15//
16
17#include <bits/defs.hfa>
18#include <fstream.hfa>
19#include <kernel.hfa>
20#include <thread.hfa>
21#include <iofwd.hfa>
22#include <io/types.hfa>
23
24Duration default_preemption() {
25 return 0;
26}
27
28enum { TIMES = 1000 };
29
30volatile unsigned counter = 0;
31
32// ----- Spinner -----
33// spins trying to prevent other threads from getting to this processor
34thread Spinner {};
35void ^?{}(Spinner &mutex ) {}
36void main(Spinner &) {
37 unsigned last = 0;
38 for() {
39 unsigned curr = __atomic_load_n(&counter, __ATOMIC_SEQ_CST);
40
41 if(curr >= TIMES) return;
42
43 if(last == curr) {
44 Pause();
45 continue;
46 }
47
48 last = curr;
49 yield();
50 }
51}
52
53// ----- Spinner -----
54// try to submit io but yield so that it's likely we are moved to the slow path
55thread Submitter {};
56void ^?{}(Submitter &mutex ) {}
57void main(Submitter & this) {
58 for(TIMES) {
59 #if CFA_HAVE_LINUX_IO_URING_H
60 io_future_t f;
61 struct io_uring_sqe * sqe;
62 __u32 idx;
63 struct $io_context * ctx = cfa_io_allocate(&sqe, &idx, 1);
64
65 zero_sqe(sqe);
66 sqe->opcode = IORING_OP_NOP;
67 sqe->user_data = (uintptr_t)&f;
68 #endif
69
70 yield( prng( this, 15 ) );
71
72 #if CFA_HAVE_LINUX_IO_URING_H
73 // Submit everything
74 asm volatile("": : :"memory");
75 cfa_io_submit( ctx, &idx, 1, false );
76 #endif
77
78 unsigned i = __atomic_add_fetch( &counter, 1, __ATOMIC_SEQ_CST );
79 if(0 == (i % 100)) sout | i;
80
81 #if CFA_HAVE_LINUX_IO_URING_H
82 wait( f );
83 #endif
84 }
85}
86
87// ----- Yielder -----
88// Add some chaos into the mix
89thread Yielder {};
90void ^?{}(Yielder &mutex ) {}
91void main(Yielder&) {
92 while(TIMES > __atomic_load_n(&counter, __ATOMIC_SEQ_CST)) {
93 yield();
94 }
95}
96
97
98int main() {
99 processor p;
100 sout | "starting";
101 {
102 Yielder y;
103 Spinner s;
104 Submitter io;
105 }
106 sout | "done";
107}
Note: See TracBrowser for help on using the repository browser.