105 lines
2.5 KiB
C
105 lines
2.5 KiB
C
/**
|
|
* @file kProcess.x.h
|
|
*
|
|
* @internal
|
|
* Copyright (C) 2018-2021 by LMI Technologies Inc.
|
|
* Licensed under the MIT License.
|
|
* Redistributed files must retain the above copyright notice.
|
|
*/
|
|
|
|
#ifndef K_API_PROCESS_X_H
|
|
#define K_API_PROCESS_X_H
|
|
|
|
kDeclareFullClassEx(k, kProcess, kObject)
|
|
|
|
#if defined(K_PLATFORM)
|
|
|
|
kFx(kStatus) kProcess_InitPlatformFields(kProcess process);
|
|
kFx(kStatus) kProcess_ReleasePlatformFields(kProcess process);
|
|
|
|
#if defined(K_WINDOWS)
|
|
|
|
kFx(kStatus) kProcess_ConstructArgument(kProcess process, WCHAR** wargument);
|
|
|
|
# define kProcessPlatformFields() \
|
|
HANDLE process; \
|
|
HANDLE stdOutHandle; \
|
|
HANDLE stdErrHandle; \
|
|
HANDLE stdInHandle;
|
|
|
|
# define kProcessPlatformStaticFields() \
|
|
HANDLE job;
|
|
|
|
#elif defined(K_LINUX)
|
|
|
|
# define kPROCESS_PIPE_READ (0)
|
|
# define kPROCESS_PIPE_WRITE (1)
|
|
|
|
# define kProcessPlatformFields() \
|
|
k32s process; \
|
|
k32s stdinPipe[2]; \
|
|
k32s stdoutPipe[2]; \
|
|
k32s stderrPipe[2]; \
|
|
kSemaphore startSem; \
|
|
kThread forkThread; \
|
|
k64s exitCode;
|
|
|
|
# define kProcessPlatformStaticFields() \
|
|
|
|
kFx(kStatus) kProcess_SetupParent(kProcess process);
|
|
kFx(void) kProcess_RunChild(kProcess process, pid_t parent);
|
|
|
|
kFx(kStatus) kProcess_CloseHandles(kProcess process);
|
|
|
|
kFx(kStatus) kProcess_ForkThreadEntry(kProcess process);
|
|
|
|
#else
|
|
|
|
# define kProcessPlatformFields()
|
|
# define kProcessPlatformStaticFields()
|
|
|
|
#endif
|
|
|
|
typedef struct kProcessClass
|
|
{
|
|
kObjectClass base;
|
|
|
|
kAtomic32s isRunning;
|
|
kString path;
|
|
kArrayList arguments;
|
|
|
|
kStream processStdIn;
|
|
kStream processStdOut;
|
|
kStream processStdErr;
|
|
|
|
kProcessPlatformFields()
|
|
} kProcessClass;
|
|
|
|
typedef struct kProcessVTable
|
|
{
|
|
kObjectVTable base;
|
|
} kProcessVTable;
|
|
|
|
typedef struct kProcessStatic
|
|
{
|
|
kStream appStdIn;
|
|
kStream appStdOut;
|
|
kStream appStdErr;
|
|
|
|
kProcessPlatformStaticFields()
|
|
} kProcessStatic;
|
|
|
|
#endif
|
|
|
|
kFx(kStatus) xkProcess_InitStatic();
|
|
kFx(kStatus) xkProcess_ReleaseStatic();
|
|
|
|
kFx(kStatus) kProcess_Init(kProcess process, const kChar* path, kType type, kAlloc alloc);
|
|
kFx(kStatus) kProcess_VRelease(kProcess process);
|
|
|
|
kFx(kStream) kProcess_AppStdIn();
|
|
kFx(kStream) kProcess_AppStdOut();
|
|
kFx(kStream) kProcess_AppStdErr();
|
|
|
|
#endif
|