Files
MaxScale/server/core/test/test_dcb.cc
Markus Mäkelä 45827dd433 MXS-2196: Store listener reference in DCB
By storing the reference in the DCB, the two-way dependency between the
listeners and services is severed. Now the services have no direct link to
listeners and after the destruction of a listener it will be freed once
all connections through it have closed.

Due to the fact that a listener itself has a DCB that must point to a
valid listener, a self-reference is stored in the listener DCB. This is
extremely confusing and is only here to keep the code functional until the
DCB part of the listener can be factored out.
2018-12-04 11:50:43 +02:00

81 lines
1.9 KiB
C++

/*
* Copyright (c) 2016 MariaDB Corporation Ab
*
* Use of this software is governed by the Business Source License included
* in the LICENSE.TXT file and at www.mariadb.com/bsl11.
*
* Change Date: 2022-01-01
*
* On the date above, in accordance with the Business Source License, use
* of this software will be governed by version 2 or later of the General
* Public License.
*/
/**
*
* @verbatim
* Revision History
*
* Date Who Description
* 05-09-2014 Martin Brampton Initial implementation
*
* @endverbatim
*/
// To ensure that ss_info_assert asserts also when builing in non-debug mode.
#if !defined (SS_DEBUG)
#define SS_DEBUG
#endif
#if defined (NDEBUG)
#undef NDEBUG
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <maxscale/config.hh>
#include <maxscale/listener.hh>
#include <maxscale/routingworker.hh>
#include "../dcb.cc"
#include "test_utils.h"
/**
* test1 Allocate a dcb and do lots of other things
*
*/
static int test1()
{
DCB* dcb;
/* Single buffer tests */
fprintf(stderr, "testdcb : creating buffer with type DCB_ROLE_INTERNAL");
dcb = dcb_alloc(DCB_ROLE_INTERNAL, nullptr, nullptr);
printDCB(dcb);
fprintf(stderr, "\t..done\nAllocated dcb.");
// TODO: Without running workers, the following will hang. As it does not
// TODO: really add value (the only created dcb is the one above), we'll
// TODO: exclude it.
// TODO: Some kind of test environment with workers would be needed.
// printAllDCBs();
fprintf(stderr, "\t..done\n");
dcb->state = DCB_STATE_POLLING;
this_thread.current_dcb = dcb;
dcb_close(dcb);
fprintf(stderr, "Freed original dcb");
fprintf(stderr, "\t..done\n");
return 0;
}
int main(int argc, char** argv)
{
int result = 0;
init_test_env(NULL);
result += test1();
exit(result);
}