| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 | /* -*- 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){    PAL_HANDLE handles[3];    if (argc == 2 && !memcmp(argv[1], "Child", 6)) {        for (int i = 0 ; i < 3 ; i++) {            handles[i] = DkReceiveHandle(pal_control.parent_process);            if (handles[i])                pal_printf("Receive Handle OK\n");        }        char buffer[20];        for (int i = 0 ; i < 3 ; i++) {            if (!handles[i])                continue;            memset(buffer, 0, 20);            switch(PAL_GET_TYPE(handles[i])) {                case pal_type_pipesrv: {                    PAL_HANDLE pipe = DkStreamWaitForClient(handles[i]);                    if (pipe) {                        if (DkStreamRead(pipe, 0, 20, buffer, NULL, 0))                            pal_printf("Receive Pipe Handle: %s\n", buffer);                        DkObjectClose(pipe);                    }                    break;                }                case pal_type_udpsrv: {                    char uri[20];                    if ((DkStreamRead(handles[i], 0, 20, buffer, &uri, 20)))                        pal_printf("Receive Socket Handle: %s\n", buffer);                    break;                }                case pal_type_file:                    if (DkStreamRead(handles[i], 0, 20, buffer, NULL, 0))                        pal_printf("Receive File Handle: %s\n", buffer);                    break;                default:                    break;            }            DkObjectClose(handles[i]);        }    } else {        const char *args[3] = { "SendHandle", "Child", NULL };        PAL_HANDLE child = DkProcessCreate("file:SendHandle", args);        if (child) {            // Sending pipe handle            handles[0] = DkStreamOpen("pipe.srv:1", PAL_ACCESS_RDWR,                                      0, PAL_CREATE_TRY, 0);            if (handles[0]) {                pal_printf("Send Handle OK\n");                if (DkSendHandle(child, handles[0])) {                    DkObjectClose(handles[0]);                    PAL_HANDLE pipe = DkStreamOpen("pipe:1", PAL_ACCESS_RDWR,                                                   0, 0, 0);                    if (pipe) {                        DkStreamWrite(pipe, 0, 20, "Hello World", NULL);                        DkObjectClose(pipe);                    }                } else {                    DkObjectClose(handles[0]);                }            }            // Sending udp handle            handles[1] = DkStreamOpen("udp.srv:127.0.0.1:8000", PAL_ACCESS_RDWR,                                      0, PAL_CREATE_TRY, 0);            if (handles[1]) {                pal_printf("Send Handle OK\n");                if (DkSendHandle(child, handles[1])) {                    DkObjectClose(handles[1]);                    PAL_HANDLE socket = DkStreamOpen("udp:127.0.0.1:8000",                                                     PAL_ACCESS_RDWR, 0, 0, 0);                    if (socket) {                        DkStreamWrite(socket, 0, 20, "Hello World", NULL);                        DkObjectClose(socket);                    }                } else {                    DkObjectClose(handles[1]);                }            }            handles[2] = DkStreamOpen("file:to_send.tmp", PAL_ACCESS_RDWR,                                      0600, PAL_CREATE_TRY, 0);            if (handles[2]) {                pal_printf("Send Handle OK\n");                DkStreamWrite(handles[2], 0, 20, "Hello World", NULL);                DkStreamSetLength(handles[2], 4096);                DkSendHandle(child, handles[2]);                DkObjectClose(handles[2]);            }        }        DkObjectClose(child);    }    return 0;}
 |