1     os_message* CreateMessage(void* message)
2     {
3         os_message* temp_message;
4
5         temp_message = (os_thread*)g_freemessages;
6
7         if (temp_message == NULL) return -1;
8
9         // pop a free thread from the list
10        g_freemessages = temp_message->next;
11
12        // push the free thread on the used threads list
13        temp_message->next = g_usedmessages;
14        g_usedmessages = temp_message;
15
16        temp_message->message = message;
17
18        return temp_message;
19    }
20    void FreeMessage(os_message* message)
21    {
22        // message should always equal g_usedmessage since its a queue
23        g_usedmessages = message->next;
24
25        message->next = g_freemessages;
26        g_freemessages = message;
27    }
28    void SendMessage(os_thread* thread, void* message)
29    {
30        os_message* temp_message;
31
32        if (thread != NULL)
33        {
34            if (thread->message == NULL)
35            {
36                thread->message = CreateMessage(message);
37                temp_message = thread->message;
38            }
39            else
40            {
41                temp_message = thread->message;
42                while (temp_message->next != NULL)
43                {
44                    temp_message = temp_message->next;
45                }
46                temp_message->next = CreateMessage(message);
47            }
48        }
49    }
50    void* ReceiveMessage(os_thread* thread)
51    {
52        os_message* temp_message;
53        void* msgVal;
54
55        if (thread != NULL)
56        {
57            if (thread->message != NULL)
58            {
59                temp_message = thread->message;
60                msgVal = temp_message->message;
61
62                thread->message = temp_message->next;
63                FreeMessage(temp_message);
64
65                return msgVal;
66            }
67        }
68        return NULL;
69    }