Remoto - VFS: VFS_thread Class Reference
Remoto - VFS

A thread interface for creating multithreaded applications. More...

#include <VFS_thread.h>

Inheritance diagram for VFS_thread:
VFS_node

Public Slots

void defunct ()
 When a thread is complete, it will emit finished(), which will trigger this slot. More...
 
virtual void executeRequest (VFS_request *t)
 Execute the VFS_request. More...
 
virtual void subtreeRequest (VFS_request *t)
 Subclass implementation of VFS_node::subtreeRequest() More...
 
- Public Slots inherited from VFS_node
virtual void applyDiff (VFS_request *r)
 Apply a diff received via subscription. More...
 
virtual void executeRequest (VFS_request *t)
 Based on the VFS_request::requestType, execute the function associated with an operation. More...
 
void notifySubscribers (VFS_node *origin, VFS_request *t)
 Propagate a diff to subscribers. More...
 
virtual void receiveResponse (VFS_request *t)
 Once a VFS_request has been completed, a response will be issued back to its _origin. More...
 
void remove (bool andDelete)
 Remove a child node. More...
 
virtual void remove (VFS_node *node=nullptr, QString *name=nullptr, QString user="server")
 Remove a child node from this node. More...
 
virtual void subtreeRequest (VFS_request *t)
 find() the target of a VFS_request, and execute the request More...
 
virtual void unsubscribeAll (VFS_node *n)
 Remove all references to a subscriber from this node. More...
 

Public Member Functions

Q_INVOKABLE VFS_thread (QDomElement nodeConfig, QVariantMap env, bool printConfig=false)
 VFS_thread constructor. More...
 
virtual ~VFS_thread ()
 VFS_thread destructor. More...
 
virtual VFS_nodeappend (QString name, VFS_node *node, bool containerCheck=true, QString user="unknown")
 A dummy entry used to warn a developer of illegal use. More...
 
virtual VFS_nodefind (VFS_request *r)
 Subclass implementation of VFS_node::find(), which is the path lookup mechanism. More...
 
bool hasNode ()
 When a thread is created, it must construct its root node to become operational. More...
 
virtual bool isContainer ()
 The container-ness of the thread node. More...
 
virtual VFS_nodemount ()
 Mount the node, and mount the thread node if it exists. More...
 
virtual VFS_nodeunmount ()
 Unmount the node and the thread node if it exists. More...
 
- Public Member Functions inherited from VFS_node
Q_INVOKABLE VFS_node ()
 The VFS_node constructor will add its instance to the VFS_node::__allNodes global node registry, observing thread safety rules. More...
 
virtual ~VFS_node ()
 VFS_node destructor. More...
 
QString className ()
 Return the class name of a node. More...
 
virtual VFS_requestcreateRequest (VFS_request::requestType type, QString path, QString user="unknown", QJsonDocument data=QJsonDocument(), QJsonObject metadata=QJsonObject(), bool dontDelete=false)
 Create a new VFS_request with this object as _origin. More...
 
VFS_nodefind (QString path)
 Find a node by string path. More...
 
VFS_nodefindChildWithName (QString name)
 Check if a child with a given name exists. More...
 
virtual QString reportDetails ()
 Additional details for a generated report. More...
 
QString uniqueChildName (QString name)
 Generate a unique child name. More...
 
virtual bool validChildName (QString name)
 Check if a node name is valid. More...
 

Static Public Member Functions

static VFS_threadfromConfig (QString configString, QVariantMap env=QVariantMap(), bool printConfig=false)
 A convenience method for creating threads. More...
 
static int threadcount ()
 Return the current thread count, mostly only useful for logging output. More...
 
- Static Public Member Functions inherited from VFS_node
static bool __isNode (VFS_node *)
 Check to see if a node is in the global registry. More...
 
static QString code (QString nodename, QString libname, QString &error)
 Fetch code or any other resource from a node. More...
 

Protected Slots

void setNode (VFS_node *node)
 Once the node is created in the new thread, this VFS_thread will keep a reference to it. More...
 

Protected Attributes

VFS_node_node
 The root VFS_node running in the new thread. More...
 
VFS_threadthread _thread
 The subclassed QThread, which will provide the event loop and actually run the thread. More...
 
- Protected Attributes inherited from VFS_node
VFS_children _children
 This node's children. More...
 
QMutex _lock
 A recursive mutex that is local to this node. More...
 
VFS_subscriptionType _subscribers
 This node's subscribers. These subscribers will receive diff notifications. More...
 

Static Private Attributes

static int _threadcount = 0
 The internal thread count, useful for debug and logging messages. More...
 

Additional Inherited Members

