Exemplo n.º 1
0
/* 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");
	}
}
Exemplo n.º 2
0
Arquivo: main.c Projeto: jrubill/2101
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;
}