diff options
Diffstat (limited to 'gprofng/src/ipcio.h')
-rw-r--r-- | gprofng/src/ipcio.h | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/gprofng/src/ipcio.h b/gprofng/src/ipcio.h new file mode 100644 index 00000000000..94a635e4a06 --- /dev/null +++ b/gprofng/src/ipcio.h @@ -0,0 +1,176 @@ +/* Copyright (C) 2021 Free Software Foundation, Inc. + Contributed by Oracle. + + This file is part of GNU Binutils. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* Defines the external interface between er_ipc and the routines */ + +#ifndef _IPCIO_H +#define _IPCIO_H +#include <pthread.h> +#include "gp-defs.h" +#include "StringBuilder.h" + +class DbeThreadPool; +typedef long long DbeObj; +typedef void *Object; +typedef char *String; + +#define BUFFER_SIZE_SMALL 512 +#define BUFFER_SIZE_MEDIUM 512 +#define BUFFER_SIZE_LARGE 1024*1024 + +#define REQUEST_HAS_NO_BODY 0xFFFFFFFF +#define RESPONSE_STATUS_DEFAULT 0 +#define RESPONSE_STATUS_SUCCESS 1 +#define RESPONSE_STATUS_FAILURE 2 +#define RESPONSE_STATUS_CANCELLED 3 + +#define RESPONSE_TYPE_ACK 0 +#define RESPONSE_TYPE_PROGRESS 1 +#define RESPONSE_TYPE_COMPLETE 2 +#define RESPONSE_TYPE_HANDSHAKE 3 +#define HEADER_MARKER 0xff + +#define REQUEST_TYPE_DEFAULT 0 +#define REQUEST_TYPE_CANCEL 1 +#define REQUEST_TYPE_HANDSHAKE 2 + +#define IPC_PROTOCOL_STR "IPC_PROTOCOL_38" +#define IPC_VERSION_NUMBER 38 + +enum IPCrequestStatus +{ + INITIALIZED = 0, + IN_PROGRESS, + COMPLETED, + CANCELLED_DEFAULT, + CANCELLED_IMMEDIATE +}; + +enum IPCTraceLevel +{ + TRACE_LVL_0 = 0, + TRACE_LVL_1, + TRACE_LVL_2, + TRACE_LVL_3, + TRACE_LVL_4 +}; + +class IPCrequest +{ + char *buf; + int size; + int idx; + int requestID; + int channelID; + IPCrequestStatus status; + bool cancelImmediate; +public: + IPCrequest (int, int, int); + ~IPCrequest (); + IPCrequestStatus getStatus (); + void setStatus (IPCrequestStatus); + void read (); + + int getRequestID () { return requestID; } + int getChannelID () { return channelID; } + bool isCancelImmediate () { return cancelImmediate; } + void setCancelImmediate () { cancelImmediate = true; } + char rgetc () { return buf[idx++]; } +}; + +class IPCresponse +{ +public: + IPCresponse (int sz); + ~IPCresponse (); + + int getRequestID () { return requestID; } + int getChannelID () { return channelID; } + void setRequestID (int r) { requestID = r; } + void setChannelID (int c) { channelID = c; } + void setResponseType (int r) { responseType = r; } + void setResponseStatus (int s) { responseStatus = s; } + int getCurBufSize () { return sb->capacity (); } + void sendByte (int); + void sendIVal (int); + void sendLVal (long long); + void sendDVal (double); + void sendSVal (const char *); + void sendBVal (bool); + void sendCVal (char); + void sendAVal (void*); + void print (void); + void reset (); + IPCresponse *next; + +private: + int requestID; + int channelID; + int responseType; + int responseStatus; + StringBuilder *sb; +}; + +class BufferPool +{ +public: + BufferPool (); + ~BufferPool (); + IPCresponse* getNewResponse (int); + void recycle (IPCresponse *); +private: + pthread_mutex_t p_mutex; + IPCresponse *smallBuf; + IPCresponse *largeBuf; +}; + +// Read from the wire +int readInt (IPCrequest*); +bool readBoolean (IPCrequest*); +long long readLong (IPCrequest*); +DbeObj readObject (IPCrequest*); +Object readArray (IPCrequest*); +String readString (IPCrequest*); +void readRequestHeader (); + +// write to the wire +void writeString (const char *, IPCrequest*); +void writeBoolean (bool, IPCrequest*); +void writeInt (int, IPCrequest*); +void writeChar (char, IPCrequest*); +void writeLong (long long, IPCrequest*); +void writeDouble (double, IPCrequest*); +void writeArray (void *, IPCrequest*); +void writeObject (DbeObj, IPCrequest*); +void writeResponseGeneric (int, int, int); +int setProgress (int, const char *); // Update the progress bar +int ipc_doWork (void *); // The argument is an IPCrequest + +extern int ipc_flags; +extern int ipc_single_threaded_mode; +extern DbeThreadPool *responseThreadPool; +extern DbeThreadPool *ipcThreadPool; +extern int cancelRequestedChannelID; + +void ipc_default_log (const char *fmt, ...) __attribute__ ((format (printf, 1, 2))); +void ipc_response_log (IPCTraceLevel, const char *fmt, ...) __attribute__ ((format (printf, 2, 3))); +void ipc_request_log (IPCTraceLevel, const char *fmt, ...) __attribute__ ((format (printf, 2, 3))); + +#endif |