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; }
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 }
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; } } } }
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++; } }
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 }
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); }