Esempio n. 1
0
void test_pthread(void)
{
	pthread_t consumer_t = 0;
	pthread_t producer_t = 0;
	Locker *wrlock = locker_pthread_create();
	Locker *nest_lock = locker_pthread_nest_create(wrlock, (ReadSelfId)pthread_self);
#ifdef RW_LOCK
	Locker *rdlock = locker_pthread_create();
	RWLock *rwlock = rwlock_create(wrlock, rdlock);
#endif
	DList *head = NULL;
	
#ifdef RW_LOCK
	head = dlist_create(rwlock);
#else
	head = dlist_create(wrlock);
#endif
	return_if_fail(head != NULL);
	
	pthread_create(&producer_t, NULL, producer_thread, head);
	pthread_create(&consumer_t, NULL, consumer_thread, head);

	pthread_join(consumer_t, NULL);
	pthread_join(producer_t, NULL);
}
Esempio n. 2
0
int do_cache_object(cache_t *c, u64 id, u64 key, int sz, char *buf, int dirty)
{
	accessed_cache(c);
	rwlock_acquire(c->rwl, RWL_WRITER);
	struct ce_t *obj = chash_search(c->hash, id, key);
	if(obj)
	{
		memcpy(obj->data, buf, obj->length);
		set_dirty(c, obj, dirty);
		rwlock_release(c->rwl, RWL_WRITER);
		return 0;
	}
	if(!should_element_be_added(c))
	{
		u64 a, b;
		struct ce_t *q;
		if((q = chash_get_any_object(c->hash, &a, &b)))
		{
			if(q->dirty)
				do_sync_element(c, q, 1);
			remove_element(c, q, 1);
		}
	}
	obj = (struct ce_t *)kmalloc(sizeof(struct ce_t));
	obj->data = (char *)kmalloc(sz);
	obj->length = sz;
	obj->rwl = rwlock_create(0);
	memcpy(obj->data, buf, sz);
	obj->key = key;
	obj->id = id;
	set_dirty(c, obj, dirty);
	cache_add_element(c, obj, 1);
	rwlock_release(c->rwl, RWL_WRITER);
	return 0;
}
Esempio n. 3
0
void init_dev_fs()
{
	devfs_root = (struct inode*)kmalloc(sizeof(struct inode));
	_strcpy(devfs_root->name, "dev");
	devfs_root->i_ops = &devfs_inode_ops;
	devfs_root->parent = current_task->thread->root;
	devfs_root->mode = S_IFDIR | 0x1FF;
	devfs_root->num = -1;
	rwlock_create(&devfs_root->rwl);
	/* Create device nodes */
	char tty[6] = "tty";
	int i;
	for(i=1;i<10;i++) {
		sprintf(tty, "tty%d", i);
		devfs_add(devfs_root, tty, S_IFCHR, 3, i);
	}
	devfs_add(devfs_root, "tty", S_IFCHR, 4, 0);
	devfs_add(devfs_root, "null", S_IFCHR, 0, 0);
	devfs_add(devfs_root, "zero", S_IFCHR, 1, 0);
	devfs_add(devfs_root, "com0", S_IFCHR, 5, 0);
	/* Mount the filesystem */
	add_inode(current_task->thread->root, devfs_root);
#if CONFIG_MODULES
	add_kernel_symbol(devfs_add);
	add_kernel_symbol(devfs_remove);
#endif
}
Esempio n. 4
0
struct dirent *vfs_dirent_create(struct inode *node)
{
	struct dirent *d = kmalloc(sizeof(struct dirent));
	rwlock_create(&d->lock);
	d->parent = node;
	d->filesystem = node->filesystem;
	return d;
}
Esempio n. 5
0
struct inode *vfs_inode_create (void)
{
	struct inode *node = kmalloc(sizeof(struct inode));
	rwlock_create(&node->lock);
	rwlock_create(&node->metalock);
	mutex_create(&node->mappings_lock, 0);

	hash_create(&node->dirents, 0, 1000);

	node->flags = INODE_INUSE;
	linkedlist_insert(ic_inuse, &node->inuse_item, node);

	blocklist_create(&node->readblock, 0, "inode-read");
	blocklist_create(&node->writeblock, 0, "inode-write");

