diff options
Diffstat (limited to 'ipc.c')
-rw-r--r-- | ipc.c | 64 |
1 files changed, 64 insertions, 0 deletions
@@ -0,0 +1,64 @@ +#include <stdint.h> +#include <unistd.h> + +#include "ipc.h" +#include "main.h" + +int send(void * self, local_id dst, const Message * msg) { + if( self == NULL ) + return 1; + + my_info_t *me = (my_info_t *) self; + if( me->dist_info == NULL ) + return 1; + + if( dst < 0 || dst > MAX_PROCCNT ) + return 1; + + uint8_t base = me->id * (me->dist_info->proccnt - 1); // base of block of pipes for this process + uint8_t idx = 0; + + if( me->id < dst ) + idx = base + dst - 1; + else + idx = base + dst; + + int wr_dscr = me->dist_info->pipes[idx][1]; + size_t wr_size = sizeof(msg->s_header) + msg->s_header.s_payload_len; + if( write( wr_dscr, &msg, wr_size ) != wr_size ) + return 1; + + return 0; +} + +int send_multicast(void * self, const Message * msg) { + if( self == NULL ) + return 1; + + my_info_t *me = (my_info_t *) self; + if( me->dist_info == NULL ) + return 1; + + size_t wr_size; + int wr_dscr; + + uint8_t base = me->id * (me->dist_info->proccnt - 1); // base of block of pipes for this process + uint8_t i; + + for( i = 0; i < me->dist_info->proccnt - 1; i++) { + wr_dscr = me->dist_info->pipes[base+i][1]; + wr_size = sizeof(msg->s_header) + msg->s_header.s_payload_len; + if( write( wr_dscr, &msg, wr_size ) != wr_size ) + return 1; + } + + return 0; +} + +int receive(void * self, local_id from, Message * msg) { + return -1; +} + +int receive_any(void * self, Message * msg) { + return -1; +} |