annotate src/os/unix/ngx_gcc_atomic_sparc64.h @ 391:1d9bef53cd8e

Range filter: late_ranges functionality. Add one more filtering point after postpone filter. This allows to serve range capable replies with subrequests. It's not as efficient as range filtering for static data (i.e. doesn't save us from reading data from disk if some filter needs them in memory), but it may save some network bandwidth for us and for our users.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 21 Jul 2008 05:33:01 +0400
parents 73e8476f9142
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
110
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
1
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
2 /*
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
4 */
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
5
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
6
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
7 /*
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
8 * "casa [r1] 0x80, r2, r0" and
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
9 * "casxa [r1] 0x80, r2, r0" do the following:
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
10 *
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
11 * if ([r1] == r2) {
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
12 * swap(r0, [r1]);
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
13 * } else {
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
14 * r0 = [r1];
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
15 * }
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
16 *
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
17 * so "r0 == r2" means that the operation was successfull.
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
18 *
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
19 *
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
20 * The "r" means the general register.
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
21 * The "+r" means the general register used for both input and output.
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
22 */
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
23
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
24
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
25 #if (NGX_PTR_SIZE == 4)
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
26 #define NGX_CASA "casa"
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
27 #else
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
28 #define NGX_CASA "casxa"
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
29 #endif
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
30
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
31
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
32 static ngx_inline ngx_atomic_uint_t
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
33 ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
34 ngx_atomic_uint_t set)
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
35 {
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
36 __asm__ volatile (
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
37
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
38 NGX_CASA " [%1] 0x80, %2, %0"
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
39
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
40 : "+r" (set) : "r" (lock), "r" (old) : "memory");
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
41
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
42 return (set == old);
126
df17fbafec8f nginx 0.3.10
Igor Sysoev <http://sysoev.ru>
parents: 112
diff changeset
43 }
110
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
44
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
45
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
46 static ngx_inline ngx_atomic_int_t
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
47 ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add)
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
48 {
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
49 ngx_atomic_uint_t old, res;
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
50
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
51 old = *value;
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
52
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
53 for ( ;; ) {
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
54
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
55 res = old + add;
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
56
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
57 __asm__ volatile (
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
58
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
59 NGX_CASA " [%1] 0x80, %2, %0"
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
60
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
61 : "+r" (res) : "r" (value), "r" (old) : "memory");
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
62
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
63 if (res == old) {
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
64 return res;
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
65 }
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
66
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
67 old = res;
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
68 }
dad2fe8ecf08 nginx 0.3.2
Igor Sysoev <http://sysoev.ru>
parents:
diff changeset
69 }
112
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
70
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
71
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
72 #if (NGX_SMP)
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
73 #define ngx_memory_barrier() \
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
74 __asm__ volatile ( \
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
75 "membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad" \
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
76 ::: "memory")
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
77 #else
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
78 #define ngx_memory_barrier() __asm__ volatile ("" ::: "memory")
408f195b3482 nginx 0.3.3
Igor Sysoev <http://sysoev.ru>
parents: 110
diff changeset
79 #endif
160
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
80
73e8476f9142 nginx 0.3.27
Igor Sysoev <http://sysoev.ru>
parents: 126
diff changeset
81 #define ngx_cpu_pause()