syscall future_set(future *f, int *i) {
    irqmask mask;
    mask = disable();
    if(f == NULL){
        restore(mask);
        return SYSERR;
    }
    if(f->flag == FUTURE_EXCLUSIVE) {
        if(f->state == FUTURE_WAITING) {
          
            f->value = *i;
            f->state = FUTURE_VALID; 
            resume(f->tid);
            restore(mask);
            return OK;
        }
        f->value = *i;
        f->state = FUTURE_VALID; 
        restore(mask);
        return OK;
    }
    if(f->flag == FUTURE_SHARED) {
        if(f->state == FUTURE_VALID) {
            printf("Producer already set, Error!\n");
            restore(mask);
            return SYSERR;
        }
        f->state = FUTURE_VALID;
        f->value = *i;
        if(!emp_queue(&(f->get_queue))){
             peek_queue(&(f->get_queue));
            resume(del_queue(&(f->get_queue)));
        }
        restore(mask);
        return OK;
    }
    if(f->flag == FUTURE_QUEUE){
        if(emp_queue(&(f->get_queue))) {
            en_queue(&(f->set_queue), gettid());
            restore(mask);
            return SYSERR;
        }
        else {
            f->state = FUTURE_VALID;
            f->value = *i;
            f->tid = peek_queue(&(f->get_queue));
            resume(del_queue(&(f->get_queue)));
            restore(mask);
            return OK;  
        }
        return OK;
    }
    restore(mask);
    return SYSERR;
}
Esempio n. 2
0
File: lru.c Progetto: datawolf/pyf
// A function to add a page with given 'page_number' to both
// queue and hash
void insert_queue(Queue* queue, Hash* hash, unsigned page_number)
{
    // is all frames are full, remvoe the page at the rear
    if (are_all_frames_full(queue))
    {
        // remvoe page from hash
        hash->array[queue->rear->page_number] = NULL;
        del_queue(queue);
    }

    // create a new node with given page number,
    // and add the new node to thr front to queue
    Node *temp = new_node(page_number);
    temp->next = queue->front;

    // if queue is empty , change both front and rear pointer
    if (is_queue_empty(queue))
        queue->rear = queue->front = temp;
    else
    {
        queue->front->prev = temp;
        queue->front = temp;
    }

    // add page entry to hash also
    hash->array[page_number] = temp;

    // increment number of full frames
    queue->count++;

}
Esempio n. 3
0
File: ds.c Progetto: djiangtw/study
int main(int argc, const char *argv[])
{
    queue_t* a;
    int data;
    int i;

    a = (queue_t*)malloc(sizeof(queue_t));
    new_queue(a, 10);

    print_queue(a);
    pushq(a, 2);
    print_queue(a);
    popq(a, &data);
    print_queue(a);
    pushq(a, 3);
    print_queue(a);
    for(i = 0; i < a->size + 3; i++)
    {
        pushq(a, i);
        print_queue(a);
    }
    for(i = 0; i < a->size + 3; i++)
    {
        popq(a, &data);
        print_queue(a);
        printf("data: %d\n", data);
    }

    del_queue(a);
    free(a);
    return 0;
}
Esempio n. 4
0
char* del_queue(queue_unit *unit, int cfp, char *buf) {
    if (unit != NULL) {
        if (unit->socket_num == cfp) {
            strncpy(buf, unit->key,KEY_MAX_LEN);
            unit->pre->next = unit->next;
            if (unit->next != NULL) {
                unit->next->pre = unit->pre;
            }
            free(unit);
        } else {
            return del_queue(unit->next, cfp, buf);
        }
    }
}
Esempio n. 5
0
int main(int argc, char *argv[])
{
	QUEUE Q;
	int val;
	init_queue(&Q);
    en_queue(&Q,1);
	en_queue(&Q,2);
	en_queue(&Q,3);
	en_queue(&Q,4);
	en_queue(&Q,5);

	traverse_queue(&Q);
	if(del_queue(&Q,&val)) printf("出队成功。出队元素为:%d\n",val);
	else printf("抱歉!出队失败。\n");
	traverse_queue(&Q);
	

	
	return 0;
}
Esempio n. 6
0
int main(int argc, char** argv) {
    queue_unit use_list, wait_list, *use_p, *wait_p;
    if (init_queue(&use_list) == -1) {
        printf("use Queue Initialization failed");
        exit(EXIT_FAILURE);
    }
    if (init_queue(&wait_list) == -1) {
        printf("wait Queue Initialization failed");
        exit(EXIT_FAILURE);
    }
    int opt, cfp, len, sel, i, temp, port = PORT;
    int keepAlive = 1; // 开启keepalive属性
    int keepIdle = 5; // 如该连接在5秒内没有任何数据往来,则进行探测 
    int keepInterval = 5; // 探测时发包的时间间隔为5 秒
    int keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.
    struct sockaddr_in client_sockaddr, service_sockaddr;
    char buf[1024];
    while ((opt = getopt(argc, argv, "hp:")) != -1) {
        switch (opt) {
            case 'p':port = atoi(optarg);
                break;
            case 'h':
            default:
                printf("Welcome to use SocketLock For PHP\n"
                        "-h\t\t\t help \n"
                        "-p\t\t\t listen port\n");
        }
    }
    signal(SIGQUIT, sigroutine);
    signal(SIGKILL, sigroutine);
    sfp = socket(AF_INET, SOCK_STREAM, 0);
    setsockopt(sfp, SOL_SOCKET, SO_KEEPALIVE, (void *) &keepAlive, sizeof (keepAlive));
    setsockopt(sfp, SOL_TCP, TCP_KEEPIDLE, (void*) &keepIdle, sizeof (keepIdle));
    setsockopt(sfp, SOL_TCP, TCP_KEEPINTVL, (void *) &keepInterval, sizeof (keepInterval));
    setsockopt(sfp, SOL_TCP, TCP_KEEPCNT, (void *) &keepCount, sizeof (keepCount));
    service_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    service_sockaddr.sin_family = AF_INET;
    service_sockaddr.sin_port = htons(port);
    if (-1 == bind(sfp, (struct sockaddr *) &service_sockaddr, sizeof (struct sockaddr))) {
        perror("bind error");
        exit(EXIT_FAILURE);
    }
    printf("bind success!\n");
    if (-1 == listen(sfp, MAX_NUM)) {
        perror("listen error");
        exit(EXIT_FAILURE);
    }
    printf("listen success!\n");
    socklen_t sl = sizeof (struct sockaddr_in);
    fd_set readset, bufset;
    FD_ZERO(&readset);
    FD_ZERO(&bufset);
    FD_SET(sfp, &readset);
    struct timeval tm;
    while (1) {
        tm.tv_sec = 5;
        tm.tv_usec = 0;
        memcpy(&bufset, &readset, sizeof (fd_set));
        sel = select(MAX_NUM + 1, &bufset, NULL, NULL, &tm);
        if (sel < 0) {
            perror("select error");
            exit(EXIT_FAILURE);
        }
        if (sel == 0) {
            printf("timeout!\n");
            printf("----use Queue!----\n");
            echo_queue(&use_list);
            printf("----wait Queue!----\n");
            echo_queue(&wait_list);
            continue;
        }
        if (FD_ISSET(sfp, &bufset)) {
            cfp = accept(sfp, (struct sockaddr *) &client_sockaddr, &sl);
            if (cfp == -1) {
                perror("accept error");
                exit(EXIT_FAILURE);
            }
            write(cfp, CONNECT_SIGNAL, strlen(CONNECT_SIGNAL));
            FD_SET(cfp, &readset);
            client_fd[cfp] = 1;
            printf("client success %d \n", cfp);
        }

        for (i = 0; i < MAX_NUM; i++) {
            if (FD_ISSET(i, &bufset)) {
                if (client_fd[i] == 1) {
                    len = read(i, buf, 1024);
                    if (len <= 0) {
                        client_fd[i] = 0;
                        FD_CLR(i, &readset);
                        close(i);
                        del_queue(&use_list, i, buf); //删除在用队列里的数据
                        printf("close: %d %s\n", i, buf);

                        use_p = find_in_queue(&wait_list, buf); //查找等待队列中是否有数据
                        if (use_p != NULL) {//如果有等待
                            temp = use_p->socket_num;
                            del_queue(&wait_list, temp, buf); //从等待队列中去除
                            printf("client: %d %s using\n", temp, buf);
                            add_queue(&use_list, temp, buf); //加入在用队列
                            write(cfp, CONNECT_SIGNAL, strlen(CONNECT_SIGNAL)); //发送通过信号
                        }
                    } else {
                        buf[len] = '\0';
                        use_p = find_in_queue(&use_list, buf);
                        if (use_p == NULL) {
                            printf("client: %d %s using\n", i, buf);
                            add_queue(&use_list, i, buf);
                            write(cfp, CONNECT_SIGNAL, strlen(CONNECT_SIGNAL)); //发送通过信号
                        } else {
                            add_queue(&wait_list, i, buf); //不许通过进入等待队列
                        }
                    }
                }

            }
        }
    }
    close(sfp);
    return (EXIT_SUCCESS);
}