6. Msg
union {
...
struct {
unsigned char data [29];
unsigned char size;
unsigned char type;
unsigned char flags;
} vsm;
struct {
content_t *content;
unsigned char unused
[29 + 1 - sizeof (content_t*)];
unsigned char type;
unsigned char flags;
} lmsg;
DATA S T F
T F
S DATA
vsm
lmsg
7. writer thread
reader thread
YQueue
yqueue_t <msg_t, 256>
yqueue_t <command_t, 16>
struct chunk_t
{
T values [N];
chunk_t *prev;
chunk_t *next;
};
atomic_ptr_t <chunk_t>
spare_chunk
...
begin
back
• Only single thread can read from begin_chunk
• Only single thread can write to yqueue_t <msg_t> to back chunk
• Only single thread can write to yqueue_t <command_t> at a time
8. YPipe
atomic_ptr_t <T> c
Reader
Writer
T* r
T* w
T* f
bool flush () {
if ( c.cas ( w, f ) != w ) {
c.set ( f ) ;
w = f ;
return false ; // reader is sleeping
}
w = f ;
return true ;
}
bool check_read () {
if ( queue.front () != r ) return true ;
r = c.cas ( queue.front () , NULL ) ;
if ( queue.front () == r )
return false ; // nothing to read
return true;
}
read() =>
queue<T>.pop
write() =>
queue<T>.push
r w f
9. Signaler
socketpair ( AF_UNIX, SOCK_STREAM, 0, sv[2] )
int w = sv[0]; // writer fd
int r = sv[1]; // reader fd, Used at IOThread.poll
Reader
recv () {
:: recv ( r , dummy[1] );
}
wait ( timeout ) {
poll ( r , timeout );
}
Writer
send () {
:: send ( w, dummy[1] );
}