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