#include <stdio.h>
#ifndef ASYNC_H
#define ASYNC_H
#define async(...) int *_state_ = &(__VA_ARGS__); switch (*_state_) while (1) if (1) {*_state_ = 1; case 1: return 1;} else default:
#define await(...) if (!(*_state_ = __LINE__)); else case __LINE__: switch (0) while (1) if (!(__VA_ARGS__)) return 0; else if (1) break; else default:
#define yield if (0) case __LINE__:; else switch (0) while (1) if (1) {*_state_ = __LINE__; return 0;} else default:
#define leave switch (0) while (1) if (1) {*_state_ = 1; return 1;} else default:
#define until(...) while (!(__VA_ARGS__))
#endif
typedef union {
struct {
int n;
int i;
int state;
} ;
int result;
} write_async_task;
int write_async( write_async_task * t) {
async ( t-> state) {
printf ( "write %d: start\n " , t
-> n
) ; await ( t-> i >= t-> n) {
printf ( "write %d: %d\n " , t
-> n
, t
-> i
) ; ++ t-> i;
}
printf ( "write %d: end\n " , t
-> n
) ; leave t-> result = t-> i;
}
}
typedef struct {
int jid;
int n;
int state;
write_async_task write_task;
} job_task;
int job( job_task * t) {
async ( t-> state) {
printf ( "job %d: before write\n " , t
-> jid
) ; t-> write_task = ( write_async_task) { .n = t-> n} ;
await ( write_async( & t-> write_task) ) ;
printf ( "job %d: written %d bytes\n " , t
-> jid
, t
-> write_task.
result ) ; }
}
int main( void ) {
job_task j1 = { .jid = 1 , .n = 3 } ;
job_task j2 = { .jid = 2 , .n = 7 } ;
until (
job( & j1) &
job( & j2)
) ;
job_task jobs[ ] = {
{ .jid = 3 , .n = 7 } ,
{ .jid = 4 , .n = 9 } ,
{ .jid = 5 , .n = 4 } ,
{ .jid = 6 , .n = 5 }
} ;
int jobs_n = sizeof ( jobs) / sizeof ( jobs[ 0 ] ) ;
while ( jobs_n > 0 ) {
for ( int i = 0 ; i < jobs_n; ++ i) {
if ( job( & jobs[ i] ) ) {
jobs[ i-- ] = jobs[ -- jobs_n] ;
}
}
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgojaWZuZGVmIEFTWU5DX0gKI2RlZmluZSBBU1lOQ19ICgojZGVmaW5lIGFzeW5jKC4uLikgaW50ICpfc3RhdGVfID0gJihfX1ZBX0FSR1NfXyk7IHN3aXRjaCAoKl9zdGF0ZV8pIHdoaWxlICgxKSBpZiAoMSkgeypfc3RhdGVfID0gMTsgY2FzZSAxOiByZXR1cm4gMTt9IGVsc2UgZGVmYXVsdDoKI2RlZmluZSBhd2FpdCguLi4pIGlmICghKCpfc3RhdGVfID0gX19MSU5FX18pKTsgZWxzZSBjYXNlIF9fTElORV9fOiBzd2l0Y2ggKDApIHdoaWxlICgxKSBpZiAoIShfX1ZBX0FSR1NfXykpIHJldHVybiAwOyBlbHNlIGlmICgxKSBicmVhazsgZWxzZSBkZWZhdWx0OgojZGVmaW5lIHlpZWxkIGlmICgwKSBjYXNlIF9fTElORV9fOjsgZWxzZSBzd2l0Y2ggKDApIHdoaWxlICgxKSBpZiAoMSkgeypfc3RhdGVfID0gX19MSU5FX187IHJldHVybiAwO30gZWxzZSBkZWZhdWx0OgojZGVmaW5lIGxlYXZlIHN3aXRjaCAoMCkgd2hpbGUgKDEpIGlmICgxKSB7Kl9zdGF0ZV8gPSAxOyByZXR1cm4gMTt9IGVsc2UgZGVmYXVsdDoKI2RlZmluZSB1bnRpbCguLi4pIHdoaWxlICghKF9fVkFfQVJHU19fKSkKCiNlbmRpZgoKdHlwZWRlZiB1bmlvbiB7CglzdHJ1Y3QgewoJCWludCBuOwoJCWludCBpOwoJCWludCBzdGF0ZTsKCX07CglpbnQgcmVzdWx0Owp9IHdyaXRlX2FzeW5jX3Rhc2s7CgppbnQgd3JpdGVfYXN5bmMod3JpdGVfYXN5bmNfdGFzayAqdCkgewoJYXN5bmMgKHQtPnN0YXRlKSB7CgkJcHJpbnRmKCJ3cml0ZSAlZDogc3RhcnRcbiIsIHQtPm4pOwoJCWF3YWl0ICh0LT5pID49IHQtPm4pIHsKCQkJcHJpbnRmKCJ3cml0ZSAlZDogJWRcbiIsIHQtPm4sIHQtPmkpOwoJCQkrK3QtPmk7CgkJfQoJCXByaW50Zigid3JpdGUgJWQ6IGVuZFxuIiwgdC0+bik7CgkJbGVhdmUgdC0+cmVzdWx0ID0gdC0+aTsKCX0KfQoKdHlwZWRlZiBzdHJ1Y3QgewoJaW50IGppZDsKCWludCBuOwoJaW50IHN0YXRlOwoJd3JpdGVfYXN5bmNfdGFzayB3cml0ZV90YXNrOwp9IGpvYl90YXNrOwoKaW50IGpvYihqb2JfdGFzayAqdCkgewoJYXN5bmMgKHQtPnN0YXRlKSB7CgkJcHJpbnRmKCJqb2IgJWQ6IGJlZm9yZSB3cml0ZVxuIiwgdC0+amlkKTsKCQl0LT53cml0ZV90YXNrID0gKHdyaXRlX2FzeW5jX3Rhc2spey5uID0gdC0+bn07CgkJYXdhaXQgKHdyaXRlX2FzeW5jKCZ0LT53cml0ZV90YXNrKSk7CgkJcHJpbnRmKCJqb2IgJWQ6IHdyaXR0ZW4gJWQgYnl0ZXNcbiIsIHQtPmppZCwgdC0+d3JpdGVfdGFzay5yZXN1bHQpOwoJfQp9CgppbnQgbWFpbih2b2lkKSB7CglwdXRzKCJwcm9ncmFtIHN0YXJ0Iik7Cglqb2JfdGFzayBqMSA9IHsuamlkID0gMSwgLm4gPSAzfTsKCWpvYl90YXNrIGoyID0gey5qaWQgPSAyLCAubiA9IDd9OwoJdW50aWwgKAoJCWpvYigmajEpICYKCQlqb2IoJmoyKQoJKTsKCWpvYl90YXNrIGpvYnNbXSA9IHsKCQl7LmppZCA9IDMsIC5uID0gN30sCgkJey5qaWQgPSA0LCAubiA9IDl9LAoJCXsuamlkID0gNSwgLm4gPSA0fSwKCQl7LmppZCA9IDYsIC5uID0gNX0KCX07CglpbnQgam9ic19uID0gc2l6ZW9mKGpvYnMpIC8gc2l6ZW9mKGpvYnNbMF0pOwoJd2hpbGUgKGpvYnNfbiA+IDApIHsKCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYnNfbjsgKytpKSB7CgkJCWlmIChqb2IoJmpvYnNbaV0pKSB7CgkJCQlqb2JzW2ktLV0gPSBqb2JzWy0tam9ic19uXTsKCQkJfQoJCX0KCX0KCXB1dHMoInByb2dyYW0gZW5kIik7Cn0K