shared.c

来自「俄罗斯高人Mamaich的Pocket gcc编译器(运行在PocketPC上)」· C语言 代码 · 共 313 行

C
313
字号
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "sys/wcebase.h"
#include "sys/wceerror.h"
#include "sys/wcefile.h"
#include "sys/wcememory.h"
#include "sys/wcetrace.h"
#include "sys/shared.h"
#include "sys/mqueue.h"
#include "sys/spawn.h"
#include "sys/fifo.h"

#define SYNC CacheSync(CACHE_SYNC_DISCARD|CACHE_SYNC_INSTRUCTIONS)

/*
 * Synchronizing with events sometimes fails! I get an event, but avail count 
 * is zero!  Seems that the compiler does not store it or there are problems
 * with cache...  CacheSync() seems to fix the problem...
 */

#define MAPNAME    "shmblk"
#define MUTEXNAME  "shmblk:mutex"

_SHMBLK
_shared_init(int pgid)
{
  _SHMBLK shmblk;
  HANDLE mapHnd;
  DWORD winerr = 0;
  BOOL  new = FALSE;
  char  name[SYSNAMELEN];
  wchar_t nameW[SYSNAMELEN];

  /* pgid is zero: set up a new process group */
  if (pgid == 0) {
    pgid = setpgid(0, 0);
  }

  sprintf(name, "%d:%s", pgid, MAPNAME);
  mbstowcs(nameW, name, strlen(name)+1);
  SetLastError(0);

  mapHnd = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, 
            	PAGE_READWRITE|SEC_COMMIT,	0, sizeof(_shmblk_t), nameW);

  if (mapHnd == NULL) {
    winerr = GetLastError();
    WCETRACE(WCE_IO, "_shared_init: FATAL CreateFileMappingW fails winerr %d", winerr);
    exit(1);
  }

  if ((winerr = GetLastError()) != ERROR_ALREADY_EXISTS) {
    WCETRACE(WCE_IO, "shared: creating NEW process group %d", pgid);
    new = TRUE;
  } else {
    WCETRACE(WCE_IO, "shared: map to EXISTING process group %d", pgid);
  }

  shmblk = MapViewOfFile(mapHnd, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(_shmblk_t));

  if (shmblk == NULL) {
    winerr = GetLastError();
    WCETRACE(WCE_IO, "_shared_init: FATAL MapViewOfFile fails winerr %d", winerr);
    exit(1);
  }

  if (new) {
    memset(shmblk, 0, sizeof(_shmblk_t));
    shmblk->pginfo.pgid = pgid;
    shmblk->pginfo.showwindow = TRUE;
  }

  WCETRACE(WCE_IO, "_shared_init: shmblk @%x (pgid %d)\n", shmblk, pgid);

  /*  SYNC; */
  return(shmblk);
}

void
_shared_dump(_SHMBLK shmblk)
{
  _PGINFO pgi = &shmblk->pginfo;

  WCETRACE(WCE_IO, "SHMBLK DUMP:");
  WCETRACE(WCE_IO, "mutex %p", shmblk->mutex);
  WCETRACE(WCE_IO, "pgid %d cwd %s", pgi->pgid, pgi->cwd);
  WCETRACE(WCE_IO, "fds: %d %d %d", pgi->stdinfd, pgi->stdoutfd, pgi->stderrfd);
}

void
_shared_reset(_SHMBLK shmblk)
{
  if (shmblk) {
    memset(&shmblk->pginfo, 0, sizeof(_pginfo_t));
    shmblk->pginfo.showwindow = TRUE;
  }
}

void
_shared_setshowwindow(_SHMBLK shmblk, BOOL show)
{
  WCETRACE(WCE_IO, "_shared_setshowwindow CALLED w/%d", show);

  if (shmblk) {
    shmblk->pginfo.showwindow = show;
  }
}

void
_shared_getcwd(_SHMBLK shmblk, char *cwd)
{
  if (shmblk == NULL)	
    return;

  strcpy(cwd, shmblk->pginfo.cwd);
}

void
_shared_setcwd(_SHMBLK shmblk, char *cwd)
{
  if (shmblk) {
    strcpy(shmblk->pginfo.cwd, cwd);
  }
}

int
_shared_getpgid(_SHMBLK shmblk)
{
  if (shmblk == NULL)
    return(0);

  return(shmblk->pginfo.pgid);
}

