mirror of
https://github.com/clearlinux/graphene.git
synced 2026-09-07 14:21:56 +00:00
Plenty of bugfixes for Linux kernel later than 3.5 and Ubuntu later than 10.10. More organized code to improve portability. Regression tests for Pal to test completeness of implementation.
146 lines
4.1 KiB
C
146 lines
4.1 KiB
C
/* -*- mode:c; c-file-style:"k&r"; c-basic-offset: 4; tab-width:4; indent-tabs-mode:nil; mode:auto-fill; fill-column:78; -*- */
|
|
/* vim: set ts=4 sw=4 et tw=78 fo=cqt wm=0: */
|
|
|
|
/* This Hello World demostrate a simple multithread program */
|
|
|
|
#include "pal.h"
|
|
#include "pal_debug.h"
|
|
#include "api.h"
|
|
|
|
int main (int argc, char ** argv)
|
|
{
|
|
int nsend = 5 , i;
|
|
PAL_HANDLE handles[nsend];
|
|
|
|
if (argc == 1) /* parent */
|
|
{
|
|
pal_printf("Parent: Executing the program\n");
|
|
|
|
const char *args[3] = { "HandleSend", "child", NULL };
|
|
char * data = "Hello World";
|
|
char content[20];
|
|
char uri[80];
|
|
PAL_HANDLE child;
|
|
int bytes;
|
|
|
|
pal_printf("Parent: Creating handles\n");
|
|
|
|
// Sending pipe handle
|
|
handles[0] = DkStreamOpen("pipe.srv:012", PAL_ACCESS_RDWR,
|
|
0, PAL_CREAT_TRY, 0);
|
|
if (!handles[0]) {
|
|
pal_printf("Parent: DkStreamOpen for pipe failed\n");
|
|
goto out;
|
|
}
|
|
|
|
// Sending pipe handle
|
|
handles[1] = DkStreamOpen("udp:127.0.0.1:8000", PAL_ACCESS_RDWR,
|
|
0, PAL_CREAT_TRY, 0);
|
|
if (!handles[1]) {
|
|
pal_printf("Parent: DkStreamOpen for socket failed\n");
|
|
goto out;
|
|
}
|
|
|
|
for (i = 2 ; i < nsend; i++) {
|
|
snprintf(uri, 80, "file:test_file_%d", i - 2);
|
|
|
|
handles[i] = DkStreamOpen(uri, PAL_ACCESS_RDWR, 0600,
|
|
PAL_CREAT_TRY, 0);
|
|
if (!handles[i]) {
|
|
pal_printf("Parent: DkStreamOpen failed\n");
|
|
goto out;
|
|
}
|
|
|
|
DkStreamSetLength(handles[i], 0);
|
|
}
|
|
|
|
for (i = 0 ; i < nsend ; i++) {
|
|
/* do some write */
|
|
snprintf(content, sizeof(content), "%s%d", data, i);
|
|
|
|
bytes = DkStreamWrite(handles[i], 0, sizeof(content), content,
|
|
NULL);
|
|
if (!bytes) {
|
|
pal_printf("Parent: DKStreamWrite failed\n");
|
|
goto out;
|
|
}
|
|
|
|
DkStreamFlush(handles[i]);
|
|
}
|
|
|
|
pal_printf("Parent: Forking child\n");
|
|
child = DkProcessCreate ("file:HandleSend", 0, args);
|
|
|
|
if (!child) {
|
|
pal_printf("Parent: Failed creating process\n");
|
|
DkProcessExit(1);
|
|
}
|
|
|
|
for (i = 0 ; i < nsend ; i++) {
|
|
pal_printf("Parent: Sending Handle %d\n", i);
|
|
|
|
if (!DkSendHandle(child, handles[i])) {
|
|
pal_printf("Send handle failed\n");
|
|
goto out;
|
|
}
|
|
|
|
DkObjectClose(handles[i]);
|
|
}
|
|
|
|
pal_printf("Parent: Finished execution\n");
|
|
|
|
DkObjectClose(child);
|
|
}
|
|
else /* child */
|
|
{
|
|
PAL_HANDLE parent = pal_control.parent_process;
|
|
|
|
for (i = 0 ; i < nsend ; i++) {
|
|
pal_printf("Child: Receiving Handle %d\n", i);
|
|
handles[i] = DkReceiveHandle(parent);
|
|
|
|
if (!handles[i]) {
|
|
pal_printf("Child: Failed receiving handle\n");
|
|
DkProcessExit(1);
|
|
}
|
|
}
|
|
|
|
pal_printf("Child: Reading the handles\n");
|
|
for (i = 0 ; i < nsend ; i++) {
|
|
/* do some read */
|
|
pal_printf("Child: Handle %d Type ", i);
|
|
char data[20];
|
|
|
|
switch(PAL_GET_TYPE(handles[i])) {
|
|
case pal_type_file:
|
|
if ((DkStreamRead(handles[i], 0, 20, data, NULL, 0)))
|
|
pal_printf("File Data: %s\n", data);
|
|
else
|
|
pal_printf("Couldn't read\n");
|
|
break;
|
|
case pal_type_pipesrv:
|
|
pal_printf("Pipe\n");
|
|
break;
|
|
case pal_type_udp:
|
|
pal_printf("Udp\n");
|
|
break;
|
|
default:
|
|
pal_printf("Unknown\n");
|
|
}
|
|
|
|
DkObjectClose(handles[i]);
|
|
}
|
|
|
|
pal_printf("Child: Finished execution\n\n");
|
|
|
|
DkObjectClose(parent);
|
|
}
|
|
|
|
out:
|
|
for (i = 0 ; i < nsend ; i++)
|
|
DkObjectClose(handles[i]);
|
|
|
|
return 0;
|
|
}
|
|
|