Exemple #1
0
//deep-bindによる。シンボルが見つからなかったら登録。
//見つかったらそこに値をいれておく。
void bindsym(int symaddr, int valaddr){
        int addr,num;
    char *name;
    
    name = symname(symaddr);
    if((addr=findsym(name)) == NIL){
        addr = freshcell();
        SET_NAME(addr,name);
        SET_CDR(addr,E);
        E = addr;
    }
    switch(GET_TAG(valaddr)){
                case NUM: {     SET_TAG(addr,NUM);
                                num = GET_NUMBER(valaddr);
                    SET_NUMBER(addr,num);
                    break; }
        case SYM: {     SET_TAG(addr,SYM);
                                name = GET_NAME(valaddr);
                                SET_NAME(addr,name);
                                break; }
        case LIS: {     SET_TAG(addr,LIS);
                                SET_BIND(addr,valaddr);
                                break; }
    }
}
Exemple #2
0
int makesym(char *name){
    int addr;
    
    addr = freshcell();
    SET_TAG(addr,SYM);
    SET_NAME(addr,name);
    return(addr);
}
Exemple #3
0
//空リストを作る。シンボルnilを空リストとも解釈している。
int makeempty(void){
        int addr;
    
    addr = freshcell();
    SET_TAG(addr,SYM);
    SET_NAME(addr,"nil");
    return(addr);
}
Exemple #4
0
//シンボルTを返す。
int makeT(void){
	int addr;
    
    addr = freshcell();
    SET_TAG(addr,SYM);
    SET_NAME(addr,"t");
    return(addr);
}
Exemple #5
0
static void *
sock_write(void *arg)
{
	int fd = *(int *)arg;

	SET_NAME("writer");
	CHECKe(write(fd, MESSAGE5, sizeof(MESSAGE5)));
	return(NULL);
}
Exemple #6
0
void initcell(void){
        int addr,addr1;
    
    for(addr=0; addr < HEAPSIZE; addr++){
        heap[addr].tag = EMP;
        heap[addr].cdr = addr+1;
    }
    H = 0;
    
    //0番地はnil、1番地はTとして環境レジスタを設定する。初期環境
    addr = freshcell(); //symbol nil
    SET_TAG(addr,SYM);
    SET_NAME(addr,"nil");
    addr1 = freshcell(); //symbol t
    SET_TAG(addr1,SYM);
    SET_NAME(addr1,"t");
        SET_CDR(addr1,addr);
    E = addr1;
}
/*
 * Install a signal handler for sigusr1 and then wait for it to
 * occur.
 */
