Navigation


Changeset 767:c47c16436f71 in freeDiameter for tests/testfifo.c


Ignore:
Timestamp:
Oct 24, 2011, 6:43:32 AM (13 years ago)
Author:
Sebastien Decugis <sdecugis@nict.go.jp>
Branch:
default
Phase:
public
Message:

Added a limit on fifo queues to avoid memory exaustion when messages are received faster than handled

File:
1 edited

Legend:

Unmodified
Added
Removed
  • tests/testfifo.c

    r751 r767  
    111111}
    112112
     113/* The test function, to be threaded */
     114static int iter  = 0;
     115static void * test_fct2(void * data)
     116{
     117        int i;
     118        int * item;
     119        struct test_data * td = (struct test_data *) data;
     120       
     121        for (i=0; i< td->nbr; i++) {
     122                item = malloc(sizeof(int));
     123                CHECK( 1, item ? 1 : 0 );
     124                *item = i;
     125                CHECK( 0, fd_fifo_post(td->queue, &item) );
     126                iter++;
     127        }
     128       
     129        return NULL;
     130}
     131
    113132
    114133/* Main test routine */
     
    145164               
    146165                /* Create the queue */
    147                 CHECK( 0, fd_fifo_new(&queue) );
     166                CHECK( 0, fd_fifo_new(&queue, 0) );
    148167               
    149168                /* Check the count is 0 */
     
    233252               
    234253                /* Create the queue */
    235                 CHECK( 0, fd_fifo_new(&queue) );
     254                CHECK( 0, fd_fifo_new(&queue, 0) );
    236255               
    237256                /* Create the barrier */
     
    303322               
    304323                /* Create the queue */
    305                 CHECK( 0, fd_fifo_new(&queue) );
     324                CHECK( 0, fd_fifo_new(&queue, 0) );
    306325               
    307326                /* Create the barrier */
     
    370389               
    371390                /* Create the queue */
    372                 CHECK( 0, fd_fifo_new(&queue) );
     391                CHECK( 0, fd_fifo_new(&queue, 0) );
    373392               
    374393                /* Prepare the test data */
     
    442461        }
    443462       
     463        /* Test max queue limit */
     464        {
     465                struct fifo             *queue = NULL;
     466                struct test_data         td;
     467                pthread_t                th;
     468                int *                   item, i;
     469               
     470                /* Create the queue */
     471                CHECK( 0, fd_fifo_new(&queue, 10) );
     472               
     473                /* Initialize the test data structures */
     474                td.queue = queue;
     475                td.nbr = 15;
     476               
     477                CHECK( 0, pthread_create( &th, NULL, test_fct2, &td ) );
     478               
     479                usleep(1000); /* 1 millisec */
     480               
     481                CHECK( 10, iter );
     482               
     483                CHECK( 0, fd_fifo_tryget(queue, &item) );
     484                CHECK( 0, *item);
     485                free(item);
     486               
     487                usleep(1000); /* 1 millisec */
     488               
     489                CHECK( 11, iter );
     490               
     491                for (i=1; i<4; i++) {
     492                        CHECK( 0, fd_fifo_get(queue, &item) );
     493                        CHECK( i, *item);
     494                        free(item);
     495                }
     496               
     497                usleep(1000); /* 1 millisec */
     498               
     499                CHECK( 14, iter );
     500               
     501                /* fd_fifo_dump(0, "test", queue, NULL); */
     502               
     503                for (; i < td.nbr; i++) {
     504                        CHECK( 0, fd_fifo_tryget(queue, &item) );
     505                        CHECK( i, *item);
     506                        free(item);
     507                }
     508               
     509                CHECK( 0, pthread_join( th, NULL ) );
     510                CHECK( 15, iter );
     511               
     512        }
     513       
    444514        /* Delete the messages */
    445515        CHECK( 0, fd_msg_free( msg1 ) );
Note: See TracChangeset for help on using the changeset viewer.