⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mqueue1.cxx

📁 ecos实时嵌入式操作系统
💻 CXX
字号:
/*========================================================================////      mqueue1.cxx////      Message queues tests////========================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//========================================================================//#####DESCRIPTIONBEGIN####//// Author(s):     jlarmour// Contributors:  // Date:          2000-05-12// Purpose:       This file provides tests for eCos mqueues// Description:   // Usage:         ////####DESCRIPTIONEND####////======================================================================*//* CONFIGURATION */#include <pkgconf/kernel.h>/* INCLUDES */#include <cyg/infra/cyg_type.h>      // common types and externC#include <cyg/kernel/thread.hxx>     // Cyg_Thread#include <cyg/kernel/thread.inl>// Specially avoid inlining here due to the way we abuse the mqueue// implementation by making lots and lots of calls.#define CYGPRI_KERNEL_SYNCH_MQUEUE_INLINE#include <cyg/kernel/mqueue.hxx>     // Mqueue Header#include <cyg/kernel/sema.hxx>       // semaphores#include <cyg/infra/testcase.h>      // test API// use the common kernel test magic to define 2 threads#define NTHREADS 2#include "testaux.hxx"/* GLOBALS */static char mempool[500];static size_t storedmempoollen;Cyg_Mqueue *mq;static Cyg_Binary_Semaphore t0sem, t1sem;static int calledback;/* FUNCTIONS */static intmy_memcmp(const void *m1, const void *m2, size_t n){    char *s1 = (char *)m1;    char *s2 = (char *)m2;    while (n--) {        if (*s1 != *s2)            return *s1 - *s2;        s1++;        s2++;    }    return 0;} // my_memcmp()static void *my_alloc( size_t len ){    if ( len > sizeof(mempool) )        return NULL;    storedmempoollen = len;    return &mempool[0];}static voidmy_free( void *ptr, size_t len ){    CYG_TEST_PASS_FAIL( (ptr == &mempool[0]) && (len == storedmempoollen),                         "Freed pool correctly");    mq = NULL; // invalidate}static voidcallback(Cyg_Mqueue &mq, CYG_ADDRWORD data){    calledback += (int)data;}//************************************************************************//************************************************************************static voidt0( CYG_ADDRWORD data ){    Cyg_Mqueue::qerr_t err;    char buf[35];    size_t len;    unsigned int prio;    bool b;    Cyg_Mqueue the_mq(4, 32, &my_alloc, &my_free, &err );    CYG_TEST_PASS_FAIL( Cyg_Mqueue::OK == err,                        "Create queue" );    mq = &the_mq;//------------------------------------------------------------------------    err = mq->put( "Peter piper picked", sizeof("Peter piper picked"),                   5, true );    CYG_TEST_PASS_FAIL( Cyg_Mqueue::OK == err, "Simple (put)");    t1sem.post();//------------------------------------------------------------------------    t0sem.wait();    err = mq->get( buf, &len, &prio, true );    b = (err == Cyg_Mqueue::OK);    if (b)        b = (len == sizeof("a peck of"));    if (b)        b = (prio == 100);    if (b)        b = (0 ==              my_memcmp(buf, "a peck of", sizeof("a peck of"))            );    CYG_TEST_PASS_FAIL( b, "Blocking get");//------------------------------------------------------------------------    t0sem.wait();        CYG_TEST_PASS_FAIL( 4 == mq->count(), "mq count" );    err = mq->get( buf, &len, &prio, false );    b = (err == Cyg_Mqueue::OK);    if (b)        b = (len == sizeof("pickled peppers"));    if (b)        b = (prio == 300);    if (b)        b = (0 ==              my_memcmp(buf, "pickled peppers", sizeof("pickled peppers"))            );    if (b)        b = (3 == mq->count());    CYG_TEST_PASS_FAIL( b, "Prioritized (get 1)");    err = mq->get( buf, &len, &prio, false );    b = (err == Cyg_Mqueue::OK);    if (b)        b = (len == sizeof("."));    if (b)        b = (prio == 250);    if (b)        b = (0 ==              my_memcmp(buf, ".", sizeof("."))            );    if (b)        b = (2 == mq->count());    CYG_TEST_PASS_FAIL( b, "Prioritized (get 2)");    err = mq->get( buf, &len, &prio, false );    b = (err == Cyg_Mqueue::OK);    if (b)        b = (len == 1);    if (b)        b = (prio == 225);    if (b)        b = (0 ==              my_memcmp(buf, "", 1)            );    if (b)        b = (1 == mq->count());    CYG_TEST_PASS_FAIL( b, "Prioritized (get 3)");    err = mq->get( buf, &len, &prio, false );    b = (err == Cyg_Mqueue::OK);    if (b)        b = (len == sizeof("If Peter"));    if (b)        b = (prio == 200);    if (b)        b = (0 ==              my_memcmp(buf, "If Peter", sizeof("If Peter"))            );    if (b)        b = (0 == mq->count());    CYG_TEST_PASS_FAIL( b, "Prioritized (get 4)");//------------------------------------------------------------------------    err = mq->get( buf, &len, &prio, false );    CYG_TEST_PASS_FAIL( Cyg_Mqueue::WOULDBLOCK == err,                        "Non-blocking get of empty queue" );//------------------------------------------------------------------------        Cyg_Mqueue::callback_fn_t oldcallback;        oldcallback = mq->setnotify( &callback, (CYG_ADDRWORD) 42 );        err = mq->put( "If Peter", sizeof("If Peter"),                   200, false );    CYG_TEST_PASS_FAIL( Cyg_Mqueue::OK == err,                        "Prioritized (put in empty queue)");    CYG_TEST_PASS_FAIL( 42 == calledback, "callback" );    CYG_TEST_PASS_FAIL( NULL == oldcallback, "oldcallback" );    err = mq->get( buf, &len, &prio, false );    b = (err == Cyg_Mqueue::OK);    if (b)        b = (len == sizeof("If Peter"));    if (b)        b = (prio == 200);    if (b)        b = (0 ==              my_memcmp(buf, "If Peter", sizeof("If Peter"))            );    CYG_TEST_PASS_FAIL( b, "Prioritized (get 2)");    t1sem.post();    err = mq->get( buf, &len, &prio, true );    b = (err == Cyg_Mqueue::OK);    if (b)        b = (len == 32);    if (b)        b = (42 == calledback);    if (b)        b = (prio == 250);    if (b)        b = (0 ==              my_memcmp(buf, "12345678901234567890123456789012", 32)            );    CYG_TEST_PASS_FAIL( b, "callback (blocked wait)");//------------------------------------------------------------------------        t1sem.post();    t0sem.wait();} // t0()//************************************************************************//************************************************************************static voidt1( CYG_ADDRWORD data ){    Cyg_Mqueue::qerr_t err;    char buf[35];    size_t len;    unsigned int prio;    bool b;//------------------------------------------------------------------------    // wait till t0 says we can go    t1sem.wait();    err = mq->get( buf, &len, &prio, true );    b = (err == Cyg_Mqueue::OK);    if (b)        b = (len == sizeof("Peter piper picked"));    if (b)        b = (prio == 5);    if (b)        b = (0 ==              my_memcmp(buf, "Peter piper picked", sizeof("Peter piper picked"))            );    CYG_TEST_PASS_FAIL( b, "Simple");//------------------------------------------------------------------------        t0sem.post();         // t0 should run straight away    Cyg_Thread::yield();  // but just in case we have a funny sched    // by now t0 is blocked in mq->get    err = mq->put( "a peck of", sizeof("a peck of"),                   100, false );    CYG_TEST_PASS_FAIL( Cyg_Mqueue::OK == err, "Block (put in empty queue)");//------------------------------------------------------------------------        err = mq->put( "If Peter", sizeof("If Peter"),                   200, false );    CYG_TEST_PASS_FAIL( Cyg_Mqueue::OK == err,                        "Prioritized (put in empty queue)");    err = mq->put( "pickled peppers", sizeof("pickled peppers"),                   300, false );    CYG_TEST_PASS_FAIL( Cyg_Mqueue::OK == err,                        "Prioritized (put in queue w/1)");    err = mq->put( ".", sizeof("."), 250, false );    CYG_TEST_PASS_FAIL( Cyg_Mqueue::OK == err,                        "Prioritized (put in queue w/2)");    err = mq->put( "", 1, 225, false );    CYG_TEST_PASS_FAIL( Cyg_Mqueue::OK == err,                        "Prioritized (put in queue w/3)");    err = mq->put( "foobar", 6, 1, false );    CYG_TEST_PASS_FAIL( Cyg_Mqueue::WOULDBLOCK == err,                        "Prioritized (full queue)");    t0sem.post();//------------------------------------------------------------------------        t1sem.wait();    Cyg_Thread::yield();  // but just in case we have a funny sched        err = mq->put( "12345678901234567890123456789012xxxx", 32,                   250, false );    CYG_TEST_PASS_FAIL( Cyg_Mqueue::OK == err,                        "callback (put in queue)");//------------------------------------------------------------------------        t1sem.wait();    // Create an oversized queue    {        Cyg_Mqueue huge_mq(99999, 99999, &my_alloc, &my_free, &err );        CYG_TEST_PASS_FAIL( Cyg_Mqueue::NOMEM == err,                            "Oversized queue rejected" );        // and it now gets destructed - but that shouldn't call free        // to be called    }//------------------------------------------------------------------------        t0sem.post();         // t0 should run straight away    Cyg_Thread::yield();  // but just in case we have a funny sched    // check that mq was destroyed when t0 dropped off the end    CYG_TEST_PASS_FAIL( NULL == mq, "queue destroyed correctly" );        CYG_TEST_EXIT("kernel mqueue test 1");} // t1()//************************************************************************//************************************************************************externC voidcyg_user_start(void){#ifdef CYGSEM_HAL_STOP_CONSTRUCTORS_ON_FLAG    cyg_hal_invoke_constructors();#endif    CYG_TEST_INIT();    CYG_TEST_INFO( "Starting kernel mqueue test 1" );    new_thread( t0, 0);    new_thread( t1, 1);#ifdef CYGIMP_THREAD_PRIORITY    thread[0]->set_priority( 4 );    thread[1]->set_priority( 5 ); // make sure the threads execute as intended#endif} // cyg_user_start()//------------------------------------------------------------------------/* EOF mqueue1.cxx */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -