summaryrefslogtreecommitdiffstats
path: root/common/fifo.c
diff options
context:
space:
mode:
authorLaxmikant Rashinkar <lk@Ubuntu-12.04-32bit>2014-10-11 14:49:46 -0700
committerLaxmikant Rashinkar <lk@Ubuntu-12.04-32bit>2014-10-11 14:49:46 -0700
commit8c316b46b8d6b1cb3cf32165daf817030aac1a47 (patch)
tree089c5741cb2a914501e5ab28898a5c71c4c4103b /common/fifo.c
parent5b6b74577fda4bbcd0a02a585d783c59d68953da (diff)
parentbc7a6b9bc66afe4adf7c232c94e41694319d4155 (diff)
downloadxrdp-proprietary-8c316b46b8d6b1cb3cf32165daf817030aac1a47.tar.gz
xrdp-proprietary-8c316b46b8d6b1cb3cf32165daf817030aac1a47.zip
Merge branch 'devel'
Diffstat (limited to 'common/fifo.c')
-rw-r--r--common/fifo.c169
1 files changed, 169 insertions, 0 deletions
diff --git a/common/fifo.c b/common/fifo.c
new file mode 100644
index 00000000..e3f6f3bc
--- /dev/null
+++ b/common/fifo.c
@@ -0,0 +1,169 @@
+/**
+ * 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 "os_calls.h"
+
+/**
+ * Create new fifo data struct
+ *
+ * @return pointer to new FIFO or NULL if system out of memory
+ *****************************************************************************/
+
+FIFO * APP_CC
+fifo_create(void)
+{
+ return (FIFO *) g_malloc(sizeof(FIFO), 1);
+}
+
+/**
+ * Delete specified FIFO
+ *****************************************************************************/
+
+void APP_CC
+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 APP_CC
+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 * APP_CC
+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 APP_CC
+fifo_is_empty(FIFO *self)
+{
+ if (!self)
+ return 1;
+
+ return (self->head == 0);
+}