コード例 #1
0
local_block_t *init_thread() {
  local_block_t *l = (local_block_t *) calloc(1,sizeof(local_block_t));

  l->threadHeadBlock = DeRefLink(&globalHeadBlock);
  l->threadTailBlock = DeRefLink(&globalTailBlock);
  l->threadHead = l->threadHeadBlock->head;
  l->threadTail = l->threadTailBlock->tail;
  return l;
}
コード例 #2
0
static void
initPaths()
{ char plp[MAXPATHLEN];
  char *symbols = NULL;			/* The executable */

  if ( !(symbols = findExecutable(GD->cmdline.argv[0], plp)) ||
       !(symbols = DeRefLink(symbols, plp)) )
    symbols = GD->cmdline.argv[0];

#ifdef OS2 
  symbols = GD->cmdline.argv[0];
#endif

  DEBUG(2, Sdprintf("rc-module: %s\n", symbols));

  systemDefaults.home	     = findHome(symbols);

#ifdef __WIN32__			/* we want no module but the .EXE */
  symbols = findExecutable(NULL, plp);
  DEBUG(2, Sdprintf("Executable: %s\n", symbols));
#endif

  GD->paths.executable	     = store_string(symbols);

  systemDefaults.startup     = store_string(PrologPath(DEFSTARTUP, plp));
  GD->options.systemInitFile = defaultSystemInitFile(GD->cmdline.argv[0]);

#ifdef O_XOS
  if ( systemDefaults.home )
  { char buf[MAXPATHLEN];
    _xos_limited_os_filename(systemDefaults.home, buf);
    systemDefaults.home = store_string(buf);
  }
#endif
}
コード例 #3
0
QUEUE_ELEMTY *dequeue(local_block_t *l) {
  int tail = l->threadTail;
  block_t *block = l->threadTailBlock;
  for(;;) {
    if(tail==BLOCK_SIZE) {
      block_t *oldBlock = block;
      block->tail = tail;
      block=DeRefLink(&block->next);
      if(block == NULL)
        return NULL;
      else {
        if(!oldBlock->deleted) {
          while(globalTailBlock != oldBlock && !oldBlock->deleted) {
            block_t *tailBlock= DeRefLink(&globalTailBlock);
            if(tailBlock->next != oldBlock) continue;
            if(__sync_bool_compare_and_swap(&globalTailBlock,tailBlock,oldBlock))
              release_block(tailBlock);
          }
          if(__sync_bool_compare_and_swap(&oldBlock->deleted,0,1)) {
            if(__sync_bool_compare_and_swap(&globalTailBlock,oldBlock,block))
              release_block(oldBlock);
          }
        }
        if(block->deleted)
          block=DeRefLink(&globalTailBlock);
      }
      l->threadTailBlock = block;
      tail = block->tail;
    }
    else {
      void *data = block->nodes[tail];
      if(data== (void *) NULL2)
        tail++;
      else if(data==NULL && __sync_bool_compare_and_swap(&block->nodes[tail],NULL,NULL)) {
        l->threadTail = tail;
        return NULL;
      }
      else if(__sync_bool_compare_and_swap(&block->nodes[tail],data,NULL2)) {
        l->threadTail = tail+1;
        return data;
      }
    }
  }
}
コード例 #4
0
void enqueue(local_block_t *l, QUEUE_ELEMTY *item) {

  int head = l->threadHead;
  block_t *block = l->threadHeadBlock;
  for(;;) {
    if(head==BLOCK_SIZE) {
      block_t *oldBlock = block;
      block->head = head;
      block = DeRefLink(&block->next);
      if(block == NULL) {
        block = (block_t *) new_block();
        while(globalHeadBlock != oldBlock && oldBlock->next==NULL) {
          block_t *headBlock = DeRefLink(&globalHeadBlock);
          if(headBlock->next != oldBlock) break;
          if(__sync_bool_compare_and_swap(&globalHeadBlock,headBlock,oldBlock)) break;
        }
        if(__sync_bool_compare_and_swap(&oldBlock->next,NULL,block))
          __sync_bool_compare_and_swap(&globalHeadBlock,oldBlock,block);
        else {
          release_block(block);
          block = DeRefLink(&oldBlock->next);
        }
      }
      else if(block->head==BLOCK_SIZE && block->next!=NULL)
        block = DeRefLink(&globalHeadBlock);
      l->threadHeadBlock = block;
      head = block->head;
    }
    else if(block->nodes[head]==NULL) {
      if(__sync_bool_compare_and_swap(&block->nodes[head],NULL,item)) {
        l->threadHead = head+1;
        return;
      }
    }
    else head++;
  }
}
コード例 #5
0
ファイル: pl-init.c プロジェクト: ddgold/design_patterns
static void
initPaths(int argc, const char **argv)
{ char plp[MAXPATHLEN];

  if ( argc > 0 )
  { char plp1[MAXPATHLEN];
    const char *symbols = NULL;		/* The executable */

    if ( !(symbols = findExecutable(argv[0], plp1)) ||
	 !(symbols = DeRefLink(symbols, plp)) )
      symbols = argv[0];

    DEBUG(2, Sdprintf("rc-module: %s\n", symbols));

    systemDefaults.home	       = findHome(symbols, argc, argv);

#ifdef __WINDOWS__			/* we want no module but the .EXE */
    GD->paths.module	       = store_string(symbols);
    symbols = findExecutable(NULL, plp);
    DEBUG(2, Sdprintf("Executable: %s\n", symbols));
#endif
    GD->paths.executable       = store_string(symbols);
    GD->options.systemInitFile = defaultSystemInitFile(argv[0]);
  } else
  { systemDefaults.home	       = findHome(NULL, argc, argv);
    GD->options.systemInitFile = store_string("none");
#ifdef __WINDOWS__			/* we want no module but the .EXE */
    GD->paths.module	       = store_string("libswipl.dll");
#endif
  }

  systemDefaults.startup = store_string(PrologPath(DEFSTARTUP, plp, sizeof(plp)));

#ifdef O_XOS
  if ( systemDefaults.home )
  { char buf[MAXPATHLEN];
    _xos_limited_os_filename(systemDefaults.home, buf);
    systemDefaults.home = store_string(buf);
  }
#endif
}
コード例 #6
0
void cleanup_node(block_t *node) {
  block_t *next = DeRefLink(&node->next);
  block_t *next2 = DeRefLink(&globalTailBlock);
  __sync_bool_compare_and_swap(&node->next, next, next2);
}