void
_shared_setpgid(_SHMBLK shmblk, int pgid)
{
  if (shmblk != NULL) {
    shmblk->pginfo.pgid = pgid;
  }
}

int
_shared_getstdinfd(_SHMBLK shmblk)
{
  if (shmblk == NULL)
    return(0);

  return(shmblk->pginfo.stdinfd);
}

void
_shared_setstdinfd(_SHMBLK shmblk, int fd)
{
  if (shmblk != NULL) {
    shmblk->pginfo.stdinfd = fd;
  }
}

int
_shared_getstdoutfd(_SHMBLK shmblk)
{
  if (shmblk == NULL)
    return(0);

  return(shmblk->pginfo.stdoutfd);
}

void
_shared_setstdoutfd(_SHMBLK shmblk, int fd)
{
  if (shmblk != NULL) {
    shmblk->pginfo.stdoutfd = fd;
  }
}

int
_shared_getstderrfd(_SHMBLK shmblk)
{
  if (shmblk == NULL)
    return(0);

  return(shmblk->pginfo.stderrfd);
}

void
_shared_setstderrfd(_SHMBLK shmblk, int fd)
{
  if (shmblk != NULL) {
    shmblk->pginfo.stderrfd = fd;
  }
}

void
_shared_setenvblk(_SHMBLK shmblk, char **env)
{
  char *d;
  int i, len;
  char *endp;

  if (shmblk == NULL) {
    return;
  }

  endp = shmblk->pginfo.environ + MAX_ENVIRONBLK;

  for (i = 0, d = shmblk->pginfo.environ; env[i] != NULL; i++) {
    len = strlen(env[i]);
    if (d + len >= endp)	{
      WCETRACE(WCE_IO, "_shared_setenvblk: FATAL space exhausted (max %d)",
               MAX_ENVIRONBLK);
      exit(1);
    }
    memcpy(d, env[i], len + 1);
    d += len + 1;
  }
  *d = 0;
}

void
_shared_getenvblk(_SHMBLK shmblk, char **env)
{
  char *s;
  int i, len;

  if (shmblk == NULL)
    return;

  for (i = 0, s = shmblk->pginfo.environ; *s; i++) {
    len = strlen(s);
    if (env[i] != NULL) {
      free(env[i]);
    }
    env[i] = malloc(len + 1);
    if (env[i] == NULL) {
      WCETRACE(WCE_IO, "_shared_getenvblk: FATAL ERROR malloc failed");
      exit(1);
    }
    memcpy(env[i], s, len + 1);
    s += len + 1;
  }
}

BOOL
_shared_getshowwindow(_SHMBLK shmblk)
{
#if 0 /* WHY?? */
  // called before xce_init() in console... dont want to
  // recompile all progs...
  if(shmblk == NULL)
    xceshared_init();
#endif

  return(shmblk->pginfo.showwindow);  
}

BOOL
_shared_lock(_SHMBLK shmblk)
{
  wchar_t nameW[SYSNAMELEN];
  char    name[SYSNAMELEN];
  
  if (shmblk->mutex == NULL) {
    sprintf(name, "%d:%s", shmblk->pginfo.pgid, MUTEXNAME);
    mbstowcs(nameW, name, strlen(name));
    if ((shmblk->mutex = CreateMutexW(NULL, FALSE, nameW)) == NULL) {
      return(FALSE);
    }
  }

  WaitForSingleObject(shmblk->mutex, INFINITE);
  return(TRUE);
}

BOOL
_shared_release(_SHMBLK shmblk)
{
  if (shmblk == NULL) {
    return(FALSE);
  }

  return(ReleaseMutex(shmblk->mutex));
}

int
_shared_attach()
{
  return(0);
}

#if 0
int
_shared_detach()
{
  /* TODO: We should also close the event handles we have
   * allocated in CreatePipe()
   *
   * We should also have a table of other pipes,
   * not only standard handles... (rk)
   */
  if(ISPIPEHANDLE(_pipe_getstdhnd(STDINPUT_HANDLE)))
     XCECloseHandle(XCEGetStdHandle(STD_INPUT_HANDLE));
  if(ISPIPEHANDLE(XCEGetStdHandle(STD_OUTPUT_HANDLE)))
     XCECloseHandle(XCEGetStdHandle(STD_OUTPUT_HANDLE));
  if(ISPIPEHANDLE(XCEGetStdHandle(STD_ERROR_HANDLE)))
     XCECloseHandle(XCEGetStdHandle(STD_ERROR_HANDLE));

  return 0;
}
#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?