1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2/*
3 * The contents of this file are subject to the Mozilla Public
4 * License Version 1.1 (the "License"); you may not use this file
5 * except in compliance with the License. You may obtain a copy of
6 * the License at http://www.mozilla.org/MPL/
7 *
8 * Software distributed under the License is distributed on an "AS
9 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
10 * implied. See the License for the specific language governing
11 * rights and limitations under the License.
12 *
13 * The Original Code is the Netscape Portable Runtime (NSPR).
14 *
15 * The Initial Developer of the Original Code is Netscape
16 * Communications Corporation.  Portions created by Netscape are
17 * Copyright (C) 1998-2000 Netscape Communications Corporation.  All
18 * Rights Reserved.
19 *
20 * Contributor(s):
21 *
22 * Alternatively, the contents of this file may be used under the
23 * terms of the GNU General Public License Version 2 or later (the
24 * "GPL"), in which case the provisions of the GPL are applicable
25 * instead of those above.  If you wish to allow use of your
26 * version of this file only under the terms of the GPL and not to
27 * allow others to use your version of this file under the MPL,
28 * indicate your decision by deleting the provisions above and
29 * replace them with the notice and other provisions required by
30 * the GPL.  If you do not delete the provisions above, a recipient
31 * may use your version of this file under either the MPL or the
32 * GPL.
33 */
34
35/* GLOBAL FUNCTIONS:
36** DESCRIPTION:
37**     PR Atomic operations
38*/
39
40#ifndef pratom_h___
41#define pratom_h___
42
43#include "prtypes.h"
44#include "prlock.h"
45
46PR_BEGIN_EXTERN_C
47
48/*
49** FUNCTION: PR_AtomicIncrement
50** DESCRIPTION:
51**    Atomically increment a 32 bit value.
52** INPUTS:
53**    val:  a pointer to the value to increment
54** RETURN:
55**    the returned value is the result of the increment
56*/
57NSPR_API(PRInt32)	PR_AtomicIncrement(PRInt32 *val);
58
59/*
60** FUNCTION: PR_AtomicDecrement
61** DESCRIPTION:
62**    Atomically decrement a 32 bit value.
63** INPUTS:
64**    val:  a pointer to the value to decrement
65** RETURN:
66**    the returned value is the result of the decrement
67*/
68NSPR_API(PRInt32)	PR_AtomicDecrement(PRInt32 *val);
69
70/*
71** FUNCTION: PR_AtomicSet
72** DESCRIPTION:
73**    Atomically set a 32 bit value.
74** INPUTS:
75**    val: A pointer to a 32 bit value to be set
76**    newval: The newvalue to assign to val
77** RETURN:
78**    Returns the prior value
79*/
80NSPR_API(PRInt32) PR_AtomicSet(PRInt32 *val, PRInt32 newval);
81
82/*
83** FUNCTION: PR_AtomicAdd
84** DESCRIPTION:
85**    Atomically add a 32 bit value.
86** INPUTS:
87**    ptr:  a pointer to the value to increment
88**	  val:  value to be added
89** RETURN:
90**    the returned value is the result of the addition
91*/
92NSPR_API(PRInt32)	PR_AtomicAdd(PRInt32 *ptr, PRInt32 val);
93
94/*
95** LIFO linked-list (stack)
96*/
97typedef struct PRStackElemStr PRStackElem;
98
99struct PRStackElemStr {
100    PRStackElem	*prstk_elem_next;	/* next pointer MUST be at offset 0;
101									  assembly language code relies on this */
102};
103
104typedef struct PRStackStr PRStack;
105
106/*
107** FUNCTION: PR_CreateStack
108** DESCRIPTION:
109**    Create a stack, a LIFO linked list
110** INPUTS:
111**    stack_name:  a pointer to string containing the name of the stack
112** RETURN:
113**    A pointer to the created stack, if successful, else NULL.
114*/
115NSPR_API(PRStack *)	PR_CreateStack(const char *stack_name);
116
117/*
118** FUNCTION: PR_StackPush
119** DESCRIPTION:
120**    Push an element on the top of the stack
121** INPUTS:
122**    stack:		pointer to the stack
123**    stack_elem:	pointer to the stack element
124** RETURN:
125**    None
126*/
127NSPR_API(void)			PR_StackPush(PRStack *stack, PRStackElem *stack_elem);
128
129/*
130** FUNCTION: PR_StackPop
131** DESCRIPTION:
132**    Remove the element on the top of the stack
133** INPUTS:
134**    stack:		pointer to the stack
135** RETURN:
136**    A pointer to the stack element removed from the top of the stack,
137**	  if non-empty,
138**    else NULL
139*/
140NSPR_API(PRStackElem *)	PR_StackPop(PRStack *stack);
141
142/*
143** FUNCTION: PR_DestroyStack
144** DESCRIPTION:
145**    Destroy the stack
146** INPUTS:
147**    stack:		pointer to the stack
148** RETURN:
149**    PR_SUCCESS - if successfully deleted
150**	  PR_FAILURE - if the stack is not empty
151**					PR_GetError will return
152**						PR_INVALID_STATE_ERROR - stack is not empty
153*/
154NSPR_API(PRStatus)		PR_DestroyStack(PRStack *stack);
155
156PR_END_EXTERN_C
157
158#endif /* pratom_h___ */
159