/* Copyright (C) 2021-2023 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 #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