diff options
author | Robert Pösel <robyer@seznam.cz> | 2013-10-29 08:47:48 +0000 |
---|---|---|
committer | Robert Pösel <robyer@seznam.cz> | 2013-10-29 08:47:48 +0000 |
commit | 50421b7809c47bd95c59b4a5627e2f89c8bccfa5 (patch) | |
tree | 323784b1c0bb7c86e5df509aab310fa1404680ef /protocols/SkypeClassic/src/msgq.cpp | |
parent | 8604516498f9135ac1c4379488228d84e69a89ab (diff) |
SkypeClassic: Folders structure and project cleanup
git-svn-id: http://svn.miranda-ng.org/main/trunk@6668 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'protocols/SkypeClassic/src/msgq.cpp')
-rw-r--r-- | protocols/SkypeClassic/src/msgq.cpp | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/protocols/SkypeClassic/src/msgq.cpp b/protocols/SkypeClassic/src/msgq.cpp new file mode 100644 index 0000000000..e1ab0d1998 --- /dev/null +++ b/protocols/SkypeClassic/src/msgq.cpp @@ -0,0 +1,90 @@ +/*
+ * Implements a simple message queue for send and receive queue.
+ * We could use memlist.c, but it's not efficient
+ * enough for this purpose (would always memmove on removing first
+ * element), therefore it's implemented as tail queue.
+ */
+
+#include "skype.h"
+#include "msgq.h"
+#include "debug.h"
+
+
+void MsgQ_Init(TYP_MSGQ *q)
+{
+ TAILQ_INIT(&q->l);
+ InitializeCriticalSection (&q->cs);
+}
+
+void MsgQ_Exit(TYP_MSGQ *q)
+{
+ struct MsgQueue *ptr;
+
+ EnterCriticalSection(&q->cs);
+ while ((ptr=q->l.tqh_first) != NULL)
+ free(MsgQ_RemoveMsg(q, ptr));
+ LeaveCriticalSection(&q->cs);
+ DeleteCriticalSection (&q->cs);
+}
+
+BOOL MsgQ_Add(TYP_MSGQ *q, char *msg)
+{
+ struct MsgQueue *ptr;
+
+ if ((ptr=(struct MsgQueue*)malloc(sizeof(struct MsgQueue))) == NULL)
+ return FALSE;
+ ptr->message = _strdup(msg); // Don't forget to free!
+ ptr->tAdded = SkypeTime(NULL);
+ SkypeTime(&ptr->tReceived);
+ EnterCriticalSection(&q->cs);
+ TAILQ_INSERT_TAIL(&q->l, ptr, l);
+ //LOG (("MsgQ_Add (%s) @%lu/%ld", msg, ptr->tReceived, ptr->tAdded));
+ LeaveCriticalSection(&q->cs);
+ return TRUE;
+}
+
+char *MsgQ_RemoveMsg(TYP_MSGQ *q, struct MsgQueue *ptr)
+{
+ char *msg;
+
+ if (!ptr) return NULL;
+ EnterCriticalSection(&q->cs);
+ TAILQ_REMOVE(&q->l, ptr, l);
+ LeaveCriticalSection(&q->cs);
+ msg=ptr->message;
+ free(ptr);
+ return msg;
+}
+
+char *MsgQ_Get(TYP_MSGQ *q)
+{
+ char *msg;
+
+ msg=MsgQ_RemoveMsg(q, q->l.tqh_first);
+ return msg;
+}
+
+int MsgQ_CollectGarbage(TYP_MSGQ *q, time_t age)
+{
+ struct MsgQueue *ptr;
+ int i=0;
+
+ EnterCriticalSection(&q->cs);
+ ptr=q->l.tqh_first;
+ while (ptr)
+ {
+ if (ptr->tAdded && SkypeTime(NULL)-ptr->tAdded>age)
+ {
+ struct MsgQueue *ptr_;
+ LOG(("GarbageCollector throwing out message: %s", ptr->message));
+ ptr_=ptr;
+ ptr=ptr->l.tqe_next;
+ free(MsgQ_RemoveMsg(q, ptr_));
+ i++;
+ continue;
+ }
+ ptr=ptr->l.tqe_next;
+ }
+ LeaveCriticalSection(&q->cs);
+ return i;
+}
|