- Signals inherited from VFS_node
void diff (VFS_node *origin, VFS_request *t)
 Emit a diff, which will trigger notifySubscribers() for a mounted node. More...
 
void finished (bool andDelete=false)
 Emitted if a thread fails to create its node, or a node is rm()'d, or any other reason a node has completed its lifecycle. It is deleted if andDelete==true. More...
 
void mounted ()
 Emitted when a node is mount()ed. More...
 
void unmounted (VFS_node *self)
 Emitted when a node is unmount()ed. More...
 
- Protected Member Functions inherited from VFS_node
virtual void aclDefaults (VFS_request *r)
 Return default values and features associated wth this node. More...
 
void addACLDefault (QJsonObject &acl, bool value, QString description="")
 Add a default value to the acl object. More...
 
void addACLFeature (QJsonObject &acl, QString feature, bool value, QString description="")
 Add a feature to the acl object. More...
 
void addACLFeatureGroup (QJsonObject &acl, QString feature, QString group, bool value)
 Add a feature group to the acl object. More...
 
void addACLFeatureUser (QJsonObject &acl, QString feature, QString user, bool value)
 Add a feature user to the acl object. More...
 
void addACLGroup (QJsonObject &acl, QString group, bool value)
 Add a group to the acl object. More...
 
void addACLUser (QJsonObject &acl, QString user, bool value)
 Add a user to the acl object. More...
 
virtual QByteArray icon ()
 Fetch the icon for a node. More...
 
virtual void issueRequest (VFS_node *target, VFS_request *t)
 Issue a VFS_request to its target. More...
 
virtual void issueRequest (VFS_request *t)
 A convenience function. More...
 
virtual void issueResponse (VFS_request *t)
 Once a request has been completed, issue a response. More...
 
virtual void ls (VFS_request *r)
 List the contents of this node. More...
 
virtual void metadata (VFS_request *r)
 Fetch the metadata of this node. More...
 
virtual void read (VFS_request *r)
 Return the data contents of this node, or if it's a container call ls() More...
 
virtual void releaseLock (VFS_request *r)
 Release a lock on this node. More...
 
virtual void report (VFS_request *r)
 Report debugging information about the current state of this node. More...
 
virtual void requestLock (VFS_request *r)
 Request a lock on this node. More...
 
virtual void rm (VFS_request *r)
 Remove a child entry from a node, or the node itself. More...
 
virtual void submit (VFS_request *r)
 Submit a diff to a node. More...
 
virtual void subscribe (VFS_request *r)
 Add an entry to this node's _subscription list. More...
 
virtual void unsubscribe (VFS_request *r)
 Remove an entry from this node's _subscription list. More...
 
virtual void unsubscribePath (QString path)
 Unsubscribe all references to a subpath. More...
 
virtual void write (VFS_request *r)
 Write data to this node. More...
 

Detailed Description

A thread interface for creating multithreaded applications.

Any node can request to be placed on a new thread by including ‘thread='1’` in its attributes in a config file. A new thread is created and a build process is started using the config file node and its children.

Once a parent has been placed in a new thread, all children will be created and owned by that thread unless they also request a different thread. The new thread will have its own event loop and processing queue for signals and slots, and will survive as long as the created node lives and the node is mounted.

Creation is synchronized using the VFS_creator::outstanding semaphore.

See also
VFS_creator::constructNode
XML Config File(s)
VFS_httpd_browser

Definition at line 31 of file VFS_thread.h.

Constructor & Destructor Documentation

◆ VFS_thread()

VFS_thread::VFS_thread ( QDomElement  nodeConfig,
QVariantMap  env,
bool  printConfig = false 
)
explicit

VFS_thread constructor.

Parameters
nodeConfigAn XML specification for nodes to create
envThe current environment
printConfigA debug setting used to make sure contexts are correct

Creates the _thread node with the incoming config data, and creates signal/slot connections to it to maintain lifecycle. The new thread is named based on the node type and node name, which is useful in debuggers like gdb.

Definition at line 39 of file VFS_thread.cpp.

◆ ~VFS_thread()

VFS_thread::~VFS_thread ( )
virtual

VFS_thread destructor.

Will ask the thread to quit and will block until complete. The thread may complete its event queue before quitting.

Definition at line 91 of file VFS_thread.cpp.

Member Function Documentation

◆ append()

VFS_node * VFS_thread::append ( QString  name,
VFS_node node,
bool  containerCheck = true,
QString  user = "unknown" 
)
virtual

A dummy entry used to warn a developer of illegal use.

Parameters
name
node
containerCheck
user
Returns
always return null
Warning
Nodes cannot be directly append()ed to a VFS_thread. They must be created by VFS_creator using configuration data.

