Exemplo n.º 1
0
static
void readerthread(void *junk, unsigned long num) {
    (void)junk;
    if(num < 80) {
        //kprintf_n("Thread %lu trying to acquire read lock\n", num);
        random_yielder(4);
        rwlock_acquire_read(testrwlock);
        random_yielder(4);
        kprintf_n("Thread %lu: Reader val:%lu\n", num, testval1);
        for(int i=0; i<40000; i++);
        random_yielder(4);
        rwlock_release_read(testrwlock);
        random_yielder(4);
        //kprintf_n("Thread %lu released read lock\n", num);
        V(donesem);
    }
    else {
        //kprintf_n("Thread %lu trying to acquire write lock\n", num);
        random_yielder(4);
        rwlock_acquire_write(testrwlock);
        random_yielder(4);
        testval1++;
        kprintf_n("Thread %lu: Writer val:%lu\n", num, testval1);
        for(int i=0; i<40000; i++);
        random_yielder(4);
        rwlock_release_write(testrwlock);
        random_yielder(4);
        //kprintf_n("Thread %lu released write lock\n", num);
        V(donesem);
    }
    return;
}
Exemplo n.º 2
0
int whalemating(int nargs, char **args) {
	(void) nargs;
	(void) args;

	int i, j, err = 0;
	char name[32];

	whalematingMenuSemaphore = sem_create("Whalemating Driver Semaphore",
			0);
	if (whalematingMenuSemaphore == NULL ) {
		panic("whalemating: sem_create failed.\n");
	}

	whalemating_init();

	for (i = 0; i < 3; i++) {
		for (j = 0; j < NMATING; j++) {

			random_yielder(PROBLEMS_MAX_YIELDER);

			switch (i) {
			case 0:
				snprintf(name, sizeof(name), "Male Whale Thread %d", (i * 3) + j);
				err = thread_fork(name, male, whalematingMenuSemaphore, j, NULL);
				break;
			case 1:
				snprintf(name, sizeof(name), "Female Whale Thread %d", (i * 3) + j);
				err = thread_fork(name, female, whalematingMenuSemaphore, j, NULL);
				break;
			case 2:
				snprintf(name, sizeof(name), "Matchmaker Whale Thread %d", (i * 3) + j);
				err = thread_fork(name, matchmaker, whalematingMenuSemaphore, j, NULL);
				break;
			}
			if (err) {
				panic("whalemating: thread_fork failed: (%s)\n",
						strerror(err));
			}
		}
	}

	for (i = 0; i < 3; i++) {
		for (j = 0; j < NMATING; j++) {
			P(whalematingMenuSemaphore);
		}
	}

	sem_destroy(whalematingMenuSemaphore);
	whalemating_cleanup();

	return 0;
}
Exemplo n.º 3
0
int stoplight(int nargs, char **args) {
	(void) nargs;
	(void) args;
	int i, direction, turn, err = 0;
	char name[32];

	stoplightMenuSemaphore = sem_create("Stoplight Driver Semaphore", 0);
	if (stoplightMenuSemaphore == NULL ) {
		panic("stoplight: sem_create failed.\n");
	}

	stoplight_init();

	for (i = 0; i < NCARS; i++) {

		direction = random() % 4;
		turn = random() % 3;

		snprintf(name, sizeof(name), "Car Thread %d", i);

		switch (turn) {

		random_yielder(PROBLEMS_MAX_YIELDER);

		case 0:
			err = thread_fork(name, gostraight,
					stoplightMenuSemaphore, direction,
					NULL );
			break;
		case 1:
			err = thread_fork(name, turnleft,
					stoplightMenuSemaphore, direction,
					NULL );
			break;
		case 2:
			err = thread_fork(name, turnright,
					stoplightMenuSemaphore, direction,
					NULL );
			break;
		}
	}

	for (i = 0; i < NCARS; i++) {
		P(stoplightMenuSemaphore);
	}

	sem_destroy(stoplightMenuSemaphore);
	stoplight_cleanup();

	return 0;
}
Exemplo n.º 4
0
static
void
kmalloctest4thread(void *sm, unsigned long num)
{
#define NUM_KM4_SIZES 5
#define ITERATIONS 50
	static const unsigned sizes[NUM_KM4_SIZES] = { 1, 3, 5, 2, 4 };

	struct semaphore *sem = sm;
	void *ptrs[NUM_KM4_SIZES];
	unsigned p, q;
	unsigned i, j, k;
	uint32_t magic;

	for (i=0; i<NUM_KM4_SIZES; i++) {
		ptrs[i] = NULL;
	}
	p = 0;
	q = NUM_KM4_SIZES / 2;
	magic = random();

	for (i=0; i<NTRIES; i++) {
		PROGRESS(i);
		if (ptrs[q] != NULL) {
			kfree(ptrs[q]);
			ptrs[q] = NULL;
		}
		ptrs[p] = kmalloc(sizes[p] * PAGE_SIZE);
		if (ptrs[p] == NULL) {
			panic("kmalloctest4: thread %lu: "
			      "allocating %u pages failed\n",
			      num, sizes[p]);
		}

		// Write to each page of the allocated memory and make sure nothing
		// overwrites it.
		for (k = 0; k < sizes[p]; k++) {
			*((uint32_t *)ptrs[p] + k*PAGE_SIZE/sizeof(uint32_t)) = magic;
		}

		for (j = 0; j < ITERATIONS; j++) {
			random_yielder(4);
			for (k = 0; k < sizes[p]; k++) {
				uint32_t actual = *((uint32_t *)ptrs[p] + k*PAGE_SIZE/sizeof(uint32_t));
				if (actual != magic) {
					panic("km4: expected %u got %u. Your VM is broken!",
						magic, actual);
				}
			}
		}
		magic++;
		p = (p + 1) % NUM_KM4_SIZES;
		q = (q + 1) % NUM_KM4_SIZES;
	}

	for (i=0; i<NUM_KM4_SIZES; i++) {
		if (ptrs[i] != NULL) {
			kfree(ptrs[i]);
		}
	}

	V(sem);
}
Exemplo n.º 5
0
inline void matchmaker_start(void) {
	random_yielder(PROBLEMS_MAX_YIELDER);
	kprintf("%s starting\n", curthread->t_name);
}