void reset_queue() { int i; for(i = 0; i < sendQ.highSize; i++) free(sendQ.high[i].message); for(i = 0; i < sendQ.lowSize; i++) free(sendQ.low[i].message); setup_queue(); }
// Callback from device manager void qd_queue_init_data(struct e10k_binding *b, struct capref registers, uint64_t macaddr) { struct frame_identity frameid = { .base = 0, .bits = 0 }; errval_t err; void *virt; INITDEBUG("idc_queue_init_data\n"); mac_address = macaddr; // Map device registers invoke_frame_identify(registers, &frameid); err = vspace_map_one_frame_attr(&virt, 1 << frameid.bits, registers, VREGION_FLAGS_READ_WRITE_NOCACHE, NULL, NULL); assert(err_is_ok(err)); // Initialize mackerel device d = malloc(sizeof(*d)); #ifndef VF e10k_initialize(d, virt); #else e10k_vf_initialize(d, virt); #endif // Initialize queue setup_queue(); } // Callback from device manager void qd_queue_memory_registered(struct e10k_binding *b) { initialized = 1; hwqueue_initialized(); // Register queue with queue_mgr library #ifndef LIBRARY ethersrv_init((char*) service_name, qi, get_mac_addr_fn, terminate_queue_fn, transmit_pbuf_list_fn, find_tx_free_slot_count_fn, handle_free_tx_slot_fn, RXBUFSZ, register_rx_buffer_fn, find_rx_free_slot_count_fn); #else ethernetif_backend_init((char*) service_name, qi, get_mac_addr_fn, terminate_queue_fn, transmit_pbuf_list_fn, find_tx_free_slot_count_fn, handle_free_tx_slot_fn, RXBUFSZ, register_rx_buffer_fn, find_rx_free_slot_count_fn); #endif }
int main() { Queue* queue = setup_queue(); printf("%d\n", queue->length); enqueue(queue, 1); printf("%d\n", queue->length); enqueue(queue, 2); printf("%d\n", queue->length); int* a = dequeue(queue); int* b = dequeue(queue); printf("%d\n", *a); printf("%d\n", *b); print_queue(queue); free(queue); return 0; }
/* main: this is supposedly required for a C program * 1. Create threads to handle clients * 2. Add clients from the file * 3. Join threads and leave * Returns 0 if everything was done correctly. */ int main(int argc, char** argv) { int num_queries, num_threads; long i; pthread_t * tids; if(argc != 3) { fprintf(stderr, "USAGE: %s [input_file_path] [num_threads]\n", argv[0]); exit(1); } // do preliminary work (database, queue, etc.) setup_queue(); populate_database("TwitterDB.txt"); num_threads = atoi(argv[2]); sem_init(&queue_access, 0, 1); sem_init(&empty, 0, 0); sem_init(&served, 0, 1); sem_init(&full, 0, num_threads); // create threads to handle clients tids = calloc(num_threads, sizeof(pthread_t)); for(i = 0; i < num_threads; i++) { if(pthread_create(&tids[i], NULL, serveClients, (void *)(i + 1))) { perror("main: could not create create thread"); exit(1); } } // populate queue num_queries = buildQueue(argv[1]); while(num_served != num_queries); // cancel threads for (i = 0; i < num_threads; i++) { if(pthread_cancel(tids[i])) { perror("main: could not join thread"); exit(1); } } // clean up destroy_database(); destroy_queue(); free(tids); printf("Finished handling all clients\n"); return 0; }