Reimplemented from VFS_node.

Definition at line 178 of file VFS_thread.cpp.

◆ defunct

void VFS_thread::defunct ( )
slot

When a thread is complete, it will emit finished(), which will trigger this slot.

The defunct() slot will then emit finished(), which will cause VFS_node::remove() to remove it from the tree.

The thread is considered complete when it is unmounted or removed.

Definition at line 117 of file VFS_thread.cpp.

◆ executeRequest

void VFS_thread::executeRequest ( VFS_request t)
virtualslot

Execute the VFS_request.

Parameters
tThe VFS_request object

This will always submit the request to the thread node, thus crossing the thread barrier.

Definition at line 319 of file VFS_thread.cpp.

◆ find()

VFS_node * VFS_thread::find ( VFS_request r)
virtual

Subclass implementation of VFS_node::find(), which is the path lookup mechanism.

Parameters
rThe VFS_request object
Returns
this

This method will always return this VFS_thread node. The thread node is a VFS filesystem boundary, and as such, searches must stop here and requests must be posted to the thread.

Reimplemented from VFS_node.

Definition at line 283 of file VFS_thread.cpp.

◆ fromConfig()

VFS_thread * VFS_thread::fromConfig ( QString  configString,
QVariantMap  env = QVariantMap(),
bool  printConfig = false 
)
static

A convenience method for creating threads.

Parameters
configStringAn XML string representing the thread config and potentially its children
envThe current environment
printConfigA debug setting, used to make sure contexts are correct
Returns
The new VFS_thread or null if not possible

Definition at line 68 of file VFS_thread.cpp.

◆ hasNode()

bool VFS_thread::hasNode ( )

When a thread is created, it must construct its root node to become operational.

Returns
Whether or not the root node has been set.

During the thread construction time, it can be useful to know the state of the thread.

Definition at line 248 of file VFS_thread.cpp.

◆ isContainer()

bool VFS_thread::isContainer ( )
virtual

The container-ness of the thread node.

Returns
the isContainer value of the thread node
Warning
This function directly calls isContainer() on the thread node, which may not be thread-safe if a node does something complex in its VFS_node::isContainer().

Reimplemented from VFS_node.

Definition at line 231 of file VFS_thread.cpp.

◆ mount()

VFS_node * VFS_thread::mount ( )
virtual

Mount the node, and mount the thread node if it exists.

Returns
this VFS_thread, via VFS_node::mount()

Generally the node will not exist yet, because the thread is still building it.

Reimplemented from VFS_node.

Definition at line 200 of file VFS_thread.cpp.

◆ setNode

void VFS_thread::setNode ( VFS_node node)
protectedslot

Once the node is created in the new thread, this VFS_thread will keep a reference to it.

Parameters
nodeThe new node

This reference is used to pass VFS_request information and to trigger other signals and slots.

Note that this is a pointer, and that the new node is owned by and created in the VFS_thread::_thread.

Definition at line 147 of file VFS_thread.cpp.

◆ subtreeRequest

void VFS_thread::subtreeRequest ( VFS_request t)
virtualslot

Subclass implementation of VFS_node::subtreeRequest()

Parameters
tThe VFS_request object

Unlike VFS_node::subtreeRequest(), this function will always call this node's executeRequest(), which will issue the VFS_request to the thread node, thus crossing the thread barrier.

Definition at line 299 of file VFS_thread.cpp.

◆ threadcount()

int VFS_thread::threadcount ( )
static

Return the current thread count, mostly only useful for logging output.

Returns
The threadcount

Notice that this is an internal counter, and the value returned is +1, as the first thread is numbered zero. This does not necessarily represent the total threads in use, as a node could spawn threads for doing its work.

Definition at line 132 of file VFS_thread.cpp.

◆ unmount()

VFS_node * VFS_thread::unmount ( )
virtual

Unmount the node and the thread node if it exists.

Returns
this VFS_thread, via VFS_node::unmount()

Reimplemented from VFS_node.

Definition at line 214 of file VFS_thread.cpp.

Member Data Documentation

◆ _node

VFS_node* VFS_thread::_node
protected

The root VFS_node running in the new thread.

Definition at line 54 of file VFS_thread.h.

◆ _thread

VFS_threadthread VFS_thread::_thread
protected

The subclassed QThread, which will provide the event loop and actually run the thread.

Definition at line 53 of file VFS_thread.h.

◆ _threadcount

int VFS_thread::_threadcount = 0
staticprivate

The internal thread count, useful for debug and logging messages.

Definition at line 59 of file VFS_thread.h.


The documentation for this class was generated from the following files: