mirror of
https://github.com/genodelabs/genode.git
synced 2025-04-29 07:19:45 +00:00
base: unify some irq_session headers
remove repos/base-*/include/irq_session headers and use only a unification from repos/base/include/irq_session first step Issue #1456
This commit is contained in:
parent
2002e1ccba
commit
e2cbc7c5b3
@ -2,6 +2,7 @@ SRC_CC += console/log_console.cc
|
|||||||
SRC_CC += cpu/cache.cc
|
SRC_CC += cpu/cache.cc
|
||||||
SRC_CC += env/env.cc env/context_area.cc env/reinitialize.cc
|
SRC_CC += env/env.cc env/context_area.cc env/reinitialize.cc
|
||||||
SRC_CC += thread/thread_start.cc
|
SRC_CC += thread/thread_start.cc
|
||||||
|
SRC_CC += irq/platform.cc
|
||||||
|
|
||||||
INC_DIR += $(BASE_DIR)/src/base/env
|
INC_DIR += $(BASE_DIR)/src/base/env
|
||||||
INC_DIR += $(REP_DIR)/include/codezero/dummies
|
INC_DIR += $(REP_DIR)/include/codezero/dummies
|
||||||
|
@ -65,6 +65,7 @@ namespace Genode {
|
|||||||
***************************/
|
***************************/
|
||||||
|
|
||||||
void wait_for_irq();
|
void wait_for_irq();
|
||||||
|
Irq_signal signal();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,3 +70,9 @@ Irq_session_component::~Irq_session_component()
|
|||||||
PERR("not yet implemented");
|
PERR("not yet implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Irq_signal Irq_session_component::signal()
|
||||||
|
{
|
||||||
|
PDBG("not implemented;");
|
||||||
|
return Irq_signal();
|
||||||
|
}
|
||||||
|
@ -10,6 +10,7 @@ SRC_CC += console/log_console.cc
|
|||||||
SRC_CC += cpu/cache.cc
|
SRC_CC += cpu/cache.cc
|
||||||
SRC_CC += env/env.cc env/context_area.cc env/reinitialize.cc
|
SRC_CC += env/env.cc env/context_area.cc env/reinitialize.cc
|
||||||
SRC_CC += thread/thread_start.cc
|
SRC_CC += thread/thread_start.cc
|
||||||
|
SRC_CC += irq/platform.cc
|
||||||
|
|
||||||
INC_DIR += $(BASE_DIR)/src/base/env
|
INC_DIR += $(BASE_DIR)/src/base/env
|
||||||
|
|
||||||
|
@ -120,3 +120,9 @@ Irq_session_component::~Irq_session_component()
|
|||||||
PERR("Implement me, immediately!");
|
PERR("Implement me, immediately!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Irq_signal Irq_session_component::signal()
|
||||||
|
{
|
||||||
|
PDBG("not implemented;");
|
||||||
|
return Irq_signal();
|
||||||
|
}
|
||||||
|
@ -11,6 +11,7 @@ SRC_CC += cpu/cache.cc
|
|||||||
SRC_CC += env/env.cc env/context_area.cc env/reinitialize.cc \
|
SRC_CC += env/env.cc env/context_area.cc env/reinitialize.cc \
|
||||||
env/cap_map_remove.cc env/cap_alloc.cc
|
env/cap_map_remove.cc env/cap_alloc.cc
|
||||||
SRC_CC += thread/thread_start.cc
|
SRC_CC += thread/thread_start.cc
|
||||||
|
SRC_CC += irq/platform.cc
|
||||||
|
|
||||||
INC_DIR += $(BASE_DIR)/src/base/env
|
INC_DIR += $(BASE_DIR)/src/base/env
|
||||||
|
|
||||||
|
@ -71,6 +71,7 @@ namespace Genode {
|
|||||||
***************************/
|
***************************/
|
||||||
|
|
||||||
void wait_for_irq();
|
void wait_for_irq();
|
||||||
|
Irq_signal signal();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -220,6 +220,13 @@ Irq_session_component::~Irq_session_component() {
|
|||||||
_proxy->remove_sharer(); }
|
_proxy->remove_sharer(); }
|
||||||
|
|
||||||
|
|
||||||
|
Irq_signal Irq_session_component::signal()
|
||||||
|
{
|
||||||
|
PDBG("not implemented;");
|
||||||
|
return Irq_signal();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***************************************
|
/***************************************
|
||||||
** Interrupt handler implemtentation **
|
** Interrupt handler implemtentation **
|
||||||
***************************************/
|
***************************************/
|
||||||
|
@ -1,62 +0,0 @@
|
|||||||
/*
|
|
||||||
* \brief Client-side IRQ session interface
|
|
||||||
* \author Martin Stein
|
|
||||||
* \date 2013-10-24
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2013 Genode Labs GmbH
|
|
||||||
*
|
|
||||||
* This file is part of the Genode OS framework, which is distributed
|
|
||||||
* under the terms of the GNU General Public License version 2.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _IRQ_SESSION__CLIENT_H_
|
|
||||||
#define _IRQ_SESSION__CLIENT_H_
|
|
||||||
|
|
||||||
/* Genode includes */
|
|
||||||
#include <irq_session/capability.h>
|
|
||||||
#include <base/rpc_client.h>
|
|
||||||
|
|
||||||
namespace Genode
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Client-side IRQ session interface
|
|
||||||
*/
|
|
||||||
struct Irq_session_client : Rpc_client<Irq_session>
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* FIXME: This is used only client-internal and could thus be protected.
|
|
||||||
*/
|
|
||||||
Irq_signal const irq_signal;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*
|
|
||||||
* \param session pointer to the session backend
|
|
||||||
*/
|
|
||||||
explicit Irq_session_client(Irq_session_capability const & session)
|
|
||||||
:
|
|
||||||
Rpc_client<Irq_session>(session),
|
|
||||||
irq_signal(signal())
|
|
||||||
{ }
|
|
||||||
|
|
||||||
|
|
||||||
/*****************
|
|
||||||
** Irq_session **
|
|
||||||
*****************/
|
|
||||||
|
|
||||||
Irq_signal signal() { return call<Rpc_signal>(); }
|
|
||||||
|
|
||||||
void wait_for_irq()
|
|
||||||
{
|
|
||||||
while (Kernel::await_signal(irq_signal.receiver_id,
|
|
||||||
irq_signal.context_id))
|
|
||||||
{
|
|
||||||
PERR("failed to receive interrupt");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* _IRQ_SESSION__CLIENT_H_ */
|
|
@ -1,82 +0,0 @@
|
|||||||
/*
|
|
||||||
* \brief IRQ session interface
|
|
||||||
* \author Martin Stein
|
|
||||||
* \date 2013-10-24
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2013 Genode Labs GmbH
|
|
||||||
*
|
|
||||||
* This file is part of the Genode OS framework, which is distributed
|
|
||||||
* under the terms of the GNU General Public License version 2.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _IRQ_SESSION__IRQ_SESSION_H_
|
|
||||||
#define _IRQ_SESSION__IRQ_SESSION_H_
|
|
||||||
|
|
||||||
/* Genode includes */
|
|
||||||
#include <base/capability.h>
|
|
||||||
#include <session/session.h>
|
|
||||||
|
|
||||||
namespace Genode
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Information that enables a user to await and ack an IRQ directly
|
|
||||||
*/
|
|
||||||
struct Irq_signal
|
|
||||||
{
|
|
||||||
unsigned receiver_id;
|
|
||||||
unsigned context_id;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* IRQ session interface
|
|
||||||
*/
|
|
||||||
struct Irq_session : Session
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Interrupt trigger
|
|
||||||
*/
|
|
||||||
enum Trigger { TRIGGER_UNCHANGED = 0, TRIGGER_LEVEL, TRIGGER_EDGE };
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Interrupt trigger polarity
|
|
||||||
*/
|
|
||||||
enum Polarity { POLARITY_UNCHANGED = 0, POLARITY_HIGH, POLARITY_LOW };
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Destructor
|
|
||||||
*/
|
|
||||||
virtual ~Irq_session() { }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Await the next occurence of the interrupt of this session
|
|
||||||
*/
|
|
||||||
virtual void wait_for_irq() = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get information for direct interrupt handling
|
|
||||||
*
|
|
||||||
* FIXME: This is used only client-internal and could thus be protected.
|
|
||||||
*/
|
|
||||||
virtual Irq_signal signal() = 0;
|
|
||||||
|
|
||||||
|
|
||||||
/*************
|
|
||||||
** Session **
|
|
||||||
*************/
|
|
||||||
|
|
||||||
static const char * service_name() { return "IRQ"; }
|
|
||||||
|
|
||||||
|
|
||||||
/*********************
|
|
||||||
** RPC declaration **
|
|
||||||
*********************/
|
|
||||||
|
|
||||||
GENODE_RPC(Rpc_wait_for_irq, void, wait_for_irq);
|
|
||||||
GENODE_RPC(Rpc_signal, Irq_signal, signal);
|
|
||||||
GENODE_RPC_INTERFACE(Rpc_wait_for_irq, Rpc_signal);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* _IRQ_SESSION__IRQ_SESSION_H_ */
|
|
@ -15,6 +15,7 @@ SRC_CC += env/context_area.cc
|
|||||||
SRC_CC += env/reinitialize.cc
|
SRC_CC += env/reinitialize.cc
|
||||||
SRC_CC += thread/thread.cc
|
SRC_CC += thread/thread.cc
|
||||||
SRC_CC += thread/start.cc
|
SRC_CC += thread/start.cc
|
||||||
|
SRC_CC += irq/platform.cc
|
||||||
|
|
||||||
# add include paths
|
# add include paths
|
||||||
INC_DIR += $(BASE_DIR)/src/base/env
|
INC_DIR += $(BASE_DIR)/src/base/env
|
||||||
|
23
repos/base-hw/src/base/irq/platform.cc
Normal file
23
repos/base-hw/src/base/irq/platform.cc
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* \brief Client-side IRQ session interface - specific for base-hw
|
||||||
|
* \author Martin Stein
|
||||||
|
* \date 2013-10-24
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2013-2015 Genode Labs GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU General Public License version 2.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <irq_session/client.h>
|
||||||
|
|
||||||
|
void Genode::Irq_session_client::wait_for_irq()
|
||||||
|
{
|
||||||
|
while (Kernel::await_signal(irq_signal.receiver_id,
|
||||||
|
irq_signal.context_id))
|
||||||
|
{
|
||||||
|
PERR("failed to receive interrupt");
|
||||||
|
}
|
||||||
|
}
|
@ -10,6 +10,7 @@ SRC_CC += console/log_console.cc
|
|||||||
SRC_CC += cpu/cache.cc
|
SRC_CC += cpu/cache.cc
|
||||||
SRC_CC += env/env.cc env/context_area.cc env/reinitialize.cc
|
SRC_CC += env/env.cc env/context_area.cc env/reinitialize.cc
|
||||||
SRC_CC += thread/thread_nova.cc
|
SRC_CC += thread/thread_nova.cc
|
||||||
|
SRC_CC += irq/platform.cc
|
||||||
|
|
||||||
INC_DIR += $(BASE_DIR)/src/base/env
|
INC_DIR += $(BASE_DIR)/src/base/env
|
||||||
|
|
||||||
|
@ -68,6 +68,7 @@ namespace Genode {
|
|||||||
***************************/
|
***************************/
|
||||||
|
|
||||||
void wait_for_irq();
|
void wait_for_irq();
|
||||||
|
Irq_signal signal();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -203,3 +203,10 @@ Irq_session_component::Irq_session_component(Cap_session *cap_session,
|
|||||||
|
|
||||||
|
|
||||||
Irq_session_component::~Irq_session_component() { }
|
Irq_session_component::~Irq_session_component() { }
|
||||||
|
|
||||||
|
|
||||||
|
Irq_signal Irq_session_component::signal()
|
||||||
|
{
|
||||||
|
PDBG("not implemented;");
|
||||||
|
return Irq_signal();
|
||||||
|
}
|
||||||
|
@ -2,6 +2,7 @@ SRC_CC += console/log_console.cc
|
|||||||
SRC_CC += cpu/cache.cc
|
SRC_CC += cpu/cache.cc
|
||||||
SRC_CC += env/env.cc env/context_area.cc env/reinitialize.cc
|
SRC_CC += env/env.cc env/context_area.cc env/reinitialize.cc
|
||||||
SRC_CC += thread/thread_start.cc
|
SRC_CC += thread/thread_start.cc
|
||||||
|
SRC_CC += irq/platform.cc
|
||||||
|
|
||||||
vpath %.cc $(REP_DIR)/src/base
|
vpath %.cc $(REP_DIR)/src/base
|
||||||
vpath %.cc $(BASE_DIR)/src/base
|
vpath %.cc $(BASE_DIR)/src/base
|
||||||
|
@ -175,3 +175,9 @@ Irq_session_component::~Irq_session_component()
|
|||||||
/* TODO del_sharer() resp. put_sharer() */
|
/* TODO del_sharer() resp. put_sharer() */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Irq_signal Irq_session_component::signal()
|
||||||
|
{
|
||||||
|
PDBG("not implemented;");
|
||||||
|
return Irq_signal();
|
||||||
|
}
|
||||||
|
@ -10,6 +10,7 @@ SRC_CC += console/log_console.cc
|
|||||||
SRC_CC += cpu/cache.cc
|
SRC_CC += cpu/cache.cc
|
||||||
SRC_CC += env/env.cc env/context_area.cc env/reinitialize.cc
|
SRC_CC += env/env.cc env/context_area.cc env/reinitialize.cc
|
||||||
SRC_CC += thread/thread_start.cc
|
SRC_CC += thread/thread_start.cc
|
||||||
|
SRC_CC += irq/platform.cc
|
||||||
|
|
||||||
INC_DIR += $(BASE_DIR)/src/base/env
|
INC_DIR += $(BASE_DIR)/src/base/env
|
||||||
|
|
||||||
|
@ -132,3 +132,9 @@ Irq_session_component::~Irq_session_component()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Irq_signal Irq_session_component::signal()
|
||||||
|
{
|
||||||
|
PDBG("not implemented;");
|
||||||
|
return Irq_signal();
|
||||||
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* \brief Client-side IRQ session interface
|
* \brief Client-side IRQ session interface
|
||||||
* \author Christian Helmuth
|
* \author Christian Helmuth
|
||||||
|
* \author Martin Stein
|
||||||
* \date 2007-09-13
|
* \date 2007-09-13
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -14,18 +15,41 @@
|
|||||||
#ifndef _INCLUDE__IRQ_SESSION__CLIENT_H_
|
#ifndef _INCLUDE__IRQ_SESSION__CLIENT_H_
|
||||||
#define _INCLUDE__IRQ_SESSION__CLIENT_H_
|
#define _INCLUDE__IRQ_SESSION__CLIENT_H_
|
||||||
|
|
||||||
|
/* Genode includes */
|
||||||
#include <irq_session/capability.h>
|
#include <irq_session/capability.h>
|
||||||
#include <base/rpc_client.h>
|
#include <base/rpc_client.h>
|
||||||
|
|
||||||
namespace Genode { struct Irq_session_client; }
|
namespace Genode { struct Irq_session_client; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Client-side IRQ session interface
|
||||||
|
*/
|
||||||
struct Genode::Irq_session_client : Rpc_client<Irq_session>
|
struct Genode::Irq_session_client : Rpc_client<Irq_session>
|
||||||
{
|
{
|
||||||
explicit Irq_session_client(Irq_session_capability session)
|
/*
|
||||||
: Rpc_client<Irq_session>(session) { }
|
* FIXME: This is used only client-internal and could thus be protected.
|
||||||
|
*/
|
||||||
|
Irq_signal const irq_signal;
|
||||||
|
|
||||||
void wait_for_irq() override { call<Rpc_wait_for_irq>(); }
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* \param session pointer to the session backend
|
||||||
|
*/
|
||||||
|
explicit Irq_session_client(Irq_session_capability const & session)
|
||||||
|
:
|
||||||
|
Rpc_client<Irq_session>(session),
|
||||||
|
irq_signal(signal())
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
/*****************
|
||||||
|
** Irq_session **
|
||||||
|
*****************/
|
||||||
|
|
||||||
|
Irq_signal signal() override { return call<Rpc_signal>(); }
|
||||||
|
|
||||||
|
void wait_for_irq() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* _INCLUDE__IRQ_SESSION__CLIENT_H_ */
|
#endif /* _INCLUDE__IRQ_SESSION__CLIENT_H_ */
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* \brief IRQ session interface
|
* \brief IRQ session interface
|
||||||
* \author Christian Helmuth
|
* \author Christian Helmuth
|
||||||
|
* \author Martin Stein
|
||||||
* \date 2007-09-13
|
* \date 2007-09-13
|
||||||
*
|
*
|
||||||
* An open IRQ session represents a valid IRQ attachment/association.
|
* An open IRQ session represents a valid IRQ attachment/association.
|
||||||
@ -12,7 +13,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2007-2013 Genode Labs GmbH
|
* Copyright (C) 2007-2015 Genode Labs GmbH
|
||||||
*
|
*
|
||||||
* This file is part of the Genode OS framework, which is distributed
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
* under the terms of the GNU General Public License version 2.
|
* under the terms of the GNU General Public License version 2.
|
||||||
@ -24,7 +25,20 @@
|
|||||||
#include <base/capability.h>
|
#include <base/capability.h>
|
||||||
#include <session/session.h>
|
#include <session/session.h>
|
||||||
|
|
||||||
namespace Genode { struct Irq_session; }
|
namespace Genode {
|
||||||
|
struct Irq_session;
|
||||||
|
struct Irq_signal;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Information that enables a user to await and ack an IRQ directly
|
||||||
|
*/
|
||||||
|
struct Genode::Irq_signal
|
||||||
|
{
|
||||||
|
unsigned receiver_id;
|
||||||
|
unsigned context_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
struct Genode::Irq_session : Session
|
struct Genode::Irq_session : Session
|
||||||
@ -39,19 +53,38 @@ struct Genode::Irq_session : Session
|
|||||||
*/
|
*/
|
||||||
enum Polarity { POLARITY_UNCHANGED = 0, POLARITY_HIGH, POLARITY_LOW };
|
enum Polarity { POLARITY_UNCHANGED = 0, POLARITY_HIGH, POLARITY_LOW };
|
||||||
|
|
||||||
static const char *service_name() { return "IRQ"; }
|
/**
|
||||||
|
* Destructor
|
||||||
|
*/
|
||||||
virtual ~Irq_session() { }
|
virtual ~Irq_session() { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Await the next occurence of the interrupt of this session
|
||||||
|
*/
|
||||||
virtual void wait_for_irq() = 0;
|
virtual void wait_for_irq() = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get information for direct interrupt handling
|
||||||
|
*
|
||||||
|
* FIXME: This is used only client-internal and could thus be protected.
|
||||||
|
*/
|
||||||
|
virtual Irq_signal signal() = 0;
|
||||||
|
|
||||||
|
|
||||||
|
/*************
|
||||||
|
** Session **
|
||||||
|
*************/
|
||||||
|
|
||||||
|
static const char * service_name() { return "IRQ"; }
|
||||||
|
|
||||||
|
|
||||||
/*********************
|
/*********************
|
||||||
** RPC declaration **
|
** RPC declaration **
|
||||||
*********************/
|
*********************/
|
||||||
|
|
||||||
GENODE_RPC(Rpc_wait_for_irq, void, wait_for_irq);
|
GENODE_RPC(Rpc_wait_for_irq, void, wait_for_irq);
|
||||||
GENODE_RPC_INTERFACE(Rpc_wait_for_irq);
|
GENODE_RPC(Rpc_signal, Irq_signal, signal);
|
||||||
|
GENODE_RPC_INTERFACE(Rpc_wait_for_irq, Rpc_signal);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* _INCLUDE__IRQ_SESSION__IRQ_SESSION_H_ */
|
#endif /* _INCLUDE__IRQ_SESSION__IRQ_SESSION_H_ */
|
||||||
|
19
repos/base/src/base/irq/platform.cc
Normal file
19
repos/base/src/base/irq/platform.cc
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* \brief Generic implementation parts of the irq framework which are
|
||||||
|
* implemented platform specifically, e.g. base-hw.
|
||||||
|
* \author Alexander Boettcher
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015 Genode Labs GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU General Public License version 2.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <irq_session/client.h>
|
||||||
|
|
||||||
|
void Genode::Irq_session_client::wait_for_irq()
|
||||||
|
{
|
||||||
|
call<Rpc_wait_for_irq>();
|
||||||
|
}
|
@ -134,6 +134,7 @@ namespace Genode {
|
|||||||
***************************/
|
***************************/
|
||||||
|
|
||||||
void wait_for_irq();
|
void wait_for_irq();
|
||||||
|
Irq_signal signal();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user