	return node;
}
Esempio n. 6
0
struct inode *set_as_kernel_task(char *name)
{
	struct inode *i = (struct inode *)kmalloc(sizeof(struct inode));
	rwlock_create(&i->rwl);
	strncpy(i->name, name, INAME_LEN);
	add_inode(kproclist, i);
	raise_flag(TF_KTASK);
	strncpy((char *)current_task->command, name, 128);
	printk(1, "[kernel]: Added '%s' as kernel task\n", name);
	return i;
}
Esempio n. 7
0
int init_kern_task()
{
	kproclist = (struct inode *)kmalloc(sizeof(struct inode));
	_strcpy(kproclist->name, "kproclist");
	kproclist->mode = S_IFDIR | 0xFFF;
	kproclist->count=1;
	kproclist->dev = 256*3;
	rwlock_create(&kproclist->rwl);
#if CONFIG_MODULES
	_add_kernel_symbol((addr_t)(struct inode **)&kproclist, "kproclist");
#endif
	return 0;
}
Esempio n. 8
0
struct inode *devfs_create(struct inode *base, char *name, mode_t mode)
{
	struct inode *i;
	i = (struct inode*)kmalloc(sizeof(struct inode));
	strncpy(i->name, name, INAME_LEN);
	i->i_ops = &devfs_inode_ops;
	i->parent = devfs_root;
	i->mode = mode | 0x1FF;
	i->num = add_atomic(&devfs_nodescount, 1);
	rwlock_create(&i->rwl);
	add_inode(base, i);
	return i;
}
Esempio n. 9
0
static
void
inititems(void)
{
	if (testsem==NULL) {
		testsem = sem_create("testsem", 2);
		if (testsem == NULL) {
			panic("synchtest: sem_create failed\n");
		}
	}
	if (testlock==NULL) {
		testlock = lock_create("testlock");
		if (testlock == NULL) {
			panic("synchtest: lock_create failed\n");
		}
	}
	if (testcv==NULL) {
		testcv = cv_create("testlock");
		if (testcv == NULL) {
			panic("synchtest: cv_create failed\n");
		}
	}
	if (donesem==NULL) {
		donesem = sem_create("donesem", 0);
		if (donesem == NULL) {
			panic("synchtest: sem_create failed\n");
		}
	}
	if (testrwlock==NULL) {
		testrwlock = rwlock_create("testrwlock");
		if(testrwlock == NULL){
			panic("synchtest: rwlock_create failed\n");
		}
	}
/*	if (testreaderlock==NULL) {
		testreaderlock = rwlock_create("testreaderlock");
		if(testreaderlock == NULL){
			panic("synchtest: rwlock_create failed\n");
		}
	}
	if (testwriterlock==NULL) {
		testwriterlock = rwlock_create("testwriterlock");
		if(testwriterlock == NULL){
			panic("synchtest: rwlock_create failed\n");
		}
	}*/
}
Esempio n. 10
0
cache_t *get_empty_cache(int (*sync)(struct ce_t *), char *name)
{
	cache_t *c = (void *)kmalloc(sizeof(cache_t));
	c->sync = sync;
	c->syncing=0;
	c->dirty=0;
	c->rwl = rwlock_create(0);
	c->count=0;
	c->slow=1000;
	c->hash = chash_create(100000);
	strncpy(c->name, name, 32);
	ll_create(&c->dirty_ll);
	ll_create(&c->primary_ll);
	ll_insert(cache_list, c);
	
	printk(0, "[cache]: Allocated new cache '%s'\n", name);
	return c;
}
Esempio n. 11
0
/*
static
void writerthread(void *junk, unsigned long num) {
    (void)junk;
    rwlock_acquire_write(testrwlock);
    random_yielder(4);
    testval1++;
    kprintf_n("Thread %lu: Writer val:%lu\n", num, testval1);
    random_yielder(4);
    rwlock_release_write(testrwlock);
    V(donesem);
    return;
}*/
int 
rwtest(int nargs, char **args) 
{
	(void)nargs;
	(void)args;

    int i, result;

	kprintf_n("Starting rwt1...\n");
    for (i=0; i<CREATELOOPS; i++) {
        kprintf_t(".");
        testrwlock = rwlock_create("testreaderwriterlock");
        if (testrwlock == NULL) {
            panic("rwt1: rwlock_create failed\n");
        }
        donesem = sem_create("donesem", 0);
        if (donesem == NULL) {
            panic("rtw1: sem_create failed\n");
        }
        if(i != CREATELOOPS -1) {
            rwlock_destroy(testrwlock);
            sem_destroy(donesem);
        }
    }
    spinlock_init(&status_lock);
    test_status = TEST161_SUCCESS;

    testval1 = 0;
    // create threads code
    for (i=0; i<NUMREADERS1; i++) {
        kprintf_t(".");
        result = thread_fork("rwlockstest", NULL, readerthread, NULL, i);
        if(result) {
            panic("rwt1: thread_fork failed: %s\n", strerror(result));
        }
    }

    /* for (i=0; i<NUMWRITERS1; i++) {
        kprintf_t(".");
        result = thread_fork("rwlockstest", NULL, writerthread, NULL, i);
        if(result) {
            panic("rwt1: thread_fork failed: %s\n", strerror(result));
        }
*/   	
	kprintf("%d\n", i); 
	int numthreads =  NUMREADERS1;
	for(i=0; i<numthreads; i++) {
		kprintf_t(".");
		P(donesem);
	}

	rwlock_destroy(testrwlock);
	sem_destroy(donesem);
	testrwlock = NULL;
	donesem = NULL;

	kprintf_n("\n");
	kprintf_n("\n");
	success(TEST161_FAIL, SECRET, "rwt1");

	return 0;
}