All Projects → tylertreat → Chan

tylertreat / Chan

Licence: apache-2.0
Pure C implementation of Go channels.

Programming Languages

c
50402 projects - #5 most used programming language
shell
77523 projects
golang
3204 projects

Projects that are alternatives of or similar to Chan

Goodies
Useful stuff missing from .NET for example duck typing, CSP channels, caching, money, typed ids...
Stars: ✭ 11 (-99.09%)
Mutual labels:  channels, csp
Sync
Synchronization primitives for PHP based on Amp.
Stars: ✭ 67 (-94.45%)
Mutual labels:  synchronization
Mortgageblockchainfabric
Mortgage Processing App using Hyperledger Fabric Blockchain. Uses channels for privacy and access, and restricts read/write previleges through endorsement policies
Stars: ✭ 45 (-96.27%)
Mutual labels:  channels
Syncthing Macos
Frugal and native macOS Syncthing application bundle
Stars: ✭ 1,096 (-9.27%)
Mutual labels:  synchronization
Angrdbg
Abstract library to generate angr states from a debugger state
Stars: ✭ 49 (-95.94%)
Mutual labels:  synchronization
Ciruela
A peer-to-peer synchronization software for servers in datacenters.
Stars: ✭ 61 (-94.95%)
Mutual labels:  synchronization
Alignmentduration
Lyrics-to-audio-alignement system. Based on Machine Learning Algorithms: Hidden Markov Models with Viterbi forced alignment. The alignment is explicitly aware of durations of musical notes. The phonetic model are classified with MLP Deep Neural Network.
Stars: ✭ 36 (-97.02%)
Mutual labels:  synchronization
Bind Query Params
Sync URL Query Params with Angular Form Controls
Stars: ✭ 73 (-93.96%)
Mutual labels:  synchronization
Tinker app
Android热更新Tinker + 多渠道打包 + 加固的流程详解demo
Stars: ✭ 67 (-94.45%)
Mutual labels:  channels
Sublimate
Sublimate: Ridiculously fast full stack Swift prototyping with Vapor and Sourcery.
Stars: ✭ 57 (-95.28%)
Mutual labels:  synchronization
Laravel Fcm
🌐 A Laravel package to send Push Notifications to one or many devices of the user.
Stars: ✭ 56 (-95.36%)
Mutual labels:  channels
Go Apns2
Go package for HTTP/2 Apple Push Notification Service.
Stars: ✭ 53 (-95.61%)
Mutual labels:  channels
Zaloha.sh
Small and simple directory synchronizer (a BASH script)
Stars: ✭ 63 (-94.78%)
Mutual labels:  synchronization
Copycat Action
©️ GitHub Action for copying files to other repositories
Stars: ✭ 48 (-96.03%)
Mutual labels:  synchronization
Weechat Autosort
Automatically keep your buffers sorted.
Stars: ✭ 69 (-94.29%)
Mutual labels:  channels
Express Security
nodejs + express security and performance boilerplate.
Stars: ✭ 37 (-96.94%)
Mutual labels:  csp
Poosh
🌎 Publish local files to virtually any remote endpoint (e.g. AWS S3)
Stars: ✭ 55 (-95.45%)
Mutual labels:  synchronization
Outlookgooglecalendarsync
Sync your Outlook and Google calendars
Stars: ✭ 1,113 (-7.86%)
Mutual labels:  synchronization
Libqsbr
QSBR and EBR library
Stars: ✭ 76 (-93.71%)
Mutual labels:  synchronization
Libcsp
A concurrency C library 10x faster than Golang.
Stars: ✭ 1,160 (-3.97%)
Mutual labels:  csp

chan

Pure C implementation of Go channels.

Unbuffered Channels

Unbuffered channels provide both a mechanism for communication as well as synchronization. When data is sent into the channel, the sender blocks until a receiver is ready. Likewise, a receiver will block until a sender is ready.

#include <pthread.h>
#include <stdio.h>
#include "chan.h"

chan_t* chan;

void* ping()
{
    // Send blocks until receiver is ready.
    chan_send(chan, "ping");
    return NULL;
}

