Ejemplo n.º 1
0
Archivo: chan.c Proyecto: nirs/libmill
int main() {
    int val;

    /* Receiver waits for sender. */
    chan ch1 = chmake(int, 0);
    go(sender(chdup(ch1), 1, 333));
    val = chr(ch1, int);
    assert(val == 333);
    chclose(ch1);

    /* Sender waits for receiver. */
    chan ch2 = chmake(int, 0);
    go(sender(chdup(ch2), 0, 444));
    val = chr(ch2, int);
    assert(val == 444);
    chclose(ch2);

    /* Test two simultaneous senders. */
    chan ch3 = chmake(int, 0);
    go(sender(chdup(ch3), 0, 888));
    go(sender(chdup(ch3), 0, 999));
    val = chr(ch3, int);
    assert(val == 888);
    yield();
    val = chr(ch3, int);
    assert(val == 999);
    chclose(ch3);

    /* Test two simultaneous receivers. */
    chan ch4 = chmake(int, 0);
    go(receiver(chdup(ch4), 333));
    go(receiver(chdup(ch4), 444));
    chs(ch4, int, 333);
    chs(ch4, int, 444);
    chclose(ch4);

    /* Test typed channels. */
    chan ch5 = chmake(char, 0);
    go(charsender(chdup(ch5), 111));
    char charval = chr(ch5, char);
    assert(charval == 111);
    chclose(ch5);
    chan ch6 = chmake(struct foo, 0);
    struct foo foo1 = {555, 222};
    go(structsender(chdup(ch6), foo1));
    struct foo foo2 = chr(ch6, struct foo);
    assert(foo2.first == 555 && foo2.second == 222);
    chclose(ch6);

    /* Test message buffering. */
    chan ch7 = chmake(int, 2);
    chs(ch7, int, 222);
    chs(ch7, int, 333);
    val = chr(ch7, int);
    assert(val == 222);
    val = chr(ch7, int);
    assert(val == 333);
    chs(ch7, int, 444);
    val = chr(ch7, int);
    assert(val == 444);
    chs(ch7, int, 555);
    chs(ch7, int, 666);
    val = chr(ch7, int);
    assert(val == 555);
    val = chr(ch7, int);
    assert(val == 666);
    chclose(ch7);

    /* Test simple chdone() scenarios. */
    chan ch8 = chmake(int, 0);
    chdone(ch8, int, 777);
    val = chr(ch8, int);
    assert(val == 777);
    val = chr(ch8, int);
    assert(val == 777);
    val = chr(ch8, int);
    assert(val == 777);
    chclose(ch8);
    chan ch9 = chmake(int, 10);
    chdone(ch9, int, 888);
    val = chr(ch9, int);
    assert(val == 888);
    val = chr(ch9, int);
    assert(val == 888);
    chclose(ch9);
    chan ch10 = chmake(int, 10);
    chs(ch10, int, 999);
    chdone(ch10, int, 111);
    val = chr(ch10, int);
    assert(val == 999);
    val = chr(ch10, int);
    assert(val == 111);
    val = chr(ch10, int);
    assert(val == 111);
    chclose(ch10);
    chan ch11 = chmake(int, 1);
    chs(ch11, int, 222);
    chdone(ch11, int, 333);
    val = chr(ch11, int);
    assert(val == 222);
    val = chr(ch11, int);
    assert(val == 333);
    chclose(ch11);

    /* Test whether chdone() unblocks all receivers. */
    chan ch12 = chmake(int, 0);
    chan ch13 = chmake(int, 0);
    go(receiver2(chdup(ch12), 444, chdup(ch13)));
    go(receiver2(chdup(ch12), 444, chdup(ch13)));
    chdone(ch12, int, 444);
    val = chr(ch13, int);
    assert(val == 0);
    val = chr(ch13, int);
    assert(val == 0);
    chclose(ch13);
    chclose(ch12);

    return 0;
}
Ejemplo n.º 2
0
int main() {
    int val;

    /* Receiver waits for sender. */
    chan ch1 = chmake(int, 0);
    go(sender(chdup(ch1), 1, 333));
    val = chr(ch1, int);
    assert(val == 333);
    chclose(ch1);

    /* Sender waits for receiver. */
    chan ch2 = chmake(int, 0);
    go(sender(chdup(ch2), 0, 444));
    val = chr(ch2, int);
    assert(val == 444);
    chclose(ch2);

    /* Test two simultaneous senders. */
    chan ch3 = chmake(int, 0);
    go(sender(chdup(ch3), 0, 888));
    go(sender(chdup(ch3), 0, 999));
    val = chr(ch3, int);
    assert(val == 888);
    yield();
    val = chr(ch3, int);
    assert(val == 999);
    chclose(ch3);

    /* Test two simultaneous receivers. */
    chan ch4 = chmake(int, 0);
    go(receiver(chdup(ch4), 333));
    go(receiver(chdup(ch4), 444));
    chs(ch4, int, 333);
    chs(ch4, int, 444);
    chclose(ch4);

    /* Test typed channels. */
    chan ch5 = chmake(char, 0);
    go(charsender(chdup(ch5), 111));
    char charval = chr(ch5, char);
    assert(charval == 111);
    chclose(ch5);
    chan ch6 = chmake(struct foo, 0);
    struct foo foo1 = {555, 222};
    go(structsender(chdup(ch6), foo1));
    struct foo foo2 = chr(ch6, struct foo);
    assert(foo2.first == 555 && foo2.second == 222);
    chclose(ch6);

    /* Test message buffering. */
    chan ch7 = chmake(int, 2);
    chs(ch7, int, 222);
    chs(ch7, int, 333);
    val = chr(ch7, int);
    assert(val == 222);
    val = chr(ch7, int);
    assert(val == 333);
    chs(ch7, int, 444);
    val = chr(ch7, int);
    assert(val == 444);
    chs(ch7, int, 555);
    chs(ch7, int, 666);
    val = chr(ch7, int);
    assert(val == 555);
    val = chr(ch7, int);
    assert(val == 666);
    chclose(ch7);

    /* Test simple chdone() scenarios. */
    chan ch8 = chmake(int, 0);
    chdone(ch8, int, 777);
    val = chr(ch8, int);
    assert(val == 777);
    val = chr(ch8, int);
    assert(val == 777);
    val = chr(ch8, int);
    assert(val == 777);
    chclose(ch8);
    chan ch9 = chmake(int, 10);
    chdone(ch9, int, 888);
    val = chr(ch9, int);
    assert(val == 888);
    val = chr(ch9, int);
    assert(val == 888);
    chclose(ch9);
    chan ch10 = chmake(int, 10);
    chs(ch10, int, 999);
    chdone(ch10, int, 111);
    val = chr(ch10, int);
    assert(val == 999);
    val = chr(ch10, int);
    assert(val == 111);
    val = chr(ch10, int);
    assert(val == 111);
    chclose(ch10);
    chan ch11 = chmake(int, 1);
    chs(ch11, int, 222);
    chdone(ch11, int, 333);
    val = chr(ch11, int);
    assert(val == 222);
    val = chr(ch11, int);
    assert(val == 333);
    chclose(ch11);

    /* Test whether chdone() unblocks all receivers. */
    chan ch12 = chmake(int, 0);
    chan ch13 = chmake(int, 0);
    go(receiver2(chdup(ch12), 444, chdup(ch13)));
    go(receiver2(chdup(ch12), 444, chdup(ch13)));
    chdone(ch12, int, 444);
    val = chr(ch13, int);
    assert(val == 0);
    val = chr(ch13, int);
    assert(val == 0);
    chclose(ch13);
    chclose(ch12);

    /* Test a combination of blocked sender and an item in the channel. */
    chan ch14 = chmake(int, 1);
    chs(ch14, int, 1);
    go(sender(chdup(ch14), 0, 2));
    val = chr(ch14, int);
    assert(val == 1);
    val = chr(ch14, int);
    assert(val == 2);
    chclose(ch14);

    pid_t pid;

    /* Test panic when chs will deadlock. */
    pid = fork();
    assert(pid >= 0);
    if (pid == 0) {
        alarm(1);
        chan ch = chmake(int, 0);
        signal(SIGABRT, expected_abort);
        chs(ch, int, 42);
        fail();
    }