void put(Buffer* b, int m) {
    enterMonitor(b->monitor);
    while(b->full) {
        wait();
    }
    b->message = m;
    b->full = 1;
    notify();
    exitMonitor();

    return;
}
int get(Buffer* b) {
    int m;

    enterMonitor(b->monitor);
    while (!b->full) {
        wait();
    }
    m = b->message;
    b->full = 0;
    notifyAll();
    exitMonitor();

    return m;
}
int get(Buffer* b) {
	printf("get\n");
	int m;

	enterMonitor(b->monitor);
	while (!b->full) {
		wait();
	}
	printf("got\n");
	m = b->message;
	b->full = 0;
	notifyAll();
	exitMonitor();

	return m;
}
int timedGet(Buffer *b, int timeout) {
    int m, ret;

    enterMonitor(b->monitor);
    if (!b->full) {
        ret = timedWait(timeout);
    }
    if (ret) {
        m = b->message;
        b->full = 0;
        notifyAll();
    } else {
        m = TIMEOUT;
    }
    exitMonitor();
    return m;
}