- other threads mustn't access memory belonging to an IO job
- New IO contexts have to be registered via QueueEventContext() from other threads; Its callback are then called from whithin the event queue to start its logic.
- New HTTP-IO contexts have to be registered via QueueCurlContext()
- - once you've registered a context, you must not access its memory anymore to avoid race conditions
+ - once you've registered a context, you must not access its memory anymore to avoid race conditions.
==== Logic in event_client ====
InitIOStruct() which prepares an AsyncIO struct for later use before using QueueEventContext() to activate it.
While its ok to do _some_ requests in a row (like deleting some messages, updating messages, etc.),
loops over unknown numbers of queries should be unrolled and be done one query at a time (i.e. looking up messages in the 'already known table')
+=== Transitioning back & forth ===
+If the application logic has found that a transition is to be made from the event IO to the DB IO thread. Do so by calling DBQueueEventContext() (DB -> IO) EventQueueDBOperation() (IO->DB) and pass its return value up the row to enable the controll logic to do the actual transition for you.
eEmtyCodec
} eStreamType;
-void *StrBufNewStreamContext(eStreamType type, const char **Err);
-int StrBufDestroyStreamContext(eStreamType type, void **Stream, const char **Err);
-int StrBufStreamTranscode(eStreamType type, IOBuffer *Target, IOBuffer *In, const char* pIn, long pInLen, void *Stream, int LastChunk, const char **Err);
+typedef struct vStreamT vStreamT;
+vStreamT *StrBufNewStreamContext(eStreamType type, const char **Err);
+int StrBufDestroyStreamContext(eStreamType type, vStreamT **Stream, const char **Err);
+int StrBufStreamTranscode(eStreamType type, IOBuffer *Target, IOBuffer *In, const char* pIn, long pInLen, vStreamT *Stream, int LastChunk, const char **Err);
int StrBufDecodeBase64(StrBuf *Buf);
int StrBufDecodeBase64To(const StrBuf *BufIn, StrBuf *BufOut);
z_stream zstream;
} z_enc_stream;
-void *StrBufNewStreamContext(eStreamType type, const char **Err)
+vStreamT *StrBufNewStreamContext(eStreamType type, const char **Err)
{
base64_decodestate *state;;
*Err = NULL;
case eBase64Encode:
state = (base64_decodestate*) malloc(sizeof(base64_decodestate));
base64_init_decodestate(state);
- return state;
+ return (vStreamT*) state;
break;
case eZLibDecode:
{
err = inflateInit(&stream->zstream);
if (err != Z_OK) {
- StrBufDestroyStreamContext(type, (void**)&stream, Err);
+ StrBufDestroyStreamContext(type, (vStreamT**) &stream, Err);
*Err = zError(err);
return NULL;
}
- return stream;
+ return (vStreamT*) stream;
}
case eZLibEncode:
DEF_MEM_LEVEL,
Z_DEFAULT_STRATEGY);
if (err != Z_OK) {
- StrBufDestroyStreamContext(type, (void**) &stream, Err);
+ StrBufDestroyStreamContext(type, (vStreamT**) &stream, Err);
*Err = zError(err);
return NULL;
}
- return stream;
+ return (vStreamT*) stream;
}
case eEmtyCodec:
/// TODO
return NULL;
}
-int StrBufDestroyStreamContext(eStreamType type, void **vStream, const char **Err)
+int StrBufDestroyStreamContext(eStreamType type, vStreamT **vStream, const char **Err)
{
int err;
int rc = 0;
return rc;
}
-int StrBufStreamTranscode(eStreamType type, IOBuffer *Target, IOBuffer *In, const char* pIn, long pInLen, void *vStream, int LastChunk, const char **Err)
+int StrBufStreamTranscode(eStreamType type, IOBuffer *Target, IOBuffer *In, const char* pIn, long pInLen, vStreamT *vStream, int LastChunk, const char **Err)
{
int rc = 0;
switch (type)
StrBuf *BufHeader = NULL;
StrBuf *Buf;
StrBuf *pBuf = NULL;
- void *SC = NULL;
+ vStreamT *SC = NULL;
IOBuffer ReadBuffer;
IOBuffer WriteBuffer;
FreeStrBuf(&Buf);
FreeStrBuf(&WriteBuffer.Buf);
FreeStrBuf(&BufHeader);
- if (StrBufDestroyStreamContext(eZLibEncode, SC, &Err) && Err) {
+ if (StrBufDestroyStreamContext(eZLibEncode, &SC, &Err) && Err) {
syslog(LOG_ERR, "Error while destroying stream context: %s", Err);
}
return;
FreeStrBuf(&Buf);
FreeStrBuf(&WriteBuffer.Buf);
FreeStrBuf(&BufHeader);
- StrBufDestroyStreamContext(eZLibEncode, SC, &Err);
- if (StrBufDestroyStreamContext(eZLibEncode, SC, &Err) && Err) {
+ StrBufDestroyStreamContext(eZLibEncode, &SC, &Err);
+ if (StrBufDestroyStreamContext(eZLibEncode, &SC, &Err) && Err) {
syslog(LOG_ERR, "Error while destroying stream context: %s", Err);
}
return;
}
}
- if (SC && StrBufDestroyStreamContext(eZLibEncode, SC, &Err) && Err) {
+ if (SC && StrBufDestroyStreamContext(eZLibEncode, &SC, &Err) && Err) {
syslog(LOG_ERR, "Error while destroying stream context: %s", Err);
}
FreeStrBuf(&WriteBuffer.Buf);