1 /******************************************************************************* 2 3 Test for EpollSelectDispatcher.unregister behaviour 4 5 Copyright: 6 Copyright (c) 2018 dunnhumby Germany GmbH. 7 All rights reserved. 8 9 License: 10 Boost Software License Version 1.0. See LICENSE_BOOST.txt for details. 11 Alternatively, this file may be distributed under the terms of the Tango 12 3-Clause BSD License (see LICENSE_BSD.txt for details). 13 14 *******************************************************************************/ 15 16 module integrationtest.unregisterclient.main; 17 18 import ocean.meta.types.Qualifiers; 19 20 import ocean.io.select.EpollSelectDispatcher; 21 import ocean.io.select.client.SelectEvent; 22 import ocean.core.Test; 23 24 private EpollSelectDispatcher epoll; 25 26 private SelectEvent event1, event2; 27 private int count; 28 29 // Corrupts the SelectEvent object. This should make test 30 // segfault at access 31 private void corruptEventObject (SelectEvent client) 32 { 33 auto initializer = client.classinfo.initializer(); 34 35 ubyte* ptr = cast(ubyte*)client; 36 ptr[0..initializer.length] = 0; 37 } 38 39 version (unittest) {} else 40 void main(istring[] args) 41 { 42 bool handler1() 43 { 44 .count++; 45 46 // unregister and delete the other instance 47 .epoll.unregister(.event2, true); 48 corruptEventObject(.event2); 49 50 return false; 51 } 52 53 bool handler2() 54 { 55 .count++; 56 57 // unregister and delete the other instance 58 .epoll.unregister(.event1, true); 59 corruptEventObject(.event1); 60 61 return false; 62 } 63 64 .epoll = new EpollSelectDispatcher(); 65 66 .event1 = new SelectEvent(&handler1); 67 .event2 = new SelectEvent(&handler2); 68 69 .epoll.register(.event1); 70 .epoll.register(.event2); 71 72 // trigger them both 73 .event1.trigger(); 74 .event2.trigger(); 75 76 // Do a select loop 77 .epoll.eventLoop(); 78 79 // Make sure only one was handled. 80 test!("==")(.count, 1); 81 }