Mercurial > hg > nginx-mail
annotate src/os/unix/ngx_gcc_atomic_amd64.h @ 112:408f195b3482 NGINX_0_3_3
nginx 0.3.3
*) Change: the "bl" and "af" parameters of the "listen" directive was
renamed to the "backlog" and "accept_filter".
*) Feature: the "rcvbuf" and "sndbuf" parameters of the "listen"
directive.
*) Change: the "$msec" log parameter does not require now the
additional the gettimeofday() system call.
*) Feature: the -t switch now tests the "listen" directives.
*) Bugfix: if the invalid address was specified in the "listen"
directive, then after the -HUP signal nginx left an open socket in
the CLOSED state.
*) Bugfix: the mime type may be incorrectly set to default value for
index file with variable in the name; bug appeared in 0.3.0.
*) Feature: the "timer_resolution" directive.
*) Feature: the millisecond "$upstream_response_time" log parameter.
*) Bugfix: a temporary file with client request body now is removed
just after the response header was transferred to a client.
*) Bugfix: OpenSSL 0.9.6 compatibility.
*) Bugfix: the SSL certificate and key file paths could not be relative.
*) Bugfix: the "ssl_prefer_server_ciphers" directive did not work in
the ngx_imap_ssl_module.
*) Bugfix: the "ssl_protocols" directive allowed to specify the single
protocol only.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Wed, 19 Oct 2005 00:00:00 +0400 |
parents | dad2fe8ecf08 |
children | df17fbafec8f |
rev | line source |
---|---|
110 | 1 |
2 /* | |
3 * Copyright (C) Igor Sysoev | |
4 */ | |
5 | |
6 | |
7 #if (NGX_SMP) | |
8 #define NGX_SMP_LOCK "lock;" | |
9 #else | |
10 #define NGX_SMP_LOCK | |
11 #endif | |
12 | |
13 | |
14 /* | |
15 * "cmpxchgq r, [m]": | |
16 * | |
17 * if (rax == [m]) { | |
18 * zf = 1; | |
19 * [m] = r; | |
20 * } else { | |
21 * zf = 0; | |
22 * rax = [m]; | |
23 * } | |
24 * | |
25 * | |
26 * The "r" is any register, %rax (%r0) - %r16. | |
27 * The "=a" and "a" are the %rax register. Although we can return result | |
28 * in any register, we use %rax because it is used in cmpxchgq anyway. | |
29 * The "cc" means that flags were changed. | |
30 */ | |
31 | |
32 static ngx_inline ngx_atomic_uint_t | |
33 ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old, | |
34 ngx_atomic_uint_t set) | |
35 { | |
36 ngx_atomic_uint_t res; | |
37 | |
38 __asm__ volatile ( | |
39 | |
40 NGX_SMP_LOCK | |
41 " cmpxchgq %3, %1; " | |
42 " setz %b0; " | |
43 " movzbq %b0, %0; " | |
44 | |
45 : "=a" (res) : "m" (*lock), "a" (old), "r" (set) : "cc", "memory"); | |
46 | |
47 return res; | |
48 } | |
49 | |
50 | |
51 /* | |
52 * "xaddq r, [m]": | |
53 * | |
54 * temp = [m]; | |
55 * [m] += r; | |
56 * r = temp; | |
57 * | |
58 * | |
59 * The "+r" is any register, %rax (%r0) - %r16. | |
60 * The "cc" means that flags were changed. | |
61 */ | |
62 | |
63 static ngx_inline ngx_atomic_int_t | |
64 ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add) | |
65 { | |
66 __asm__ volatile ( | |
67 | |
68 NGX_SMP_LOCK | |
69 " xaddq %0, %1; " | |
70 | |
71 : "+q" (add) : "m" (*value) : "cc", "memory"); | |
72 | |
73 return add; | |
74 } | |
112 | 75 |
76 | |
77 #define ngx_memory_barrier() __asm__ volatile ("" ::: "memory") |