Exemple #1
0
static gboolean
test_decr_wait(void)
{
    GThread *th;
    struct test_decr_wait_data data = { NULL, FALSE };
    int rv;

    data.sem = semaphore_new_with_value(10),

    th = g_thread_create(test_decr_wait_thread, (gpointer)&data, TRUE, NULL);

    /* sleep to give semaphore_decrement() a chance to block (or not). */
    g_usleep(G_USEC_PER_SEC / 4);

    /* and then increment the semaphore enough that the decrement can succeed */
    data.increment_called = TRUE;
    semaphore_increment(data.sem, 10);

    /* join the thread and see how it fared. */
    rv = GPOINTER_TO_INT(g_thread_join(th));

    semaphore_free(data.sem);

    return (rv == 1);
}
Exemple #2
0
static gboolean
test_wait_empty(void)
{
    GThread *th;
    semaphore_t *sem = semaphore_new_with_value(10);
    int rv;

    th = g_thread_create(test_wait_empty_thread, (gpointer)sem, TRUE, NULL);

    /* sleep to give semaphore_decrement() a chance to block (or not). */
    g_usleep(G_USEC_PER_SEC / 4);

    /* add another 10, so decrement can hit zero next time it's called */
    semaphore_increment(sem, 10);

    /* and wait on the semaphore emptying */
    semaphore_wait_empty(sem);

    /* join the thread and see how it fared. */
    rv = GPOINTER_TO_INT(g_thread_join(th));

    semaphore_free(sem);

    return (rv == 1);
}
Exemple #3
0
main()
{
	SEMAPHOREP sem ;
	int rc ;
	int i ;

	sem = semaphore_open(1234) ;

	if (!sem) {
		printf("semaphore_open() failed\n") ;
		exit(1) ;
	}

	for (i = 0; i < 10; i++) {
		printf("Releasing semaphore iteration %d\n", i) ;
		rc = semaphore_increment(sem) ;
		if (! rc) {
			printf("semaphore_increment() failed\n") ;
			exit(1) ;
		}
		sleep(1) ;
	}

	rc = semaphore_destroy(sem, 0) ;
	if (! rc) {
		printf("semaphore_destroy(sem, 0) failed\n") ;
		exit(1) ;
	}

	exit(0) ;
}
Exemple #4
0
int
blockdevice_signalblockdone(BLOCKDEVICEP dev, int blocknum)
{
	int rc ;

	if (! dev) {
		return 0 ;
	}

	rc = semaphore_increment(dev->sem) ;

	return 1 ;
}
Exemple #5
0
int 
blockdevice_writeblock(BLOCKDEVICEP dev, void *block, int offset, int size, int blocknum, int waitforcomplete)
{
	int i ;
	int rc ;

	if (! dev) {
		/*printf("!dev\n") ;*/
		return -1 ;
	}

	if ((size < 0) || (offset < 0)) {
		/*printf("size < 1 %d, offset < 0 %d\n", size,offset) ;*/
		return -1 ;
	}

	if ( size > dev->blocksize ) {
		/*printf("size %d > dev->blocksize %d\n", size, dev->blocksize) ;*/
		return -1 ;
	}

	if (offset > size) {
		/*printf("offset %d > size %d\n", size, dev->blocksize) ;*/
		return -1 ;
	}

	i = find_free_block(dev->bd->datablocks, dev->numblocks) ;

	/*
	** Yay! We found a block, stuff data into it!
	*/
	dev->bd->datablocks[i].datalength = size ;
	dev->bd->datablocks[i].blocknum = blocknum ;
	dev->bd->datablocks[i].offset = offset ;
	memcpy(dev->bd->datablocks[i].data, block, size) ;

	/*
	** Signal dirty block.
	*/
	rc = semaphore_increment(dev->dirtysem) ;

	if (waitforcomplete) {
		rc = semaphore_decrement(dev->sem) ;
	}

	return size ;
}