You can make 99% of it run on the host.
Code:
#include <stdio.h>
// some portability hackery to make it run on host
typedef int syscall;
typedef char * umsg32;
typedef int pid32;
#define kprintf printf
#define OK 0
//---------------- sender.c
int CAPACITY = 10;
char* msgs[10];
int size = 0;
int rear = 9;
int front = 0;
syscall sender(
pid32 pid,
umsg32 msg
)
{
rear = (rear+1)%CAPACITY;
size++;
msgs[rear] = msg;
return OK;
}
//--------------- receiver.c
extern char* msgs[];
extern int size;
extern int rear;
extern int front;
extern int CAPACITY;
umsg32 receiver(void)
{
umsg32 msg = msgs[front]; //!! Added type declaration
kprintf ("mssg2 %s",msgs[front] ); //debug !! fixed constant 1 to be variable front
front = (front+1)%CAPACITY;
return msg;
}
//---------------- main.c
extern char* msgs[];
void sd(pid32 pid, umsg32 msg), rc();
int main(void) {
#if 0
pid32 r1 = create(rc, 1024, 20, "receiver",0);
pid32 s1 = create(sd, 1024, 20, "sender",2, r1, "HELLO!!!");
pid32 s2 = create(sd, 1024, 20, "sender2",2, r1, "WORLD!!!");
resume(s1);
sleepms(3000);
resume(s2);
sleepms(3000);
resume(r1);
return OK;
#else
sd(0,"HELLO!!!");
sd(0,"WORLD!!!");
rc();
#endif
}
void sd(pid32 pid, umsg32 msg) {
sender(pid, msg);
//!! void functions do NOT return OK;
}
void rc() {
umsg32 mssg = receiver();
kprintf("\n \n ---- Message recived: %s ----\n", mssg);
umsg32 mssg2 = receiver();
kprintf("\n \n ---- Message recived: %s ----\n", mssg2);
}
Result
Code:
$ gcc foo.c
$ ./a.out
mssg2 HELLO!!!
---- Message recived: HELLO!!! ----
mssg2 WORLD!!!
---- Message recived: WORLD!!! ----
I notice
- your receiver doesn't decrement size.
- your receiver doesn't check to see if a message is available
- your sender doesn't check to see if there is space for a message.
- your queue assumes the pointer remains valid forever.
This last point means that code like this will NOT work.
Code:
void foo ( ) {
char msg[20];
for ( int i = 0 ; i <5 ; i++ ) {
sprintf("Hey %d", i );
sender(0,msg);
}
}
It won't work in the first instance because all the messages point to the same array, which is being overwritten each time in the loop.
It won't work in the second instance, because the array itself is only temporary, and goes out of scope when the function returns.