mirror of
https://github.com/clearlinux/graphene.git
synced 2026-09-05 21:31:36 +00:00
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_CREATE_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_CREATE_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_CREATE_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", 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;
|
|
}
|
|
|