Files
libsst/Include/ZSimulation/ZNetworkRequest.hpp
2026-04-03 00:22:39 -05:00

83 lines
2.5 KiB
C++

/*
NetworkRequest.hpp
Author: Patrick Baggett <ptbaggett@762studios.com>, James Russell <jcrussell@762studios.com>
Created: 12/03/2013
Purpose:
Cancel-able network thread request, similar to ZThreadRequest, but
with more cancellation points.
Used to communicate between any other thread and the NetworkService
thread. The "payload" field contains the message's data, and the event
is used to cancel and signal when the request has been handled. For some
requests, no response is required; these are called "responseless" and
have no SST_Event object associated. Obviously, they cannot be waited on
nor canceled -- they are simply "fire and forget".
License:
Copyright 2013, 762 Studios.
*/
#ifndef __ZNETWORKREQUEST_HPP
#define __ZNETWORKREQUEST_HPP
#include <SST/SST_Concurrency.h>
class ZNetworkRequest
{
public:
// result enumeration
enum RequestResult {
RESULT_CANCELED, // nope
RESULT_FINISHED, // yep
RESULT_INPROGRESS // go away
};
// type enumeration
enum RequestType {
REQUEST_CONNECT, // connect to another simulation
REQUEST_DISCONNECT, // disconnect from a server
REQUEST_RESET, // immediately disconnect (no notice)
REQUEST_STOP_NETWORK, // stop the network thread
};
// public member variables
uint8_t Payload[64]; // generic data payload, used to input data and read results back
RequestType Type; // request type
RequestResult Result; // in progress, success, or failure
// c'tor
ZNetworkRequest(RequestType type, bool needEvent = true)
: Type(type), Result(RESULT_INPROGRESS) {
FinishedEvent = needEvent ? SST_Concurrency_CreateEvent() : NULL;
SST_Atomic_StoreRelease(&Canceled, 0);
}
// d'tor
~ZNetworkRequest() {
if (FinishedEvent) {
SST_Concurrency_DestroyEvent(FinishedEvent);
}
}
// getters
bool IsResponseless() { return (FinishedEvent == NULL); }
bool WaitFinished() { return (SST_Concurrency_WaitEvent(FinishedEvent, SST_WAIT_INFINITE) != 0); }
bool CheckFinished() { return (SST_Concurrency_WaitEvent(FinishedEvent, 0) != 0); }
void Cancel() { Canceled = 1; }
bool IsCancelPending() { return (Canceled != 0); }
// used to signal the request should be finished or canceled
void MarkFinished() { Result = RESULT_FINISHED; SST_Concurrency_SignalEvent(FinishedEvent); }
void MarkCanceled() { Result = RESULT_CANCELED; SST_Concurrency_SignalEvent(FinishedEvent); }
private:
SST_Event FinishedEvent; // when signaled, the request has been completed
volatile int Canceled; // when non-zero, the network thread will not attempt to process it
};
#endif