int main()
{
    // Initialize unbuffered channel.
    chan = chan_init(0);

    pthread_t th;
    pthread_create(&th, NULL, ping, NULL);

    // Receive blocks until sender is ready.
    void* msg;
    chan_recv(chan, &msg);
    printf("%s\n", msg);

    // Clean up channel.
    chan_dispose(chan);
}

With an unbuffered channel, the sender and receiver are synchronized, so the above program will print ping.

Buffered Channels

Buffered channels accept a limited number of values without a corresponding receiver for those values. Sending data will not block unless the channel is full. Receiving data will block only if the channel is empty.

#include <stdio.h>
#include "chan.h"

int main()
{
    // Initialize buffered channel with a capacity of 2.
    chan_t* chan = chan_init(2);

    // Send up to 2 values without receiver.
    chan_send(chan, "buffered");
    chan_send(chan, "channel");

    // Later receive the values.
    void* msg;
    chan_recv(chan, &msg);
    printf("%s\n", msg);

    chan_recv(chan, &msg);
    printf("%s\n", msg);

    // Clean up channel.
    chan_dispose(chan);
}

The above program will print buffered and then channel. The sends do not block because the channel has a capacity of 2. Sending more after that would block until values were received.

Closing Channels

When a channel is closed, no more values can be sent on it. Receiving on a closed channel will return an indication code that the channel has been closed. This can be useful to communicate completion to the channel’s receivers. If the closed channel is buffered, values will be received on it until empty.

#include <pthread.h>
#include <stdint.h>
#include <stdio.h>
#include "chan.h"

chan_t* jobs;
chan_t* done;

void* worker()
{
    // Process jobs until channel is closed.
    void* job;
    while (chan_recv(jobs, &job) == 0)
    {
        printf("received job %d\n", (int) job);
    }

    // Notify that all jobs were received.
    printf("received all jobs\n");
    chan_send(done, "1");
    return NULL;
}

int main()
{
    // Initialize channels.
    jobs = chan_init(5);
    done = chan_init(0);

    pthread_t th;
    pthread_create(&th, NULL, worker, NULL);

    // Send 3 jobs over the jobs channel then close it.
    int i;
    for (i = 1; i <= 3; i++)
    {
        chan_send(jobs, (void*) (uintptr_t) i);
        printf("sent job %d\n", i);
    }
    chan_close(jobs);
    printf("sent all jobs\n");

    // Wait for all jobs to be received.
    chan_recv(done, NULL);

    // Clean up channels.
    chan_dispose(jobs);
    chan_dispose(done);
}

This program will print:

sent job 1
received job 1
sent job 2
received job 2
sent job 3
received job 3
sent all jobs
received all jobs

Select Statements

Select statements choose which of a set of possible send or receive operations will proceed. They also provide a way to perform non-blocking sends and receives. Selects are particularly useful for multiplexing communication over several channels.

#include <stdio.h>
#include "chan.h"

chan_t* messages;
chan_t* signals;

int main()
{
    // Initialize channels.
    messages = chan_init(0);
    signals = chan_init(0);
    void *msg;

    // This is a non-blocking receive. If a value is available on messages,
    // select will take the messages (0) case with that value. If not, it will
    // immediately take the default case.
    switch(chan_select(&messages, 1, &msg, NULL, 0, NULL))
    {
        case 0:
            printf("received message %s\n", msg);
            break;
        default:
            printf("no message received\n");
    }

    // A non-blocking send works similarly.
    msg = "foo";
    switch(chan_select(NULL, 0, NULL, &messages, 1, &msg))
    {
        case 0:
            printf("sent message %s\n", msg);
            break;
        default:
            printf("no message sent\n");
    }

    // We can use multiple cases above the default clause to implement a
    // multi-way non-blocking select. Here we attempt non-blocking receives on
    // both messages and signals.
    chan_t* chans[2] = {messages, signals};
    switch(chan_select(chans, 2, &msg, NULL, 0, NULL))
    {
        case 0:
            printf("received message %s\n", msg);
            break;
        case 1:
            printf("received signal %s\n", msg);
            break;
        default:
            printf("no activity\n");
    }

    // Clean up channels.
    chan_dispose(messages);
    chan_dispose(signals);
}

This program will print:

no message received
no message sent
no activity
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].