Serenity Operating System
at hosted 84 lines 2.8 kB view raw
1/* 2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, this 9 * list of conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright notice, 12 * this list of conditions and the following disclaimer in the documentation 13 * and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 21 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 22 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 23 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27#include "PTYMultiplexer.h" 28#include "MasterPTY.h" 29#include <Kernel/FileSystem/FileDescription.h> 30#include <Kernel/Process.h> 31#include <LibC/errno_numbers.h> 32 33//#define PTMX_DEBUG 34 35namespace Kernel { 36 37static const unsigned s_max_pty_pairs = 8; 38static PTYMultiplexer* s_the; 39 40PTYMultiplexer& PTYMultiplexer::the() 41{ 42 ASSERT(s_the); 43 return *s_the; 44} 45 46PTYMultiplexer::PTYMultiplexer() 47 : CharacterDevice(5, 2) 48{ 49 s_the = this; 50 m_freelist.ensure_capacity(s_max_pty_pairs); 51 for (int i = s_max_pty_pairs; i > 0; --i) 52 m_freelist.unchecked_append(i - 1); 53} 54 55PTYMultiplexer::~PTYMultiplexer() 56{ 57} 58 59KResultOr<NonnullRefPtr<FileDescription>> PTYMultiplexer::open(int options) 60{ 61 LOCKER(m_lock); 62 if (m_freelist.is_empty()) 63 return KResult(-EBUSY); 64 auto master_index = m_freelist.take_last(); 65 auto master = adopt(*new MasterPTY(master_index)); 66#ifdef PTMX_DEBUG 67 dbg() << "PTYMultiplexer::open: Vending master " << master->index(); 68#endif 69 auto description = FileDescription::create(move(master)); 70 description->set_rw_mode(options); 71 description->set_file_flags(options); 72 return description; 73} 74 75void PTYMultiplexer::notify_master_destroyed(Badge<MasterPTY>, unsigned index) 76{ 77 LOCKER(m_lock); 78 m_freelist.append(index); 79#ifdef PTMX_DEBUG 80 dbg() << "PTYMultiplexer: " << index << " added to freelist"; 81#endif 82} 83 84}