nutcracker 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +22 -0
- data/Rakefile +55 -0
- data/bin/nutcracker +2 -0
- data/ext/nutcracker/ChangeLog +66 -0
- data/ext/nutcracker/LICENSE +177 -0
- data/ext/nutcracker/Makefile.am +7 -0
- data/ext/nutcracker/Makefile.in +726 -0
- data/ext/nutcracker/NOTICE +124 -0
- data/ext/nutcracker/README.md +240 -0
- data/ext/nutcracker/aclocal.m4 +956 -0
- data/ext/nutcracker/conf/nutcracker.leaf.yml +10 -0
- data/ext/nutcracker/conf/nutcracker.root.yml +8 -0
- data/ext/nutcracker/conf/nutcracker.yml +67 -0
- data/ext/nutcracker/config.h.in +316 -0
- data/ext/nutcracker/config/config.guess +1561 -0
- data/ext/nutcracker/config/config.sub +1686 -0
- data/ext/nutcracker/config/depcomp +630 -0
- data/ext/nutcracker/config/install-sh +520 -0
- data/ext/nutcracker/config/ltmain.sh +8413 -0
- data/ext/nutcracker/config/missing +376 -0
- data/ext/nutcracker/configure +18862 -0
- data/ext/nutcracker/configure.ac +155 -0
- data/ext/nutcracker/contrib/Makefile.am +3 -0
- data/ext/nutcracker/contrib/Makefile.in +560 -0
- data/ext/nutcracker/contrib/yaml-0.1.4.tar.gz +0 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/LICENSE +19 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/Makefile.am +20 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/Makefile.in +736 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/README +27 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/aclocal.m4 +956 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/config.h.in +80 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/config/config.guess +1561 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/config/config.sub +1686 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/config/depcomp +630 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/config/install-sh +520 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/config/ltmain.sh +8406 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/config/missing +376 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/configure +13085 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/configure.ac +75 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/doc/doxygen.cfg +222 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/include/yaml.h +1971 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/m4/libtool.m4 +7357 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/m4/ltoptions.m4 +368 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/m4/ltsugar.m4 +123 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/m4/ltversion.m4 +23 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/m4/lt~obsolete.m4 +92 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/src/Makefile.am +4 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/src/Makefile.in +484 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/src/api.c +1392 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/src/dumper.c +394 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/src/emitter.c +2329 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/src/loader.c +432 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/src/parser.c +1374 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/src/reader.c +465 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/src/scanner.c +3570 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/src/writer.c +141 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/src/yaml_private.h +640 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/tests/Makefile.am +8 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/tests/Makefile.in +675 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/tests/example-deconstructor-alt.c +800 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/tests/example-deconstructor.c +1130 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/tests/example-reformatter-alt.c +217 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/tests/example-reformatter.c +202 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-dumper.c +311 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-emitter.c +327 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-loader.c +63 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-parser.c +63 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-scanner.c +63 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/tests/test-reader.c +354 -0
- data/ext/nutcracker/contrib/yaml-0.1.4/tests/test-version.c +29 -0
- data/ext/nutcracker/extconf.rb +5 -0
- data/ext/nutcracker/m4/libtool.m4 +7376 -0
- data/ext/nutcracker/m4/ltoptions.m4 +368 -0
- data/ext/nutcracker/m4/ltsugar.m4 +123 -0
- data/ext/nutcracker/m4/ltversion.m4 +23 -0
- data/ext/nutcracker/m4/lt~obsolete.m4 +92 -0
- data/ext/nutcracker/notes/c-styleguide.txt +425 -0
- data/ext/nutcracker/notes/debug.txt +96 -0
- data/ext/nutcracker/notes/memcache.txt +123 -0
- data/ext/nutcracker/notes/recommendation.md +118 -0
- data/ext/nutcracker/notes/redis.md +415 -0
- data/ext/nutcracker/notes/socket.txt +131 -0
- data/ext/nutcracker/scripts/multi_get.sh +26 -0
- data/ext/nutcracker/scripts/nutcracker.init +73 -0
- data/ext/nutcracker/scripts/nutcracker.spec +52 -0
- data/ext/nutcracker/scripts/pipelined_read.sh +23 -0
- data/ext/nutcracker/scripts/pipelined_write.sh +29 -0
- data/ext/nutcracker/scripts/populate_memcached.sh +24 -0
- data/ext/nutcracker/scripts/redis-check.py +23 -0
- data/ext/nutcracker/scripts/redis-check.sh +564 -0
- data/ext/nutcracker/src/Makefile.am +46 -0
- data/ext/nutcracker/src/Makefile.in +726 -0
- data/ext/nutcracker/src/hashkit/Makefile.am +22 -0
- data/ext/nutcracker/src/hashkit/Makefile.in +501 -0
- data/ext/nutcracker/src/hashkit/nc_crc32.c +105 -0
- data/ext/nutcracker/src/hashkit/nc_fnv.c +82 -0
- data/ext/nutcracker/src/hashkit/nc_hashkit.h +74 -0
- data/ext/nutcracker/src/hashkit/nc_hsieh.c +93 -0
- data/ext/nutcracker/src/hashkit/nc_jenkins.c +230 -0
- data/ext/nutcracker/src/hashkit/nc_ketama.c +240 -0
- data/ext/nutcracker/src/hashkit/nc_md5.c +379 -0
- data/ext/nutcracker/src/hashkit/nc_modula.c +144 -0
- data/ext/nutcracker/src/hashkit/nc_murmur.c +99 -0
- data/ext/nutcracker/src/hashkit/nc_one_at_a_time.c +51 -0
- data/ext/nutcracker/src/hashkit/nc_random.c +146 -0
- data/ext/nutcracker/src/nc.c +573 -0
- data/ext/nutcracker/src/nc_array.c +204 -0
- data/ext/nutcracker/src/nc_array.h +73 -0
- data/ext/nutcracker/src/nc_client.c +189 -0
- data/ext/nutcracker/src/nc_client.h +28 -0
- data/ext/nutcracker/src/nc_conf.c +1766 -0
- data/ext/nutcracker/src/nc_conf.h +134 -0
- data/ext/nutcracker/src/nc_connection.c +392 -0
- data/ext/nutcracker/src/nc_connection.h +99 -0
- data/ext/nutcracker/src/nc_core.c +334 -0
- data/ext/nutcracker/src/nc_core.h +131 -0
- data/ext/nutcracker/src/nc_event.c +214 -0
- data/ext/nutcracker/src/nc_event.h +39 -0
- data/ext/nutcracker/src/nc_log.c +254 -0
- data/ext/nutcracker/src/nc_log.h +120 -0
- data/ext/nutcracker/src/nc_mbuf.c +285 -0
- data/ext/nutcracker/src/nc_mbuf.h +67 -0
- data/ext/nutcracker/src/nc_message.c +828 -0
- data/ext/nutcracker/src/nc_message.h +253 -0
- data/ext/nutcracker/src/nc_proxy.c +359 -0
- data/ext/nutcracker/src/nc_proxy.h +34 -0
- data/ext/nutcracker/src/nc_queue.h +788 -0
- data/ext/nutcracker/src/nc_rbtree.c +348 -0
- data/ext/nutcracker/src/nc_rbtree.h +47 -0
- data/ext/nutcracker/src/nc_request.c +588 -0
- data/ext/nutcracker/src/nc_response.c +332 -0
- data/ext/nutcracker/src/nc_server.c +841 -0
- data/ext/nutcracker/src/nc_server.h +143 -0
- data/ext/nutcracker/src/nc_signal.c +131 -0
- data/ext/nutcracker/src/nc_signal.h +34 -0
- data/ext/nutcracker/src/nc_stats.c +1188 -0
- data/ext/nutcracker/src/nc_stats.h +206 -0
- data/ext/nutcracker/src/nc_string.c +109 -0
- data/ext/nutcracker/src/nc_string.h +112 -0
- data/ext/nutcracker/src/nc_util.c +619 -0
- data/ext/nutcracker/src/nc_util.h +214 -0
- data/ext/nutcracker/src/proto/Makefile.am +14 -0
- data/ext/nutcracker/src/proto/Makefile.in +482 -0
- data/ext/nutcracker/src/proto/nc_memcache.c +1306 -0
- data/ext/nutcracker/src/proto/nc_proto.h +155 -0
- data/ext/nutcracker/src/proto/nc_redis.c +2102 -0
- data/lib/nutcracker.rb +7 -0
- data/lib/nutcracker/version.rb +3 -0
- metadata +194 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# ltversion.m4 -- version numbers -*- Autoconf -*-
|
|
2
|
+
#
|
|
3
|
+
# Copyright (C) 2004 Free Software Foundation, Inc.
|
|
4
|
+
# Written by Scott James Remnant, 2004
|
|
5
|
+
#
|
|
6
|
+
# This file is free software; the Free Software Foundation gives
|
|
7
|
+
# unlimited permission to copy and/or distribute it, with or without
|
|
8
|
+
# modifications, as long as this notice is preserved.
|
|
9
|
+
|
|
10
|
+
# Generated from ltversion.in.
|
|
11
|
+
|
|
12
|
+
# serial 3012 ltversion.m4
|
|
13
|
+
# This file is part of GNU Libtool
|
|
14
|
+
|
|
15
|
+
m4_define([LT_PACKAGE_VERSION], [2.2.6])
|
|
16
|
+
m4_define([LT_PACKAGE_REVISION], [1.3012])
|
|
17
|
+
|
|
18
|
+
AC_DEFUN([LTVERSION_VERSION],
|
|
19
|
+
[macro_version='2.2.6'
|
|
20
|
+
macro_revision='1.3012'
|
|
21
|
+
_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
|
|
22
|
+
_LT_DECL(, macro_revision, 0)
|
|
23
|
+
])
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*-
|
|
2
|
+
#
|
|
3
|
+
# Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
|
|
4
|
+
# Written by Scott James Remnant, 2004.
|
|
5
|
+
#
|
|
6
|
+
# This file is free software; the Free Software Foundation gives
|
|
7
|
+
# unlimited permission to copy and/or distribute it, with or without
|
|
8
|
+
# modifications, as long as this notice is preserved.
|
|
9
|
+
|
|
10
|
+
# serial 4 lt~obsolete.m4
|
|
11
|
+
|
|
12
|
+
# These exist entirely to fool aclocal when bootstrapping libtool.
|
|
13
|
+
#
|
|
14
|
+
# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
|
|
15
|
+
# which have later been changed to m4_define as they aren't part of the
|
|
16
|
+
# exported API, or moved to Autoconf or Automake where they belong.
|
|
17
|
+
#
|
|
18
|
+
# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN
|
|
19
|
+
# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
|
|
20
|
+
# using a macro with the same name in our local m4/libtool.m4 it'll
|
|
21
|
+
# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
|
|
22
|
+
# and doesn't know about Autoconf macros at all.)
|
|
23
|
+
#
|
|
24
|
+
# So we provide this file, which has a silly filename so it's always
|
|
25
|
+
# included after everything else. This provides aclocal with the
|
|
26
|
+
# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
|
|
27
|
+
# because those macros already exist, or will be overwritten later.
|
|
28
|
+
# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6.
|
|
29
|
+
#
|
|
30
|
+
# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
|
|
31
|
+
# Yes, that means every name once taken will need to remain here until
|
|
32
|
+
# we give up compatibility with versions before 1.7, at which point
|
|
33
|
+
# we need to keep only those names which we still refer to.
|
|
34
|
+
|
|
35
|
+
# This is to help aclocal find these macros, as it can't see m4_define.
|
|
36
|
+
AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
|
|
37
|
+
|
|
38
|
+
m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
|
|
39
|
+
m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])])
|
|
40
|
+
m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
|
|
41
|
+
m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])])
|
|
42
|
+
m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
|
|
43
|
+
m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])])
|
|
44
|
+
m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])])
|
|
45
|
+
m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
|
|
46
|
+
m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])])
|
|
47
|
+
m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])])
|
|
48
|
+
m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])])
|
|
49
|
+
m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
|
|
50
|
+
m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
|
|
51
|
+
m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
|
|
52
|
+
m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
|
|
53
|
+
m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])])
|
|
54
|
+
m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])])
|
|
55
|
+
m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
|
|
56
|
+
m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
|
|
57
|
+
m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])])
|
|
58
|
+
m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])])
|
|
59
|
+
m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
|
|
60
|
+
m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
|
|
61
|
+
m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
|
|
62
|
+
m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
|
|
63
|
+
m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
|
|
64
|
+
m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
|
|
65
|
+
m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
|
|
66
|
+
m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])])
|
|
67
|
+
m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])])
|
|
68
|
+
m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])])
|
|
69
|
+
m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
|
|
70
|
+
m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])])
|
|
71
|
+
m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])])
|
|
72
|
+
m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])])
|
|
73
|
+
m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])])
|
|
74
|
+
m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
|
|
75
|
+
m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])])
|
|
76
|
+
m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
|
|
77
|
+
m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])])
|
|
78
|
+
m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])])
|
|
79
|
+
m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])])
|
|
80
|
+
m4_ifndef([AC_LIBTOOL_RC], [AC_DEFUN([AC_LIBTOOL_RC])])
|
|
81
|
+
m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
|
|
82
|
+
m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
|
|
83
|
+
m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
|
|
84
|
+
m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
|
|
85
|
+
m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
|
|
86
|
+
m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
|
|
87
|
+
m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
|
|
88
|
+
m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
|
|
89
|
+
m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
|
|
90
|
+
m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
|
|
91
|
+
m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])])
|
|
92
|
+
m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
|
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
- No literal tabs. Expand tabs to 4 spaces.
|
|
2
|
+
- Indentation is 4 spaces.
|
|
3
|
+
- No more than 3 levels of indentation, otherwise you should think about
|
|
4
|
+
refactoring your code.
|
|
5
|
+
- Use one statement per line.
|
|
6
|
+
- Make sure that your editor does not leave space at the end of the line.
|
|
7
|
+
- snake_case for variable, function and file names.
|
|
8
|
+
- Use your own judgment when naming variables and functions. Be as Spartan
|
|
9
|
+
as possible. Eg: Using name like this_variable_is_a_temporary_counter
|
|
10
|
+
will usually be frowned upon.
|
|
11
|
+
- Don’t use local variables or parameters that shadow global identifiers.
|
|
12
|
+
GCC’s ‘-Wshadow’ option can help you to detect this problem.
|
|
13
|
+
|
|
14
|
+
- Avoid using int, char, short, long. Instead use int8_t uint8_t, int16_t,
|
|
15
|
+
uint16_t, int32_t, uint32_t, int64_t, uint64_t, which are available in
|
|
16
|
+
<stdint.h>. However, when interfacing with system calls and libraries
|
|
17
|
+
you cannot get away from using int and char.
|
|
18
|
+
- Use bool for boolean variables. You have to include <stdbool.h>
|
|
19
|
+
- Avoid using a bool as type for struct member names. Instead use unsigned
|
|
20
|
+
1-bit bit field. Eg:
|
|
21
|
+
struct foo {
|
|
22
|
+
unsigned is_bar:1;
|
|
23
|
+
};
|
|
24
|
+
- Always use size_t type when dealing with sizes of objects or memory ranges.
|
|
25
|
+
- Your code should be 64-bit and 32-bit friendly. Bear in mind problems
|
|
26
|
+
of printing, comparisons, and structure alignment. You have to include
|
|
27
|
+
<intyptes.h> to get generic format specifier macros for printing.
|
|
28
|
+
|
|
29
|
+
- 80 column line limit.
|
|
30
|
+
- If you have to wrap a long statement (> 80 column), put the operator at the
|
|
31
|
+
end of the line and indent the next line at the same column as the arguments
|
|
32
|
+
in the previous column. Eg:
|
|
33
|
+
while (cnt < 20 && this_variable_name_is_too_long &&
|
|
34
|
+
ep != NULL) {
|
|
35
|
+
z = a + really + long + statement + that + needs + three + lines +
|
|
36
|
+
gets + indented + on + the + same + column + as + the +
|
|
37
|
+
previous + column
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
and:
|
|
41
|
+
|
|
42
|
+
int a = function(param_a, param_b, param_c, param_d, param_e, param_f,
|
|
43
|
+
param_g, param_h, param_i, param_j, param_k, param_l);
|
|
44
|
+
|
|
45
|
+
- Always use braces for all conditional blocks (if, switch, for, while, do).
|
|
46
|
+
This holds good even for single statement conditional blocks. Eg:
|
|
47
|
+
if (cond) {
|
|
48
|
+
stmt;
|
|
49
|
+
}
|
|
50
|
+
- Placement of braces for non-function statement blocks - put opening brace
|
|
51
|
+
last on the line and closing brace first. Eg:
|
|
52
|
+
if (x is true) {
|
|
53
|
+
we do y
|
|
54
|
+
}
|
|
55
|
+
- Placement of brace for functions - put the opening brace at the beginning
|
|
56
|
+
of the next line and closing brace first. This is useful because several
|
|
57
|
+
tools look for opening brace in column one to find beginning of C
|
|
58
|
+
functions. Eg:
|
|
59
|
+
int
|
|
60
|
+
function(int x)
|
|
61
|
+
{
|
|
62
|
+
body of the function
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
- Closing brace is empty on a line of its own, except in cases where it is
|
|
66
|
+
followed by a continuation of the same statement, i.e. a "while" in a
|
|
67
|
+
do-statement or an "else" in an if-statement, like this:
|
|
68
|
+
do {
|
|
69
|
+
body of do-loop
|
|
70
|
+
} while (condition);
|
|
71
|
+
|
|
72
|
+
and,
|
|
73
|
+
|
|
74
|
+
if (x == y) {
|
|
75
|
+
..
|
|
76
|
+
} else if (x > y) {
|
|
77
|
+
...
|
|
78
|
+
} else {
|
|
79
|
+
....
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
- Column align switch keyword and the corresponding case/default keyword. Eg:
|
|
83
|
+
switch (alphabet) {
|
|
84
|
+
case 'a':
|
|
85
|
+
case 'b':
|
|
86
|
+
printf("I am a or b\n");
|
|
87
|
+
break;
|
|
88
|
+
|
|
89
|
+
default:
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
- Forever loops are done with for, and not while. Eg:
|
|
94
|
+
for (;;) {
|
|
95
|
+
stmt;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
- Don't use a space after a function name.
|
|
99
|
+
- Do not needlessly surround the return expression with parentheses.
|
|
100
|
+
- Use space after keywords. Exceptions are sizeof, typeof, alignof and
|
|
101
|
+
__attribute__, which look like functions.
|
|
102
|
+
- Do not add spaces around (inside) parenthesized expressions.
|
|
103
|
+
s = sizeof( sizeof(*p)) ); /* bad example */
|
|
104
|
+
s = sizeof(sizeof(*p)); /* good example */
|
|
105
|
+
- Casts should not be followed by space. Eg:
|
|
106
|
+
int q = *(int *)&p
|
|
107
|
+
- There is no need to type cast when assigning a void pointer to a non-void
|
|
108
|
+
pointer, or vice versa.
|
|
109
|
+
- Avoid using goto statements. However there are some exceptions to this rule
|
|
110
|
+
when a single goto label within a function and one or more goto statements
|
|
111
|
+
come in handy when a function exits from multiple locations and some common
|
|
112
|
+
work such as cleanup has to be done. Eg:
|
|
113
|
+
int
|
|
114
|
+
fun(void)
|
|
115
|
+
{
|
|
116
|
+
int result = 0;
|
|
117
|
+
char *buffer;
|
|
118
|
+
|
|
119
|
+
buffer = malloc(1024);
|
|
120
|
+
if (buffer == NULL) {
|
|
121
|
+
return -1;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (condition1) {
|
|
125
|
+
while (loop1) {
|
|
126
|
+
...
|
|
127
|
+
}
|
|
128
|
+
result = 1;
|
|
129
|
+
goto out;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
...
|
|
133
|
+
out:
|
|
134
|
+
free(buffer);
|
|
135
|
+
return result;
|
|
136
|
+
}
|
|
137
|
+
- When declaring pointer data, use '*' adjacent to the data name and not
|
|
138
|
+
adjacent to the type name. Eg:
|
|
139
|
+
int
|
|
140
|
+
function(int *p)
|
|
141
|
+
{
|
|
142
|
+
char *p;
|
|
143
|
+
<body of the function>
|
|
144
|
+
}
|
|
145
|
+
- Use one space around (on each side of) most binary and ternary operators,
|
|
146
|
+
such as any of these:
|
|
147
|
+
= + - < > * / % | & ^ <= >= == != ? :
|
|
148
|
+
but no space after unary operators:
|
|
149
|
+
& * + - ~ ! sizeof typeof alignof __attribute__ defined
|
|
150
|
+
no space before the postfix increment & decrement unary operators:
|
|
151
|
+
++ --
|
|
152
|
+
and no space around the '.' and "->" structure member operators.
|
|
153
|
+
|
|
154
|
+
- 0 and NULL; use 0 for integers, 0.0 for doubles, NULL for pointers, and
|
|
155
|
+
'\0' for chars.
|
|
156
|
+
- Test pointers against NULL. E.g, use:
|
|
157
|
+
if (p == NULL)
|
|
158
|
+
|
|
159
|
+
not:
|
|
160
|
+
|
|
161
|
+
!(p)
|
|
162
|
+
|
|
163
|
+
- Do not use ! for tests unless it is a boolean. E.g. use:
|
|
164
|
+
if (*p == '\0')
|
|
165
|
+
|
|
166
|
+
not:
|
|
167
|
+
|
|
168
|
+
if (!*p)
|
|
169
|
+
|
|
170
|
+
- Don't use assignments inside if or while-conditions. E.g, use:
|
|
171
|
+
|
|
172
|
+
struct foo *foo;
|
|
173
|
+
foo = malloc(sizeof(*foo));
|
|
174
|
+
if (foo == NULL) {
|
|
175
|
+
return -1
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
not:
|
|
179
|
+
|
|
180
|
+
struct foo *foo;
|
|
181
|
+
if ((foo = malloc(sizeof(*foo))) == NULL) {
|
|
182
|
+
return -1;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
- Don't ever use typedef for structure types. Typedefs are problematic
|
|
186
|
+
because they do not properly hide their underlying type; for example you
|
|
187
|
+
need to know if the typedef is the structure itself or a pointer to the
|
|
188
|
+
structure. In addition they must be declared exactly once, whereas an
|
|
189
|
+
incomplete structure type can be mentioned as many times as necessary.
|
|
190
|
+
Typedefs are difficult to use in stand-alone header files: the header
|
|
191
|
+
that defines the typedef must be included before the header that uses it,
|
|
192
|
+
or by the header that uses it (which causes namespace pollution), or
|
|
193
|
+
there must be a back-door mechanism for obtaining the typedef.
|
|
194
|
+
- The only exception for using a typedef is when you are defining a type
|
|
195
|
+
for a function pointer or a type for an enum. Eg:
|
|
196
|
+
|
|
197
|
+
typedef void (*foo_handler_t)(int, void *);
|
|
198
|
+
|
|
199
|
+
or:
|
|
200
|
+
|
|
201
|
+
typedef enum types {
|
|
202
|
+
TYPE_1,
|
|
203
|
+
TYPE_2
|
|
204
|
+
} types_t;
|
|
205
|
+
|
|
206
|
+
- Use just one variable declaration per line when variables are part of a
|
|
207
|
+
struct. This leaves you room for a small comment on each item, explaining
|
|
208
|
+
its use. Declarations should also be aligned. Eg, use:
|
|
209
|
+
|
|
210
|
+
struct foo {
|
|
211
|
+
int *foo_a; /* comment for foo_a */
|
|
212
|
+
int foo_b; /* comment for foo_b */
|
|
213
|
+
unsigned foo_c:1; /* comment for foo_c */
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
and not:
|
|
217
|
+
|
|
218
|
+
struct foo {
|
|
219
|
+
int *foo_a, foo_b;
|
|
220
|
+
unsigned foo_c:1;
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
- For variable declaration outside a struct, either collect all the
|
|
224
|
+
declarations of the same type on a single line, or use one variable
|
|
225
|
+
per line if the variables purpose needs to be commented. Eg:
|
|
226
|
+
char *a, *b, c;
|
|
227
|
+
|
|
228
|
+
or:
|
|
229
|
+
|
|
230
|
+
char *a, *b;
|
|
231
|
+
char c; /* comments for c */
|
|
232
|
+
|
|
233
|
+
- Avoid magic numbers because no-one has a clue (including the author) of
|
|
234
|
+
what it means after a month.
|
|
235
|
+
|
|
236
|
+
- Function definitions should start the name of the function in column
|
|
237
|
+
one. This is useful because it makes searching for function definitions
|
|
238
|
+
fairly trivial. Eg:
|
|
239
|
+
static char *
|
|
240
|
+
concat(char *s1, char *s2)
|
|
241
|
+
{
|
|
242
|
+
body of the function
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
- Function and variables local to a file should be static.
|
|
246
|
+
- Separate two successive functions with one blank line.
|
|
247
|
+
- Include parameter names with their datypes in function declaration. Eg:
|
|
248
|
+
void function(int param);
|
|
249
|
+
|
|
250
|
+
- Functions should be short and sweet, and do just one thing. They should
|
|
251
|
+
fit on one or two screenfuls of text (80 x 24 screen size), and do one
|
|
252
|
+
thing and do that well.
|
|
253
|
+
The maximum length of a function is inversely proportional to the
|
|
254
|
+
complexity and indentation level of that function. So, if you have a
|
|
255
|
+
conceptually simple function that is just one long (but simple)
|
|
256
|
+
case-statement, where you have to do lots of small things for a lot of
|
|
257
|
+
different cases, it's OK to have a longer function.
|
|
258
|
+
Another measure of the function is the number of local variables. They
|
|
259
|
+
shouldn't exceed 5-10, or you're doing something wrong. Re-think the
|
|
260
|
+
function, and split it into smaller pieces. A human brain can
|
|
261
|
+
generally easily keep track of about 7 different things, anything more
|
|
262
|
+
and it gets confused. You know you're brilliant, but maybe you'd like
|
|
263
|
+
to understand what you did 2 weeks from now.
|
|
264
|
+
- Use const for function parameters passed by reference, if the passed
|
|
265
|
+
pointer has no side effect.
|
|
266
|
+
|
|
267
|
+
- C style comments only. Don't use // for single line comments. Instead
|
|
268
|
+
use /* ... */ style.
|
|
269
|
+
- For multi-line comments use the following style
|
|
270
|
+
/*
|
|
271
|
+
* This is the preferred style for multi-line
|
|
272
|
+
* comments in the Linux kernel source code.
|
|
273
|
+
* Please use it consistently.
|
|
274
|
+
*
|
|
275
|
+
* Description: A column of asterisks on the left side,
|
|
276
|
+
* with beginning and ending almost-blank lines.
|
|
277
|
+
*/
|
|
278
|
+
|
|
279
|
+
- To comment out block of code spanning several lines use preprocessor
|
|
280
|
+
directive "#ifdef 0 ... #endif"
|
|
281
|
+
|
|
282
|
+
- Please write a brief comment at the start of each source file, with the
|
|
283
|
+
file name and a line or two about the overall purpose of the file.
|
|
284
|
+
|
|
285
|
+
- All major functions should have comments describing what they do at the
|
|
286
|
+
head of the function. Avoid putting comments in the function body unless
|
|
287
|
+
absolutely needed. If possible, add a comment on what sorts of arguments
|
|
288
|
+
the function gets, and what the possible values of arguments mean and
|
|
289
|
+
what they are used for and the significance of return value if there is
|
|
290
|
+
one. It is not necessary to duplicate in words the meaning of the C
|
|
291
|
+
argument declarations, if a C type is being used in its customary fashion.
|
|
292
|
+
If there is anything nonstandard about its use (such as an argument of
|
|
293
|
+
type char * which is really the address of the second character of a
|
|
294
|
+
string, not the first), or any possible values that would not work the
|
|
295
|
+
way one would expect (such as, that strings containing newlines are not
|
|
296
|
+
guaranteed to work), be sure to say so. Eg:
|
|
297
|
+
|
|
298
|
+
/*
|
|
299
|
+
* Try to acquire a physical address lock while a pmap is locked. If we
|
|
300
|
+
* fail to trylock we unlock and lock the pmap directly and cache the
|
|
301
|
+
* locked pa in *locked. The caller should then restart their loop in case
|
|
302
|
+
* the virtual to physical mapping has changed.
|
|
303
|
+
*
|
|
304
|
+
* Returns 0 on success and -1 on failure.
|
|
305
|
+
*/
|
|
306
|
+
int
|
|
307
|
+
vm_page_pa_tryrelock(pmap_t pmap, vm_paddr_t pa, vm_paddr_t *locked)
|
|
308
|
+
{
|
|
309
|
+
...
|
|
310
|
+
|
|
311
|
+
- The comment on a function is much clearer if you use the argument names
|
|
312
|
+
to speak about the argument values. The variable name itself should be
|
|
313
|
+
lower case, but write it in upper case when you are speaking about the
|
|
314
|
+
value rather than the variable itself. Thus, “the inode number NODE_NUM”
|
|
315
|
+
rather than “an inode”.
|
|
316
|
+
|
|
317
|
+
- Every struct definition should have an accompanying comment that
|
|
318
|
+
describes what it is for and how it should be used.
|
|
319
|
+
|
|
320
|
+
- Finally, while comments are absolutely important to keep the code readable,
|
|
321
|
+
remember that the best code is self-documenting. Giving sensible names to
|
|
322
|
+
types and variables is much better than using obscure names that you must
|
|
323
|
+
then explain through comments.
|
|
324
|
+
|
|
325
|
+
- Recommend using UPPERCASE for macro names. However, sometimes using
|
|
326
|
+
lowercase for macro names makes sense when macros masquerade as well-known
|
|
327
|
+
function calls. Eg, it makes sense to write the wrapper for the
|
|
328
|
+
standard free() function in lowercase to keep the readability
|
|
329
|
+
consistent:
|
|
330
|
+
|
|
331
|
+
#define my_free(_p) do { \
|
|
332
|
+
free(_p); \
|
|
333
|
+
(_p) = NULL; \
|
|
334
|
+
} while (0)
|
|
335
|
+
|
|
336
|
+
- Use enums when defining more than one related constants. All enumeration
|
|
337
|
+
values are in UPPERCASE.
|
|
338
|
+
- Avoid macros as much as possible and use inline functions, enums and const
|
|
339
|
+
variables wherever you can.
|
|
340
|
+
- For macros encapsulating compound statements, right justify the backslashes
|
|
341
|
+
and enclose it in do { ... } while (0)
|
|
342
|
+
- For parameterized macros, all the parameters used in the macro body must
|
|
343
|
+
be surrounded by parentheses. Eg:
|
|
344
|
+
#define ADD_1(_x) ((_x) + 1)
|
|
345
|
+
|
|
346
|
+
- Use sizeof(varname) instead of sizeof(type) whenever possible. Eg:
|
|
347
|
+
char *p;
|
|
348
|
+
p = malloc(sizeof(*p)); /* good example */
|
|
349
|
+
p = malloc(sizeof(char)); /* bad example */
|
|
350
|
+
|
|
351
|
+
- All variables should be declared at the beginning of a scope block {..}.
|
|
352
|
+
It is even preferred to declare all variables at the beginning of the
|
|
353
|
+
function so that all the local variable declarations is in one place and
|
|
354
|
+
we can see the comprehensive list in one glance.
|
|
355
|
+
- Global structs should be declared at the top of the file in which they
|
|
356
|
+
are used, or in separate header files if they are used in multiple
|
|
357
|
+
source files.
|
|
358
|
+
- Declarations of external functions and functions to appear later in the
|
|
359
|
+
source file should all go in one place near the beginning of the file,
|
|
360
|
+
somewhere before the first function definition in the file or else
|
|
361
|
+
should go in a header file.
|
|
362
|
+
- Use of extern should be considered as evil, if it is used in header files
|
|
363
|
+
to reference global variables.
|
|
364
|
+
- Don’t put extern declarations inside functions.
|
|
365
|
+
|
|
366
|
+
- Usually every *.c file should have an associated *.h file. There are some
|
|
367
|
+
exceptions to this rule, such as unit tests and small *.c files containing
|
|
368
|
+
just the main() function.
|
|
369
|
+
- Every header file in the source code must have preprocessor conditional
|
|
370
|
+
to prevent the header file from being scanned multiple times and avoiding
|
|
371
|
+
mutual dependency cycles. Alternatively you can use #pragma once directive,
|
|
372
|
+
as it avoids name clashes and increases the compile speed. Eg, for a
|
|
373
|
+
header file named foo.h, the entire contents of the header file must be
|
|
374
|
+
between the guard macros as follows:
|
|
375
|
+
|
|
376
|
+
#ifndef _FOO_H_
|
|
377
|
+
#define _FOO_H_
|
|
378
|
+
...
|
|
379
|
+
#endif /* _FOO_H_ */
|
|
380
|
+
|
|
381
|
+
Or,
|
|
382
|
+
|
|
383
|
+
#pragma once
|
|
384
|
+
#ifndef _FOO_H_
|
|
385
|
+
#define _FOO_H_
|
|
386
|
+
...
|
|
387
|
+
#endif /* _FOO_H_ */
|
|
388
|
+
|
|
389
|
+
- Don't use #include when a forward declaration would suffice.
|
|
390
|
+
- Functions defined in header files should be static inline.
|
|
391
|
+
|
|
392
|
+
- Don’t make the program ugly just to placate GCC when extra warnings options
|
|
393
|
+
such as ‘-Wconversion’ or ‘-Wundef’ are used. These options can help in
|
|
394
|
+
finding bugs, but they can also generate so many false alarms that that
|
|
395
|
+
it hurts readability to silence them with unnecessary casts, wrappers, and
|
|
396
|
+
other complications.
|
|
397
|
+
|
|
398
|
+
- Conditional compilation: when supporting configuration options already
|
|
399
|
+
known when building your program we prefer using if (... ) over conditional
|
|
400
|
+
compilation, as in the former case the compiler is able to perform more
|
|
401
|
+
extensive checking of all possible code paths. Eg, use:
|
|
402
|
+
|
|
403
|
+
if (HAS_FOO)
|
|
404
|
+
...
|
|
405
|
+
else
|
|
406
|
+
...
|
|
407
|
+
|
|
408
|
+
instead of:
|
|
409
|
+
|
|
410
|
+
#ifdef HAS_FOO
|
|
411
|
+
...
|
|
412
|
+
#else
|
|
413
|
+
...
|
|
414
|
+
#endif
|
|
415
|
+
|
|
416
|
+
A modern compiler such as GCC will generate exactly the same code in both
|
|
417
|
+
cases and of course, the former method assumes that HAS_FOO is defined as
|
|
418
|
+
either 0 or 1.
|
|
419
|
+
|
|
420
|
+
- Finally, rules are rules. Sometimes they are sensible and sometimes not
|
|
421
|
+
and regardless of your preference, we would like you to follow them.
|
|
422
|
+
A project is easier to follow if all project contributors follow the style
|
|
423
|
+
rules so that they can all read and understand everyone's code easily. But
|
|
424
|
+
remember, like all good rules, they are exceptions where it makes sense not
|
|
425
|
+
to be too rigid on the grounds of common sense and consistency!
|