Remoto - VFS
|
A thread interface for creating multithreaded applications. More...
#include <VFS_thread.h>
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_node * | append (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_node * | find (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_node * | mount () |
Mount the node, and mount the thread node if it exists. More... | |
virtual VFS_node * | unmount () |
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_request * | createRequest (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_node * | find (QString path) |
Find a node by string path. More... | |
VFS_node * | findChildWithName (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_thread * | fromConfig (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... | |
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.
Definition at line 31 of file VFS_thread.h.
|
explicit |
VFS_thread constructor.
nodeConfig | An XML specification for nodes to create |
env | The current environment |
printConfig | A 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.
|
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.
|
virtual |
A dummy entry used to warn a developer of illegal use.
name | |
node | |
containerCheck | |
user |
Reimplemented from VFS_node.
Definition at line 178 of file VFS_thread.cpp.
|
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.
|
virtualslot |
Execute the VFS_request.
t | The 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.
|
virtual |
Subclass implementation of VFS_node::find(), which is the path lookup mechanism.
r | The VFS_request object |
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.
|
static |
A convenience method for creating threads.
configString | An XML string representing the thread config and potentially its children |
env | The current environment |
printConfig | A debug setting, used to make sure contexts are correct |
Definition at line 68 of file VFS_thread.cpp.
bool VFS_thread::hasNode | ( | ) |
When a thread is created, it must construct its root node to become operational.
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.
|
virtual |
The container-ness of the thread node.
Reimplemented from VFS_node.
Definition at line 231 of file VFS_thread.cpp.
|
virtual |
Mount the node, and mount the thread node if it exists.
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.
|
protectedslot |
Once the node is created in the new thread, this VFS_thread will keep a reference to it.
node | The 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.
|
virtualslot |
Subclass implementation of VFS_node::subtreeRequest()
t | The 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.
|
static |
Return the current thread count, mostly only useful for logging output.
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.
|
virtual |
Unmount the node and the thread node if it exists.
Reimplemented from VFS_node.
Definition at line 214 of file VFS_thread.cpp.
|
protected |
The root VFS_node running in the new thread.
Definition at line 54 of file VFS_thread.h.
|
protected |
The subclassed QThread, which will provide the event loop and actually run the thread.
Definition at line 53 of file VFS_thread.h.
|
staticprivate |
The internal thread count, useful for debug and logging messages.
Definition at line 59 of file VFS_thread.h.