summaryrefslogtreecommitdiff
path: root/gprofng/src/ipcio.h
diff options
context:
space:
mode:
Diffstat (limited to 'gprofng/src/ipcio.h')
-rw-r--r--gprofng/src/ipcio.h176
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