static void *
do_nothing (void *arg)
{
	SET_NAME("nothing");

	ASSERT(signal(SIGUSR1, sighandler) != SIG_ERR);
	CHECKr(pthread_mutex_lock(&sync_mutex));
	ASSERT(got_signal != 0);
	CHECKr(pthread_mutex_unlock(&sync_mutex));
	return 0;
}
bool apoAttrCalcHelper::InitAttrNode(attrid_t aid, const char *name, const char*realName, const char *formula)
{
	if (aid >= APO_ATTR_CAPACITY) {
		return false;
	}
	role_attr_description node;
	node.wa_id = aid;
#define SET_NAME(_NAME,_INPUTNAME) if(_INPUTNAME && *_INPUTNAME) {node._NAME = _INPUTNAME;}

	SET_NAME(name, name);
	SET_NAME(real_name, realName);
	SET_NAME(input_for, formula);

	m_wahelper_bufs[aid] = node;
	int curNum = aid + 1;
	if (m_wa_num < curNum) {
		m_wa_num = curNum;
	}
	return true;
}
Exemple #9
0
static void * 
thread_contention(void *arg)
{
	pthread_mutex_t *mutex = arg;

	SET_NAME("cntntn");

	CHECKr(pthread_mutex_lock(mutex));
	ASSERT(contention_variable == 1);
	contention_variable = 2;
	CHECKr(pthread_mutex_unlock(mutex));
	pthread_exit(NULL);
}
Exemple #10
0
static void *
new_thread(void *arg)
{
	int i;

	SET_NAME("writer");
	while (!ending) {
		CHECKe(write (fd, (char *) arg, 1));
		x[(char *)arg - buf] = 1;
		for (i = 0; i < 999999; i += 1)
			;
	}
	return NULL;
}
Exemple #11
0
void bindfunc(char *name, ftype ftype, int func){
        int addr;

        addr = freshcell();
        SET_NAME(addr,name);
        SET_TAG(addr,FUN);
    SET_FTYPE(addr,ftype);
    switch(ftype){
        case SUBR:
        case FSUBR:             SET_SUBR(addr,func);
        case LAMBDA:    SET_BIND(addr,func);
    }
    SET_CDR(addr,E);
    E = addr;
}
Exemple #12
0
static void *
waiter(void *arg)
{
	int status;
	pid_t pid;

	SET_NAME("waiter");
	CHECKr(pthread_mutex_lock(&waiter_mutex));
	printf("waiting for child\n");
	CHECKe(pid = wait(&status));
	ASSERT(WIFEXITED(status));
	ASSERT(WEXITSTATUS(status) == 0);
	printf("child exited\n");
	CHECKr(pthread_mutex_unlock(&waiter_mutex));
	return (NULL);
}
static void *
thread(void * arg)
{
	sigset_t run_mask;
	sigset_t suspender_mask;

	/* wait for sigusr1 */
	SET_NAME(arg);

	/* Run with all signals blocked, then suspend for SIGUSR1 */
	sigfillset(&run_mask);
	CHECKe(sigprocmask(SIG_SETMASK, &run_mask, NULL));
	sigfillset(&suspender_mask);
	sigdelset(&suspender_mask, SIGUSR1);
	for (;;) {
		sigsuspend(&suspender_mask);
		ASSERT(errno == EINTR);
		printf("Thread %s woke up\n", (char*) arg);
	}
		
}
Exemple #14
0
static void *
sigsuspender (void *arg)
{
	int save_count, status, i;
	sigset_t run_mask;

	SET_NAME("sigsuspender");

	/* Run with all signals blocked. */
	sigfillset (&run_mask);
	CHECKe(sigprocmask (SIG_SETMASK, &run_mask, NULL));

	/* Allow these signals to wake us up during a sigsuspend. */
	sigfillset (&suspender_mask);		/* Default action	*/
	sigdelset (&suspender_mask, SIGINT);	/* terminate		*/
	sigdelset (&suspender_mask, SIGHUP);	/* terminate		*/
	sigdelset (&suspender_mask, SIGQUIT);	/* create core image	*/
	sigdelset (&suspender_mask, SIGURG);	/* ignore		*/
	sigdelset (&suspender_mask, SIGIO);	/* ignore		*/
	sigdelset (&suspender_mask, SIGUSR2);	/* terminate		*/
	sigdelset (&suspender_mask, SIGSTOP);	/* unblockable		*/
	sigdelset (&suspender_mask, SIGKILL);	/* unblockable		*/

	while (sigcounts[SIGINT] == 0) {
		save_count = sigcounts[SIGUSR2];

		status = sigsuspend (&suspender_mask);
		if ((status == 0) || (errno != EINTR)) {
			DIE(errno, "Unable to suspend for signals, "
				"return value %d\n",
				status);
		}
		for (i = 0; i < fifo_depth; i++)
			printf ("Sigsuspend woke up by signal %d (%s)\n",
				sigfifo[i], strsignal(sigfifo[i]));
		fifo_depth = 0;
	}

	return (arg);
}
static void *
sigwaiter (void *arg)
{
	int signo;

	SET_NAME("sigwaiter");

	/* Block all of the signals that the function will wait for */
	CHECKe(sigprocmask (SIG_BLOCK, &wait_mask, NULL));

	while (sigcounts[SIGINT] == 0) {
		printf("Sigwait waiting (thread %p)\n", pthread_self());
		CHECKe(sigwait (&wait_mask, &signo));
		sigcounts[signo]++;
		printf ("Sigwait caught signal %d (%s)\n", signo, 
		    strsignal(signo));

		/* Allow the main thread to prevent the sigwait. */
		CHECKr(pthread_mutex_lock (&waiter_mutex));
		CHECKr(pthread_mutex_unlock (&waiter_mutex));
	}

	return (arg);
}