summaryrefslogtreecommitdiffstats
path: root/common/fifo.c
diff options
context:
space:
mode:
authorLaxmikant Rashinkar <LK.Rashinkar@gmail.com>2014-03-12 19:43:14 -0700
committerLaxmikant Rashinkar <LK.Rashinkar@gmail.com>2014-03-12 19:43:14 -0700
commit963b95877a8e8c515d6ae775d1f1aeab2775a863 (patch)
treef5cf631c83e73dbb2a40b5577cae3a4d640a1213 /common/fifo.c
parent8372cce84d7b507484a8cd3ececaf2935c6580f2 (diff)
downloadxrdp-proprietary-963b95877a8e8c515d6ae775d1f1aeab2775a863.tar.gz
xrdp-proprietary-963b95877a8e8c515d6ae775d1f1aeab2775a863.zip
added a FIFO implementation
Diffstat (limited to 'common/fifo.c')
-rw-r--r--common/fifo.c164
1 files changed, 164 insertions, 0 deletions
diff --git a/common/fifo.c b/common/fifo.c
new file mode 100644
index 00000000..5e94694d
--- /dev/null
+++ b/common/fifo.c
@@ -0,0 +1,164 @@
+/**
+ * xrdp: A Remote Desktop Protocol server.
+ *
+ * Copyright (C) Laxmikant Rashinkar 2004-2014
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * FIFO implementation to store pointer to data struct
+ */
+
+#include "fifo.h"
+#include "common/os_calls.h"
+
+/**
+ * Create new fifo data struct
+ *
+ * @return pointer to new FIFO or NULL if system out of memory
+ *****************************************************************************/
+
+FIFO *fifo_create()
+{
+ return (FIFO *) g_malloc(sizeof(FIFO), 1);
+}
+
+/**
+ * Delete specified FIFO
+ *****************************************************************************/
+
+void fifo_delete(FIFO *self)
+{
+ USER_DATA *udp;
+
+ if (!self)
+ return;
+
+ if (!self->head)
+ {
+ /* FIFO is empty */
+ g_free(self);
+ return;
+ }
+
+ if (self->head == self->tail)
+ {
+ /* only one item in FIFO */
+ if (self->auto_free)
+ g_free(self->head->item);
+
+ g_free(self->head);
+ g_free(self);
+ return;
+ }
+
+ /* more then one item in FIFO */
+ while (self->head)
+ {
+ udp = self->head;
+
+ if (self->auto_free)
+ g_free(udp->item);
+
+ self->head = udp->next;
+ g_free(udp);
+ }
+
+ g_free(self);
+}
+
+/**
+ * Add an item to the specified FIFO
+ *
+ * @param self FIFO to operate on
+ * @param item item to add to specified FIFO
+ *
+ * @return 0 on success, -1 on error
+ *****************************************************************************/
+
+int fifo_add_item(FIFO *self, void *item)
+{
+ USER_DATA *udp;
+
+ if (!self || !item)
+ return -1;
+
+ if ((udp = (USER_DATA *) g_malloc(sizeof(USER_DATA), 0)) == 0)
+ return -1;
+
+ udp->item = item;
+ udp->next = 0;
+
+ /* if fifo is empty, add to head */
+ if (!self->head)
+ {
+ self->head = udp;
+ self->tail = udp;
+ return 0;
+ }
+
+ /* add to tail */
+ self->tail->next = udp;
+ self->tail = udp;
+
+ return 0;
+}
+
+/**
+ * Return an item from top of FIFO
+ *
+ * @param self FIFO to operate on
+ *
+ * @return top item from FIFO or NULL if FIFO is empty
+ *****************************************************************************/
+
+void *fifo_remove_item(FIFO *self)
+{
+ void *item;
+ USER_DATA *udp;
+
+ if (!self || !self->head)
+ return 0;
+
+ if (self->head == self->tail)
+ {
+ /* only one item in FIFO */
+ item = self->head->item;
+ g_free(self->head);
+ self->head = 0;
+ self->tail = 0;
+ return item;
+ }
+
+ /* more then one item in FIFO */
+ udp = self->head;
+ item = self->head->item;
+ self->head = self->head->next;
+ g_free(udp);
+ return item;
+}
+
+/**
+ * Return FIFO status
+ *
+ * @param self FIFO to operate on
+ *
+ * @return true if FIFO is empty, false otherwise
+ *****************************************************************************/
+
+int fifo_is_empty(FIFO *self)
+{
+ if (!self)
+ return 1;
+
+ return (self->head == 0);
+}