176 lines
4.8 KiB
C++
176 lines
4.8 KiB
C++
/* 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
|