/* Release a readers/writer lock previously acquired for writing */ void rwlock_write_release(rwlock_t *rwlock) { /* Acquire the rwlock lock */ spinlock_acquire(&rwlock->lock); /* No writers have acquired the lock */ if (rwlock->write_count == 0) { spinlock_release(&rwlock->lock); return; } /* No more writers */ rwlock->write_count--; /* Wake up the first thread on the queue */ thread_t *woken = (thread_t*) waitqueue_unblock(&rwlock->waitqueue); /* No threads waiting or writer thread */ if (!woken || woken->rwlock_state == WRITER_WAITING) { spinlock_release(&rwlock->lock); return; } /* Reader thread, so we should wake up all other waiting readers */ else if (woken->rwlock_state == READER_WAITING) { iterator_t iter = waitqueue_threads(&rwlock->waitqueue); thread_t *thread = (thread_t*) iter_now(&iter); while (thread) { if (thread->rwlock_state == READER_WAITING) { thread = (thread_t*) iter_remove(&iter); } } } /* Something else */ else { panic("Invalid rwlock wait state\n"); } }
int main() { list* list1 = list_create(); list* list2 = list_create(); list* list3 = list_create(); int data[] = {1, 2, 3, 4, 5}; char* strings[] = {"a", "b", "c", "d", "e", "f"}; int data_size = 5; for(int i = 0; i < data_size; i++) { list_append(list1, &data[i]); } int string_size = 6; for(int i = 0; i < string_size; i++) { list_append(list2, strings[i]); } iterator* iter1 = iter_create(list1); printf("Data List Print Test....\n"); printf("Data List: "); while(!iter_at_end(iter1)) { node* n = iter_get(iter1); int* val = n->data; printf("%d ", *val); iter_advance(iter1); } printf("\n"); printf("Removing 2nd Element From Data\n"); iter1 = iter_create(list1); iter_advance(iter1); iter_remove(iter1); printf("Data List: "); while(!iter_at_end(iter1)) { node* n = iter_get(iter1); int* val = n->data; printf("%d ", *val); iter_advance(iter1); } printf("\n"); printf("\n"); printf("String List Print Test.......\n"); iterator* iter2 = iter_create(list2); printf("Strings List: "); while(!iter_at_end(iter2)) { node* n = iter_get(iter2); char* val = n->data; printf("%s ", val); iter_advance(iter2); } printf("\n"); list_remove_last(list2); iter2 = iter_create(list2); printf("Removing Last Element from String List\n"); printf("Strings List: "); while(!iter_at_end(iter2)) { node* n = iter_get(iter2); char* val = n->data; printf("%s ", val); iter_advance(iter2); } printf("\n"); printf("\n"); printf("Done Printing\n"); return 0; }