| /* Copyright (C) 2021-2024 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; | |
| extern int cancellableChannelID; | |
| extern int error_flag; | |
| 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 |