mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-25 17:12:03 +00:00
Added zookeeper client library to tree [#METR-21848].
This commit is contained in:
parent
1e67f93c82
commit
1529dfbc59
17
contrib/libzookeeper/CMakeLists.txt
Normal file
17
contrib/libzookeeper/CMakeLists.txt
Normal file
@ -0,0 +1,17 @@
|
||||
add_definitions(
|
||||
-DHAVE_CONFIG_H -DTHREADED
|
||||
-Wno-unused-but-set-variable
|
||||
)
|
||||
|
||||
include_directories (include/zookeeper src)
|
||||
|
||||
add_library (zookeeper_mt
|
||||
src/zookeeper.c
|
||||
src/zookeeper.jute.c
|
||||
src/zk_hashtable.c
|
||||
src/zk_log.c
|
||||
src/mt_adaptor.c
|
||||
src/recordio.c
|
||||
src/hashtable/hashtable.c
|
||||
src/hashtable/hashtable_itr.c
|
||||
)
|
202
contrib/libzookeeper/LICENSE
Normal file
202
contrib/libzookeeper/LICENSE
Normal file
@ -0,0 +1,202 @@
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
1
contrib/libzookeeper/README
Normal file
1
contrib/libzookeeper/README
Normal file
@ -0,0 +1 @@
|
||||
http://apache-mirror.rbc.ru/pub/apache/zookeeper/stable/zookeeper-3.4.8.tar.gz
|
47
contrib/libzookeeper/include/zookeeper/proto.h
Normal file
47
contrib/libzookeeper/include/zookeeper/proto.h
Normal file
@ -0,0 +1,47 @@
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef PROTO_H_
|
||||
#define PROTO_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define ZOO_NOTIFY_OP 0
|
||||
#define ZOO_CREATE_OP 1
|
||||
#define ZOO_DELETE_OP 2
|
||||
#define ZOO_EXISTS_OP 3
|
||||
#define ZOO_GETDATA_OP 4
|
||||
#define ZOO_SETDATA_OP 5
|
||||
#define ZOO_GETACL_OP 6
|
||||
#define ZOO_SETACL_OP 7
|
||||
#define ZOO_GETCHILDREN_OP 8
|
||||
#define ZOO_SYNC_OP 9
|
||||
#define ZOO_PING_OP 11
|
||||
#define ZOO_GETCHILDREN2_OP 12
|
||||
#define ZOO_CHECK_OP 13
|
||||
#define ZOO_MULTI_OP 14
|
||||
#define ZOO_CLOSE_OP -11
|
||||
#define ZOO_SETAUTH_OP 100
|
||||
#define ZOO_SETWATCHES_OP 101
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /*PROTO_H_*/
|
82
contrib/libzookeeper/include/zookeeper/recordio.h
Normal file
82
contrib/libzookeeper/include/zookeeper/recordio.h
Normal file
@ -0,0 +1,82 @@
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef __RECORDIO_H__
|
||||
#define __RECORDIO_H__
|
||||
|
||||
#include <sys/types.h>
|
||||
#ifndef WIN32
|
||||
#define STRUCT_INITIALIZER(l,r) .l = r
|
||||
#else
|
||||
#define STRUCT_INITIALIZER(l,r) r
|
||||
#include "winconfig.h"
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct buffer {
|
||||
int32_t len;
|
||||
char *buff;
|
||||
};
|
||||
|
||||
void deallocate_String(char **s);
|
||||
void deallocate_Buffer(struct buffer *b);
|
||||
void deallocate_vector(void *d);
|
||||
struct iarchive {
|
||||
int (*start_record)(struct iarchive *ia, const char *tag);
|
||||
int (*end_record)(struct iarchive *ia, const char *tag);
|
||||
int (*start_vector)(struct iarchive *ia, const char *tag, int32_t *count);
|
||||
int (*end_vector)(struct iarchive *ia, const char *tag);
|
||||
int (*deserialize_Bool)(struct iarchive *ia, const char *name, int32_t *);
|
||||
int (*deserialize_Int)(struct iarchive *ia, const char *name, int32_t *);
|
||||
int (*deserialize_Long)(struct iarchive *ia, const char *name, int64_t *);
|
||||
int (*deserialize_Buffer)(struct iarchive *ia, const char *name,
|
||||
struct buffer *);
|
||||
int (*deserialize_String)(struct iarchive *ia, const char *name, char **);
|
||||
void *priv;
|
||||
};
|
||||
struct oarchive {
|
||||
int (*start_record)(struct oarchive *oa, const char *tag);
|
||||
int (*end_record)(struct oarchive *oa, const char *tag);
|
||||
int (*start_vector)(struct oarchive *oa, const char *tag, const int32_t *count);
|
||||
int (*end_vector)(struct oarchive *oa, const char *tag);
|
||||
int (*serialize_Bool)(struct oarchive *oa, const char *name, const int32_t *);
|
||||
int (*serialize_Int)(struct oarchive *oa, const char *name, const int32_t *);
|
||||
int (*serialize_Long)(struct oarchive *oa, const char *name,
|
||||
const int64_t *);
|
||||
int (*serialize_Buffer)(struct oarchive *oa, const char *name,
|
||||
const struct buffer *);
|
||||
int (*serialize_String)(struct oarchive *oa, const char *name, char **);
|
||||
void *priv;
|
||||
};
|
||||
|
||||
struct oarchive *create_buffer_oarchive(void);
|
||||
void close_buffer_oarchive(struct oarchive **oa, int free_buffer);
|
||||
struct iarchive *create_buffer_iarchive(char *buffer, int len);
|
||||
void close_buffer_iarchive(struct iarchive **ia);
|
||||
char *get_buffer(struct oarchive *);
|
||||
int get_buffer_len(struct oarchive *);
|
||||
|
||||
int64_t zoo_htonll(int64_t v);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
1583
contrib/libzookeeper/include/zookeeper/zookeeper.h
Normal file
1583
contrib/libzookeeper/include/zookeeper/zookeeper.h
Normal file
File diff suppressed because it is too large
Load Diff
485
contrib/libzookeeper/include/zookeeper/zookeeper.jute.h
Normal file
485
contrib/libzookeeper/include/zookeeper/zookeeper.jute.h
Normal file
@ -0,0 +1,485 @@
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef __ZOOKEEPER_JUTE__
|
||||
#define __ZOOKEEPER_JUTE__
|
||||
#include "recordio.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct Id {
|
||||
char * scheme;
|
||||
char * id;
|
||||
};
|
||||
int serialize_Id(struct oarchive *out, const char *tag, struct Id *v);
|
||||
int deserialize_Id(struct iarchive *in, const char *tag, struct Id*v);
|
||||
void deallocate_Id(struct Id*);
|
||||
struct ACL {
|
||||
int32_t perms;
|
||||
struct Id id;
|
||||
};
|
||||
int serialize_ACL(struct oarchive *out, const char *tag, struct ACL *v);
|
||||
int deserialize_ACL(struct iarchive *in, const char *tag, struct ACL*v);
|
||||
void deallocate_ACL(struct ACL*);
|
||||
struct Stat {
|
||||
int64_t czxid;
|
||||
int64_t mzxid;
|
||||
int64_t ctime;
|
||||
int64_t mtime;
|
||||
int32_t version;
|
||||
int32_t cversion;
|
||||
int32_t aversion;
|
||||
int64_t ephemeralOwner;
|
||||
int32_t dataLength;
|
||||
int32_t numChildren;
|
||||
int64_t pzxid;
|
||||
};
|
||||
int serialize_Stat(struct oarchive *out, const char *tag, struct Stat *v);
|
||||
int deserialize_Stat(struct iarchive *in, const char *tag, struct Stat*v);
|
||||
void deallocate_Stat(struct Stat*);
|
||||
struct StatPersisted {
|
||||
int64_t czxid;
|
||||
int64_t mzxid;
|
||||
int64_t ctime;
|
||||
int64_t mtime;
|
||||
int32_t version;
|
||||
int32_t cversion;
|
||||
int32_t aversion;
|
||||
int64_t ephemeralOwner;
|
||||
int64_t pzxid;
|
||||
};
|
||||
int serialize_StatPersisted(struct oarchive *out, const char *tag, struct StatPersisted *v);
|
||||
int deserialize_StatPersisted(struct iarchive *in, const char *tag, struct StatPersisted*v);
|
||||
void deallocate_StatPersisted(struct StatPersisted*);
|
||||
struct StatPersistedV1 {
|
||||
int64_t czxid;
|
||||
int64_t mzxid;
|
||||
int64_t ctime;
|
||||
int64_t mtime;
|
||||
int32_t version;
|
||||
int32_t cversion;
|
||||
int32_t aversion;
|
||||
int64_t ephemeralOwner;
|
||||
};
|
||||
int serialize_StatPersistedV1(struct oarchive *out, const char *tag, struct StatPersistedV1 *v);
|
||||
int deserialize_StatPersistedV1(struct iarchive *in, const char *tag, struct StatPersistedV1*v);
|
||||
void deallocate_StatPersistedV1(struct StatPersistedV1*);
|
||||
struct ConnectRequest {
|
||||
int32_t protocolVersion;
|
||||
int64_t lastZxidSeen;
|
||||
int32_t timeOut;
|
||||
int64_t sessionId;
|
||||
struct buffer passwd;
|
||||
};
|
||||
int serialize_ConnectRequest(struct oarchive *out, const char *tag, struct ConnectRequest *v);
|
||||
int deserialize_ConnectRequest(struct iarchive *in, const char *tag, struct ConnectRequest*v);
|
||||
void deallocate_ConnectRequest(struct ConnectRequest*);
|
||||
struct ConnectResponse {
|
||||
int32_t protocolVersion;
|
||||
int32_t timeOut;
|
||||
int64_t sessionId;
|
||||
struct buffer passwd;
|
||||
};
|
||||
int serialize_ConnectResponse(struct oarchive *out, const char *tag, struct ConnectResponse *v);
|
||||
int deserialize_ConnectResponse(struct iarchive *in, const char *tag, struct ConnectResponse*v);
|
||||
void deallocate_ConnectResponse(struct ConnectResponse*);
|
||||
struct String_vector {
|
||||
int32_t count;
|
||||
char * *data;
|
||||
|
||||
};
|
||||
int serialize_String_vector(struct oarchive *out, const char *tag, struct String_vector *v);
|
||||
int deserialize_String_vector(struct iarchive *in, const char *tag, struct String_vector *v);
|
||||
int allocate_String_vector(struct String_vector *v, int32_t len);
|
||||
int deallocate_String_vector(struct String_vector *v);
|
||||
struct SetWatches {
|
||||
int64_t relativeZxid;
|
||||
struct String_vector dataWatches;
|
||||
struct String_vector existWatches;
|
||||
struct String_vector childWatches;
|
||||
};
|
||||
int serialize_SetWatches(struct oarchive *out, const char *tag, struct SetWatches *v);
|
||||
int deserialize_SetWatches(struct iarchive *in, const char *tag, struct SetWatches*v);
|
||||
void deallocate_SetWatches(struct SetWatches*);
|
||||
struct RequestHeader {
|
||||
int32_t xid;
|
||||
int32_t type;
|
||||
};
|
||||
int serialize_RequestHeader(struct oarchive *out, const char *tag, struct RequestHeader *v);
|
||||
int deserialize_RequestHeader(struct iarchive *in, const char *tag, struct RequestHeader*v);
|
||||
void deallocate_RequestHeader(struct RequestHeader*);
|
||||
struct MultiHeader {
|
||||
int32_t type;
|
||||
int32_t done;
|
||||
int32_t err;
|
||||
};
|
||||
int serialize_MultiHeader(struct oarchive *out, const char *tag, struct MultiHeader *v);
|
||||
int deserialize_MultiHeader(struct iarchive *in, const char *tag, struct MultiHeader*v);
|
||||
void deallocate_MultiHeader(struct MultiHeader*);
|
||||
struct AuthPacket {
|
||||
int32_t type;
|
||||
char * scheme;
|
||||
struct buffer auth;
|
||||
};
|
||||
int serialize_AuthPacket(struct oarchive *out, const char *tag, struct AuthPacket *v);
|
||||
int deserialize_AuthPacket(struct iarchive *in, const char *tag, struct AuthPacket*v);
|
||||
void deallocate_AuthPacket(struct AuthPacket*);
|
||||
struct ReplyHeader {
|
||||
int32_t xid;
|
||||
int64_t zxid;
|
||||
int32_t err;
|
||||
};
|
||||
int serialize_ReplyHeader(struct oarchive *out, const char *tag, struct ReplyHeader *v);
|
||||
int deserialize_ReplyHeader(struct iarchive *in, const char *tag, struct ReplyHeader*v);
|
||||
void deallocate_ReplyHeader(struct ReplyHeader*);
|
||||
struct GetDataRequest {
|
||||
char * path;
|
||||
int32_t watch;
|
||||
};
|
||||
int serialize_GetDataRequest(struct oarchive *out, const char *tag, struct GetDataRequest *v);
|
||||
int deserialize_GetDataRequest(struct iarchive *in, const char *tag, struct GetDataRequest*v);
|
||||
void deallocate_GetDataRequest(struct GetDataRequest*);
|
||||
struct SetDataRequest {
|
||||
char * path;
|
||||
struct buffer data;
|
||||
int32_t version;
|
||||
};
|
||||
int serialize_SetDataRequest(struct oarchive *out, const char *tag, struct SetDataRequest *v);
|
||||
int deserialize_SetDataRequest(struct iarchive *in, const char *tag, struct SetDataRequest*v);
|
||||
void deallocate_SetDataRequest(struct SetDataRequest*);
|
||||
struct SetDataResponse {
|
||||
struct Stat stat;
|
||||
};
|
||||
int serialize_SetDataResponse(struct oarchive *out, const char *tag, struct SetDataResponse *v);
|
||||
int deserialize_SetDataResponse(struct iarchive *in, const char *tag, struct SetDataResponse*v);
|
||||
void deallocate_SetDataResponse(struct SetDataResponse*);
|
||||
struct GetSASLRequest {
|
||||
struct buffer token;
|
||||
};
|
||||
int serialize_GetSASLRequest(struct oarchive *out, const char *tag, struct GetSASLRequest *v);
|
||||
int deserialize_GetSASLRequest(struct iarchive *in, const char *tag, struct GetSASLRequest*v);
|
||||
void deallocate_GetSASLRequest(struct GetSASLRequest*);
|
||||
struct SetSASLRequest {
|
||||
struct buffer token;
|
||||
};
|
||||
int serialize_SetSASLRequest(struct oarchive *out, const char *tag, struct SetSASLRequest *v);
|
||||
int deserialize_SetSASLRequest(struct iarchive *in, const char *tag, struct SetSASLRequest*v);
|
||||
void deallocate_SetSASLRequest(struct SetSASLRequest*);
|
||||
struct SetSASLResponse {
|
||||
struct buffer token;
|
||||
};
|
||||
int serialize_SetSASLResponse(struct oarchive *out, const char *tag, struct SetSASLResponse *v);
|
||||
int deserialize_SetSASLResponse(struct iarchive *in, const char *tag, struct SetSASLResponse*v);
|
||||
void deallocate_SetSASLResponse(struct SetSASLResponse*);
|
||||
struct ACL_vector {
|
||||
int32_t count;
|
||||
struct ACL *data;
|
||||
|
||||
};
|
||||
int serialize_ACL_vector(struct oarchive *out, const char *tag, struct ACL_vector *v);
|
||||
int deserialize_ACL_vector(struct iarchive *in, const char *tag, struct ACL_vector *v);
|
||||
int allocate_ACL_vector(struct ACL_vector *v, int32_t len);
|
||||
int deallocate_ACL_vector(struct ACL_vector *v);
|
||||
struct CreateRequest {
|
||||
char * path;
|
||||
struct buffer data;
|
||||
struct ACL_vector acl;
|
||||
int32_t flags;
|
||||
};
|
||||
int serialize_CreateRequest(struct oarchive *out, const char *tag, struct CreateRequest *v);
|
||||
int deserialize_CreateRequest(struct iarchive *in, const char *tag, struct CreateRequest*v);
|
||||
void deallocate_CreateRequest(struct CreateRequest*);
|
||||
struct DeleteRequest {
|
||||
char * path;
|
||||
int32_t version;
|
||||
};
|
||||
int serialize_DeleteRequest(struct oarchive *out, const char *tag, struct DeleteRequest *v);
|
||||
int deserialize_DeleteRequest(struct iarchive *in, const char *tag, struct DeleteRequest*v);
|
||||
void deallocate_DeleteRequest(struct DeleteRequest*);
|
||||
struct GetChildrenRequest {
|
||||
char * path;
|
||||
int32_t watch;
|
||||
};
|
||||
int serialize_GetChildrenRequest(struct oarchive *out, const char *tag, struct GetChildrenRequest *v);
|
||||
int deserialize_GetChildrenRequest(struct iarchive *in, const char *tag, struct GetChildrenRequest*v);
|
||||
void deallocate_GetChildrenRequest(struct GetChildrenRequest*);
|
||||
struct GetChildren2Request {
|
||||
char * path;
|
||||
int32_t watch;
|
||||
};
|
||||
int serialize_GetChildren2Request(struct oarchive *out, const char *tag, struct GetChildren2Request *v);
|
||||
int deserialize_GetChildren2Request(struct iarchive *in, const char *tag, struct GetChildren2Request*v);
|
||||
void deallocate_GetChildren2Request(struct GetChildren2Request*);
|
||||
struct CheckVersionRequest {
|
||||
char * path;
|
||||
int32_t version;
|
||||
};
|
||||
int serialize_CheckVersionRequest(struct oarchive *out, const char *tag, struct CheckVersionRequest *v);
|
||||
int deserialize_CheckVersionRequest(struct iarchive *in, const char *tag, struct CheckVersionRequest*v);
|
||||
void deallocate_CheckVersionRequest(struct CheckVersionRequest*);
|
||||
struct GetMaxChildrenRequest {
|
||||
char * path;
|
||||
};
|
||||
int serialize_GetMaxChildrenRequest(struct oarchive *out, const char *tag, struct GetMaxChildrenRequest *v);
|
||||
int deserialize_GetMaxChildrenRequest(struct iarchive *in, const char *tag, struct GetMaxChildrenRequest*v);
|
||||
void deallocate_GetMaxChildrenRequest(struct GetMaxChildrenRequest*);
|
||||
struct GetMaxChildrenResponse {
|
||||
int32_t max;
|
||||
};
|
||||
int serialize_GetMaxChildrenResponse(struct oarchive *out, const char *tag, struct GetMaxChildrenResponse *v);
|
||||
int deserialize_GetMaxChildrenResponse(struct iarchive *in, const char *tag, struct GetMaxChildrenResponse*v);
|
||||
void deallocate_GetMaxChildrenResponse(struct GetMaxChildrenResponse*);
|
||||
struct SetMaxChildrenRequest {
|
||||
char * path;
|
||||
int32_t max;
|
||||
};
|
||||
int serialize_SetMaxChildrenRequest(struct oarchive *out, const char *tag, struct SetMaxChildrenRequest *v);
|
||||
int deserialize_SetMaxChildrenRequest(struct iarchive *in, const char *tag, struct SetMaxChildrenRequest*v);
|
||||
void deallocate_SetMaxChildrenRequest(struct SetMaxChildrenRequest*);
|
||||
struct SyncRequest {
|
||||
char * path;
|
||||
};
|
||||
int serialize_SyncRequest(struct oarchive *out, const char *tag, struct SyncRequest *v);
|
||||
int deserialize_SyncRequest(struct iarchive *in, const char *tag, struct SyncRequest*v);
|
||||
void deallocate_SyncRequest(struct SyncRequest*);
|
||||
struct SyncResponse {
|
||||
char * path;
|
||||
};
|
||||
int serialize_SyncResponse(struct oarchive *out, const char *tag, struct SyncResponse *v);
|
||||
int deserialize_SyncResponse(struct iarchive *in, const char *tag, struct SyncResponse*v);
|
||||
void deallocate_SyncResponse(struct SyncResponse*);
|
||||
struct GetACLRequest {
|
||||
char * path;
|
||||
};
|
||||
int serialize_GetACLRequest(struct oarchive *out, const char *tag, struct GetACLRequest *v);
|
||||
int deserialize_GetACLRequest(struct iarchive *in, const char *tag, struct GetACLRequest*v);
|
||||
void deallocate_GetACLRequest(struct GetACLRequest*);
|
||||
struct SetACLRequest {
|
||||
char * path;
|
||||
struct ACL_vector acl;
|
||||
int32_t version;
|
||||
};
|
||||
int serialize_SetACLRequest(struct oarchive *out, const char *tag, struct SetACLRequest *v);
|
||||
int deserialize_SetACLRequest(struct iarchive *in, const char *tag, struct SetACLRequest*v);
|
||||
void deallocate_SetACLRequest(struct SetACLRequest*);
|
||||
struct SetACLResponse {
|
||||
struct Stat stat;
|
||||
};
|
||||
int serialize_SetACLResponse(struct oarchive *out, const char *tag, struct SetACLResponse *v);
|
||||
int deserialize_SetACLResponse(struct iarchive *in, const char *tag, struct SetACLResponse*v);
|
||||
void deallocate_SetACLResponse(struct SetACLResponse*);
|
||||
struct WatcherEvent {
|
||||
int32_t type;
|
||||
int32_t state;
|
||||
char * path;
|
||||
};
|
||||
int serialize_WatcherEvent(struct oarchive *out, const char *tag, struct WatcherEvent *v);
|
||||
int deserialize_WatcherEvent(struct iarchive *in, const char *tag, struct WatcherEvent*v);
|
||||
void deallocate_WatcherEvent(struct WatcherEvent*);
|
||||
struct ErrorResponse {
|
||||
int32_t err;
|
||||
};
|
||||
int serialize_ErrorResponse(struct oarchive *out, const char *tag, struct ErrorResponse *v);
|
||||
int deserialize_ErrorResponse(struct iarchive *in, const char *tag, struct ErrorResponse*v);
|
||||
void deallocate_ErrorResponse(struct ErrorResponse*);
|
||||
struct CreateResponse {
|
||||
char * path;
|
||||
};
|
||||
int serialize_CreateResponse(struct oarchive *out, const char *tag, struct CreateResponse *v);
|
||||
int deserialize_CreateResponse(struct iarchive *in, const char *tag, struct CreateResponse*v);
|
||||
void deallocate_CreateResponse(struct CreateResponse*);
|
||||
struct ExistsRequest {
|
||||
char * path;
|
||||
int32_t watch;
|
||||
};
|
||||
int serialize_ExistsRequest(struct oarchive *out, const char *tag, struct ExistsRequest *v);
|
||||
int deserialize_ExistsRequest(struct iarchive *in, const char *tag, struct ExistsRequest*v);
|
||||
void deallocate_ExistsRequest(struct ExistsRequest*);
|
||||
struct ExistsResponse {
|
||||
struct Stat stat;
|
||||
};
|
||||
int serialize_ExistsResponse(struct oarchive *out, const char *tag, struct ExistsResponse *v);
|
||||
int deserialize_ExistsResponse(struct iarchive *in, const char *tag, struct ExistsResponse*v);
|
||||
void deallocate_ExistsResponse(struct ExistsResponse*);
|
||||
struct GetDataResponse {
|
||||
struct buffer data;
|
||||
struct Stat stat;
|
||||
};
|
||||
int serialize_GetDataResponse(struct oarchive *out, const char *tag, struct GetDataResponse *v);
|
||||
int deserialize_GetDataResponse(struct iarchive *in, const char *tag, struct GetDataResponse*v);
|
||||
void deallocate_GetDataResponse(struct GetDataResponse*);
|
||||
struct GetChildrenResponse {
|
||||
struct String_vector children;
|
||||
};
|
||||
int serialize_GetChildrenResponse(struct oarchive *out, const char *tag, struct GetChildrenResponse *v);
|
||||
int deserialize_GetChildrenResponse(struct iarchive *in, const char *tag, struct GetChildrenResponse*v);
|
||||
void deallocate_GetChildrenResponse(struct GetChildrenResponse*);
|
||||
struct GetChildren2Response {
|
||||
struct String_vector children;
|
||||
struct Stat stat;
|
||||
};
|
||||
int serialize_GetChildren2Response(struct oarchive *out, const char *tag, struct GetChildren2Response *v);
|
||||
int deserialize_GetChildren2Response(struct iarchive *in, const char *tag, struct GetChildren2Response*v);
|
||||
void deallocate_GetChildren2Response(struct GetChildren2Response*);
|
||||
struct GetACLResponse {
|
||||
struct ACL_vector acl;
|
||||
struct Stat stat;
|
||||
};
|
||||
int serialize_GetACLResponse(struct oarchive *out, const char *tag, struct GetACLResponse *v);
|
||||
int deserialize_GetACLResponse(struct iarchive *in, const char *tag, struct GetACLResponse*v);
|
||||
void deallocate_GetACLResponse(struct GetACLResponse*);
|
||||
struct LearnerInfo {
|
||||
int64_t serverid;
|
||||
int32_t protocolVersion;
|
||||
};
|
||||
int serialize_LearnerInfo(struct oarchive *out, const char *tag, struct LearnerInfo *v);
|
||||
int deserialize_LearnerInfo(struct iarchive *in, const char *tag, struct LearnerInfo*v);
|
||||
void deallocate_LearnerInfo(struct LearnerInfo*);
|
||||
struct Id_vector {
|
||||
int32_t count;
|
||||
struct Id *data;
|
||||
|
||||
};
|
||||
int serialize_Id_vector(struct oarchive *out, const char *tag, struct Id_vector *v);
|
||||
int deserialize_Id_vector(struct iarchive *in, const char *tag, struct Id_vector *v);
|
||||
int allocate_Id_vector(struct Id_vector *v, int32_t len);
|
||||
int deallocate_Id_vector(struct Id_vector *v);
|
||||
struct QuorumPacket {
|
||||
int32_t type;
|
||||
int64_t zxid;
|
||||
struct buffer data;
|
||||
struct Id_vector authinfo;
|
||||
};
|
||||
int serialize_QuorumPacket(struct oarchive *out, const char *tag, struct QuorumPacket *v);
|
||||
int deserialize_QuorumPacket(struct iarchive *in, const char *tag, struct QuorumPacket*v);
|
||||
void deallocate_QuorumPacket(struct QuorumPacket*);
|
||||
struct FileHeader {
|
||||
int32_t magic;
|
||||
int32_t version;
|
||||
int64_t dbid;
|
||||
};
|
||||
int serialize_FileHeader(struct oarchive *out, const char *tag, struct FileHeader *v);
|
||||
int deserialize_FileHeader(struct iarchive *in, const char *tag, struct FileHeader*v);
|
||||
void deallocate_FileHeader(struct FileHeader*);
|
||||
struct TxnHeader {
|
||||
int64_t clientId;
|
||||
int32_t cxid;
|
||||
int64_t zxid;
|
||||
int64_t time;
|
||||
int32_t type;
|
||||
};
|
||||
int serialize_TxnHeader(struct oarchive *out, const char *tag, struct TxnHeader *v);
|
||||
int deserialize_TxnHeader(struct iarchive *in, const char *tag, struct TxnHeader*v);
|
||||
void deallocate_TxnHeader(struct TxnHeader*);
|
||||
struct CreateTxnV0 {
|
||||
char * path;
|
||||
struct buffer data;
|
||||
struct ACL_vector acl;
|
||||
int32_t ephemeral;
|
||||
};
|
||||
int serialize_CreateTxnV0(struct oarchive *out, const char *tag, struct CreateTxnV0 *v);
|
||||
int deserialize_CreateTxnV0(struct iarchive *in, const char *tag, struct CreateTxnV0*v);
|
||||
void deallocate_CreateTxnV0(struct CreateTxnV0*);
|
||||
struct CreateTxn {
|
||||
char * path;
|
||||
struct buffer data;
|
||||
struct ACL_vector acl;
|
||||
int32_t ephemeral;
|
||||
int32_t parentCVersion;
|
||||
};
|
||||
int serialize_CreateTxn(struct oarchive *out, const char *tag, struct CreateTxn *v);
|
||||
int deserialize_CreateTxn(struct iarchive *in, const char *tag, struct CreateTxn*v);
|
||||
void deallocate_CreateTxn(struct CreateTxn*);
|
||||
struct DeleteTxn {
|
||||
char * path;
|
||||
};
|
||||
int serialize_DeleteTxn(struct oarchive *out, const char *tag, struct DeleteTxn *v);
|
||||
int deserialize_DeleteTxn(struct iarchive *in, const char *tag, struct DeleteTxn*v);
|
||||
void deallocate_DeleteTxn(struct DeleteTxn*);
|
||||
struct SetDataTxn {
|
||||
char * path;
|
||||
struct buffer data;
|
||||
int32_t version;
|
||||
};
|
||||
int serialize_SetDataTxn(struct oarchive *out, const char *tag, struct SetDataTxn *v);
|
||||
int deserialize_SetDataTxn(struct iarchive *in, const char *tag, struct SetDataTxn*v);
|
||||
void deallocate_SetDataTxn(struct SetDataTxn*);
|
||||
struct CheckVersionTxn {
|
||||
char * path;
|
||||
int32_t version;
|
||||
};
|
||||
int serialize_CheckVersionTxn(struct oarchive *out, const char *tag, struct CheckVersionTxn *v);
|
||||
int deserialize_CheckVersionTxn(struct iarchive *in, const char *tag, struct CheckVersionTxn*v);
|
||||
void deallocate_CheckVersionTxn(struct CheckVersionTxn*);
|
||||
struct SetACLTxn {
|
||||
char * path;
|
||||
struct ACL_vector acl;
|
||||
int32_t version;
|
||||
};
|
||||
int serialize_SetACLTxn(struct oarchive *out, const char *tag, struct SetACLTxn *v);
|
||||
int deserialize_SetACLTxn(struct iarchive *in, const char *tag, struct SetACLTxn*v);
|
||||
void deallocate_SetACLTxn(struct SetACLTxn*);
|
||||
struct SetMaxChildrenTxn {
|
||||
char * path;
|
||||
int32_t max;
|
||||
};
|
||||
int serialize_SetMaxChildrenTxn(struct oarchive *out, const char *tag, struct SetMaxChildrenTxn *v);
|
||||
int deserialize_SetMaxChildrenTxn(struct iarchive *in, const char *tag, struct SetMaxChildrenTxn*v);
|
||||
void deallocate_SetMaxChildrenTxn(struct SetMaxChildrenTxn*);
|
||||
struct CreateSessionTxn {
|
||||
int32_t timeOut;
|
||||
};
|
||||
int serialize_CreateSessionTxn(struct oarchive *out, const char *tag, struct CreateSessionTxn *v);
|
||||
int deserialize_CreateSessionTxn(struct iarchive *in, const char *tag, struct CreateSessionTxn*v);
|
||||
void deallocate_CreateSessionTxn(struct CreateSessionTxn*);
|
||||
struct ErrorTxn {
|
||||
int32_t err;
|
||||
};
|
||||
int serialize_ErrorTxn(struct oarchive *out, const char *tag, struct ErrorTxn *v);
|
||||
int deserialize_ErrorTxn(struct iarchive *in, const char *tag, struct ErrorTxn*v);
|
||||
void deallocate_ErrorTxn(struct ErrorTxn*);
|
||||
struct Txn {
|
||||
int32_t type;
|
||||
struct buffer data;
|
||||
};
|
||||
int serialize_Txn(struct oarchive *out, const char *tag, struct Txn *v);
|
||||
int deserialize_Txn(struct iarchive *in, const char *tag, struct Txn*v);
|
||||
void deallocate_Txn(struct Txn*);
|
||||
struct Txn_vector {
|
||||
int32_t count;
|
||||
struct Txn *data;
|
||||
|
||||
};
|
||||
int serialize_Txn_vector(struct oarchive *out, const char *tag, struct Txn_vector *v);
|
||||
int deserialize_Txn_vector(struct iarchive *in, const char *tag, struct Txn_vector *v);
|
||||
int allocate_Txn_vector(struct Txn_vector *v, int32_t len);
|
||||
int deallocate_Txn_vector(struct Txn_vector *v);
|
||||
struct MultiTxn {
|
||||
struct Txn_vector txns;
|
||||
};
|
||||
int serialize_MultiTxn(struct oarchive *out, const char *tag, struct MultiTxn *v);
|
||||
int deserialize_MultiTxn(struct iarchive *in, const char *tag, struct MultiTxn*v);
|
||||
void deallocate_MultiTxn(struct MultiTxn*);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif //ZOOKEEPER_JUTE__
|
51
contrib/libzookeeper/include/zookeeper/zookeeper_log.h
Normal file
51
contrib/libzookeeper/include/zookeeper/zookeeper_log.h
Normal file
@ -0,0 +1,51 @@
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ZK_LOG_H_
|
||||
#define ZK_LOG_H_
|
||||
|
||||
#include <zookeeper.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern ZOOAPI ZooLogLevel logLevel;
|
||||
#define LOGSTREAM getLogStream()
|
||||
|
||||
#define LOG_ERROR(x) if(logLevel>=ZOO_LOG_LEVEL_ERROR) \
|
||||
log_message(ZOO_LOG_LEVEL_ERROR,__LINE__,__func__,format_log_message x)
|
||||
#define LOG_WARN(x) if(logLevel>=ZOO_LOG_LEVEL_WARN) \
|
||||
log_message(ZOO_LOG_LEVEL_WARN,__LINE__,__func__,format_log_message x)
|
||||
#define LOG_INFO(x) if(logLevel>=ZOO_LOG_LEVEL_INFO) \
|
||||
log_message(ZOO_LOG_LEVEL_INFO,__LINE__,__func__,format_log_message x)
|
||||
#define LOG_DEBUG(x) if(logLevel==ZOO_LOG_LEVEL_DEBUG) \
|
||||
log_message(ZOO_LOG_LEVEL_DEBUG,__LINE__,__func__,format_log_message x)
|
||||
|
||||
ZOOAPI void log_message(ZooLogLevel curLevel, int line,const char* funcName,
|
||||
const char* message);
|
||||
|
||||
ZOOAPI const char* format_log_message(const char* format,...);
|
||||
|
||||
FILE* getLogStream();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /*ZK_LOG_H_*/
|
33
contrib/libzookeeper/include/zookeeper/zookeeper_version.h
Normal file
33
contrib/libzookeeper/include/zookeeper/zookeeper_version.h
Normal file
@ -0,0 +1,33 @@
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef ZOOKEEPER_VERSION_H_
|
||||
#define ZOOKEEPER_VERSION_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define ZOO_MAJOR_VERSION 3
|
||||
#define ZOO_MINOR_VERSION 4
|
||||
#define ZOO_PATCH_VERSION 8
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* ZOOKEEPER_VERSION_H_ */
|
149
contrib/libzookeeper/src/config.h
Normal file
149
contrib/libzookeeper/src/config.h
Normal file
@ -0,0 +1,149 @@
|
||||
/* config.h. Generated from config.h.in by configure. */
|
||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||
|
||||
/* Define to 1 if you have the <arpa/inet.h> header file. */
|
||||
#define HAVE_ARPA_INET_H 1
|
||||
|
||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
||||
#define HAVE_DLFCN_H 1
|
||||
|
||||
/* Define to 1 if you have the <fcntl.h> header file. */
|
||||
#define HAVE_FCNTL_H 1
|
||||
|
||||
/* Define to 1 if you have the file `generated/zookeeper.jute.c'. */
|
||||
#define HAVE_GENERATED_ZOOKEEPER_JUTE_C 1
|
||||
|
||||
/* Define to 1 if you have the file `generated/zookeeper.jute.h'. */
|
||||
#define HAVE_GENERATED_ZOOKEEPER_JUTE_H 1
|
||||
|
||||
/* Define to 1 if you have the `getcwd' function. */
|
||||
#define HAVE_GETCWD 1
|
||||
|
||||
/* Define to 1 if you have the `gethostbyname' function. */
|
||||
#define HAVE_GETHOSTBYNAME 1
|
||||
|
||||
/* Define to 1 if you have the `gethostname' function. */
|
||||
#define HAVE_GETHOSTNAME 1
|
||||
|
||||
/* Define to 1 if you have the `getlogin' function. */
|
||||
#define HAVE_GETLOGIN 1
|
||||
|
||||
/* Define to 1 if you have the `getpwuid_r' function. */
|
||||
#define HAVE_GETPWUID_R 1
|
||||
|
||||
/* Define to 1 if you have the `gettimeofday' function. */
|
||||
#define HAVE_GETTIMEOFDAY 1
|
||||
|
||||
/* Define to 1 if you have the `getuid' function. */
|
||||
#define HAVE_GETUID 1
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#define HAVE_INTTYPES_H 1
|
||||
|
||||
/* Define to 1 if you have the `memmove' function. */
|
||||
#define HAVE_MEMMOVE 1
|
||||
|
||||
/* Define to 1 if you have the <memory.h> header file. */
|
||||
#define HAVE_MEMORY_H 1
|
||||
|
||||
/* Define to 1 if you have the `memset' function. */
|
||||
#define HAVE_MEMSET 1
|
||||
|
||||
/* Define to 1 if you have the <netdb.h> header file. */
|
||||
#define HAVE_NETDB_H 1
|
||||
|
||||
/* Define to 1 if you have the <netinet/in.h> header file. */
|
||||
#define HAVE_NETINET_IN_H 1
|
||||
|
||||
/* Define to 1 if you have the `poll' function. */
|
||||
#define HAVE_POLL 1
|
||||
|
||||
/* Define to 1 if you have the `socket' function. */
|
||||
#define HAVE_SOCKET 1
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#define HAVE_STDINT_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#define HAVE_STDLIB_H 1
|
||||
|
||||
/* Define to 1 if you have the `strchr' function. */
|
||||
#define HAVE_STRCHR 1
|
||||
|
||||
/* Define to 1 if you have the `strdup' function. */
|
||||
#define HAVE_STRDUP 1
|
||||
|
||||
/* Define to 1 if you have the `strerror' function. */
|
||||
#define HAVE_STRERROR 1
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#define HAVE_STRINGS_H 1
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#define HAVE_STRING_H 1
|
||||
|
||||
/* Define to 1 if you have the `strtol' function. */
|
||||
#define HAVE_STRTOL 1
|
||||
|
||||
/* Define to 1 if you have the <sys/socket.h> header file. */
|
||||
#define HAVE_SYS_SOCKET_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#define HAVE_SYS_STAT_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/time.h> header file. */
|
||||
#define HAVE_SYS_TIME_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#define HAVE_SYS_TYPES_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/utsname.h> header file. */
|
||||
#define HAVE_SYS_UTSNAME_H 1
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#define HAVE_UNISTD_H 1
|
||||
|
||||
/* Define to the sub-directory where libtool stores uninstalled libraries. */
|
||||
#define LT_OBJDIR ".libs/"
|
||||
|
||||
/* Name of package */
|
||||
#define PACKAGE "zookeeper"
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#define PACKAGE_BUGREPORT "user@zookeeper.apache.org"
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#define PACKAGE_NAME "zookeeper C client"
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#define PACKAGE_STRING "zookeeper C client 3.4.8"
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#define PACKAGE_TARNAME "zookeeper"
|
||||
|
||||
/* Define to the home page for this package. */
|
||||
#define PACKAGE_URL ""
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#define PACKAGE_VERSION "3.4.8"
|
||||
|
||||
/* poll() second argument type */
|
||||
#define POLL_NFDS_TYPE nfds_t
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#define STDC_HEADERS 1
|
||||
|
||||
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
|
||||
#define TIME_WITH_SYS_TIME 1
|
||||
|
||||
/* Version number of package */
|
||||
#define VERSION "3.4.8"
|
||||
|
||||
/* Define to empty if `const' does not conform to ANSI C. */
|
||||
/* #undef const */
|
||||
|
||||
/* Define to `__inline__' or `__inline' if that's what the C compiler
|
||||
calls it, or to nothing if 'inline' is not supported under any name. */
|
||||
#ifndef __cplusplus
|
||||
/* #undef inline */
|
||||
#endif
|
30
contrib/libzookeeper/src/hashtable/LICENSE.txt
Normal file
30
contrib/libzookeeper/src/hashtable/LICENSE.txt
Normal file
@ -0,0 +1,30 @@
|
||||
Copyright (c) 2002, 2004, Christopher Clark
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the original author; nor the names of any contributors
|
||||
may be used to endorse or promote products derived from this software
|
||||
without specific prior written permission.
|
||||
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
274
contrib/libzookeeper/src/hashtable/hashtable.c
Normal file
274
contrib/libzookeeper/src/hashtable/hashtable.c
Normal file
@ -0,0 +1,274 @@
|
||||
/* Copyright (C) 2004 Christopher Clark <firstname.lastname@cl.cam.ac.uk> */
|
||||
|
||||
#include "hashtable.h"
|
||||
#include "hashtable_private.h"
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
/*
|
||||
Credit for primes table: Aaron Krowne
|
||||
http://br.endernet.org/~akrowne/
|
||||
http://planetmath.org/encyclopedia/GoodHashTablePrimes.html
|
||||
*/
|
||||
static const unsigned int primes[] = {
|
||||
53, 97, 193, 389,
|
||||
769, 1543, 3079, 6151,
|
||||
12289, 24593, 49157, 98317,
|
||||
196613, 393241, 786433, 1572869,
|
||||
3145739, 6291469, 12582917, 25165843,
|
||||
50331653, 100663319, 201326611, 402653189,
|
||||
805306457, 1610612741
|
||||
};
|
||||
const unsigned int prime_table_length = sizeof(primes)/sizeof(primes[0]);
|
||||
const float max_load_factor = 0.65;
|
||||
|
||||
/*****************************************************************************/
|
||||
struct hashtable *
|
||||
create_hashtable(unsigned int minsize,
|
||||
unsigned int (*hashf) (void*),
|
||||
int (*eqf) (void*,void*))
|
||||
{
|
||||
struct hashtable *h;
|
||||
unsigned int pindex, size = primes[0];
|
||||
/* Check requested hashtable isn't too large */
|
||||
if (minsize > (1u << 30)) return NULL;
|
||||
/* Enforce size as prime */
|
||||
for (pindex=0; pindex < prime_table_length; pindex++) {
|
||||
if (primes[pindex] > minsize) { size = primes[pindex]; break; }
|
||||
}
|
||||
h = (struct hashtable *)malloc(sizeof(struct hashtable));
|
||||
if (NULL == h) return NULL; /*oom*/
|
||||
h->table = (struct entry **)malloc(sizeof(struct entry*) * size);
|
||||
if (NULL == h->table) { free(h); return NULL; } /*oom*/
|
||||
memset(h->table, 0, size * sizeof(struct entry *));
|
||||
h->tablelength = size;
|
||||
h->primeindex = pindex;
|
||||
h->entrycount = 0;
|
||||
h->hashfn = hashf;
|
||||
h->eqfn = eqf;
|
||||
h->loadlimit = (unsigned int) ceil(size * max_load_factor);
|
||||
return h;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
unsigned int
|
||||
hash(struct hashtable *h, void *k)
|
||||
{
|
||||
/* Aim to protect against poor hash functions by adding logic here
|
||||
* - logic taken from java 1.4 hashtable source */
|
||||
unsigned int i = h->hashfn(k);
|
||||
i += ~(i << 9);
|
||||
i ^= ((i >> 14) | (i << 18)); /* >>> */
|
||||
i += (i << 4);
|
||||
i ^= ((i >> 10) | (i << 22)); /* >>> */
|
||||
return i;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static int
|
||||
hashtable_expand(struct hashtable *h)
|
||||
{
|
||||
/* Double the size of the table to accomodate more entries */
|
||||
struct entry **newtable;
|
||||
struct entry *e;
|
||||
struct entry **pE;
|
||||
unsigned int newsize, i, index;
|
||||
/* Check we're not hitting max capacity */
|
||||
if (h->primeindex == (prime_table_length - 1)) return 0;
|
||||
newsize = primes[++(h->primeindex)];
|
||||
|
||||
newtable = (struct entry **)malloc(sizeof(struct entry*) * newsize);
|
||||
if (NULL != newtable)
|
||||
{
|
||||
memset(newtable, 0, newsize * sizeof(struct entry *));
|
||||
/* This algorithm is not 'stable'. ie. it reverses the list
|
||||
* when it transfers entries between the tables */
|
||||
for (i = 0; i < h->tablelength; i++) {
|
||||
while (NULL != (e = h->table[i])) {
|
||||
h->table[i] = e->next;
|
||||
index = indexFor(newsize,e->h);
|
||||
e->next = newtable[index];
|
||||
newtable[index] = e;
|
||||
}
|
||||
}
|
||||
free(h->table);
|
||||
h->table = newtable;
|
||||
}
|
||||
/* Plan B: realloc instead */
|
||||
else
|
||||
{
|
||||
newtable = (struct entry **)
|
||||
realloc(h->table, newsize * sizeof(struct entry *));
|
||||
if (NULL == newtable) { (h->primeindex)--; return 0; }
|
||||
h->table = newtable;
|
||||
memset(newtable[h->tablelength], 0, newsize - h->tablelength);
|
||||
for (i = 0; i < h->tablelength; i++) {
|
||||
for (pE = &(newtable[i]), e = *pE; e != NULL; e = *pE) {
|
||||
index = indexFor(newsize,e->h);
|
||||
if (index == i)
|
||||
{
|
||||
pE = &(e->next);
|
||||
}
|
||||
else
|
||||
{
|
||||
*pE = e->next;
|
||||
e->next = newtable[index];
|
||||
newtable[index] = e;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
h->tablelength = newsize;
|
||||
h->loadlimit = (unsigned int) ceil(newsize * max_load_factor);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
unsigned int
|
||||
hashtable_count(struct hashtable *h)
|
||||
{
|
||||
return h->entrycount;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int
|
||||
hashtable_insert(struct hashtable *h, void *k, void *v)
|
||||
{
|
||||
/* This method allows duplicate keys - but they shouldn't be used */
|
||||
unsigned int index;
|
||||
struct entry *e;
|
||||
if (++(h->entrycount) > h->loadlimit)
|
||||
{
|
||||
/* Ignore the return value. If expand fails, we should
|
||||
* still try cramming just this value into the existing table
|
||||
* -- we may not have memory for a larger table, but one more
|
||||
* element may be ok. Next time we insert, we'll try expanding again.*/
|
||||
hashtable_expand(h);
|
||||
}
|
||||
e = (struct entry *)malloc(sizeof(struct entry));
|
||||
if (NULL == e) { --(h->entrycount); return 0; } /*oom*/
|
||||
e->h = hash(h,k);
|
||||
index = indexFor(h->tablelength,e->h);
|
||||
e->k = k;
|
||||
e->v = v;
|
||||
e->next = h->table[index];
|
||||
h->table[index] = e;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void * /* returns value associated with key */
|
||||
hashtable_search(struct hashtable *h, void *k)
|
||||
{
|
||||
struct entry *e;
|
||||
unsigned int hashvalue, index;
|
||||
hashvalue = hash(h,k);
|
||||
index = indexFor(h->tablelength,hashvalue);
|
||||
e = h->table[index];
|
||||
while (NULL != e)
|
||||
{
|
||||
/* Check hash value to short circuit heavier comparison */
|
||||
if ((hashvalue == e->h) && (h->eqfn(k, e->k))) return e->v;
|
||||
e = e->next;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
void * /* returns value associated with key */
|
||||
hashtable_remove(struct hashtable *h, void *k)
|
||||
{
|
||||
/* TODO: consider compacting the table when the load factor drops enough,
|
||||
* or provide a 'compact' method. */
|
||||
|
||||
struct entry *e;
|
||||
struct entry **pE;
|
||||
void *v;
|
||||
unsigned int hashvalue, index;
|
||||
|
||||
hashvalue = hash(h,k);
|
||||
index = indexFor(h->tablelength,hash(h,k));
|
||||
pE = &(h->table[index]);
|
||||
e = *pE;
|
||||
while (NULL != e)
|
||||
{
|
||||
/* Check hash value to short circuit heavier comparison */
|
||||
if ((hashvalue == e->h) && (h->eqfn(k, e->k)))
|
||||
{
|
||||
*pE = e->next;
|
||||
h->entrycount--;
|
||||
v = e->v;
|
||||
freekey(e->k);
|
||||
free(e);
|
||||
return v;
|
||||
}
|
||||
pE = &(e->next);
|
||||
e = e->next;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* destroy */
|
||||
void
|
||||
hashtable_destroy(struct hashtable *h, int free_values)
|
||||
{
|
||||
unsigned int i;
|
||||
struct entry *e, *f;
|
||||
struct entry **table = h->table;
|
||||
if (free_values)
|
||||
{
|
||||
for (i = 0; i < h->tablelength; i++)
|
||||
{
|
||||
e = table[i];
|
||||
while (NULL != e)
|
||||
{ f = e; e = e->next; freekey(f->k); free(f->v); free(f); }
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < h->tablelength; i++)
|
||||
{
|
||||
e = table[i];
|
||||
while (NULL != e)
|
||||
{ f = e; e = e->next; freekey(f->k); free(f); }
|
||||
}
|
||||
}
|
||||
free(h->table);
|
||||
free(h);
|
||||
}
|
||||
|
||||
/*
|
||||
* Copyright (c) 2002, Christopher Clark
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* * Neither the name of the original author; nor the names of any contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
209
contrib/libzookeeper/src/hashtable/hashtable.h
Normal file
209
contrib/libzookeeper/src/hashtable/hashtable.h
Normal file
@ -0,0 +1,209 @@
|
||||
/* Copyright (C) 2002 Christopher Clark <firstname.lastname@cl.cam.ac.uk> */
|
||||
|
||||
#ifndef __HASHTABLE_CWC22_H__
|
||||
#define __HASHTABLE_CWC22_H__
|
||||
#ifdef WIN32
|
||||
#include "winconfig.h"
|
||||
#endif
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct hashtable;
|
||||
|
||||
/* Example of use:
|
||||
*
|
||||
* struct hashtable *h;
|
||||
* struct some_key *k;
|
||||
* struct some_value *v;
|
||||
*
|
||||
* static unsigned int hash_from_key_fn( void *k );
|
||||
* static int keys_equal_fn ( void *key1, void *key2 );
|
||||
*
|
||||
* h = create_hashtable(16, hash_from_key_fn, keys_equal_fn);
|
||||
* k = (struct some_key *) malloc(sizeof(struct some_key));
|
||||
* v = (struct some_value *) malloc(sizeof(struct some_value));
|
||||
*
|
||||
* (initialise k and v to suitable values)
|
||||
*
|
||||
* if (! hashtable_insert(h,k,v) )
|
||||
* { exit(-1); }
|
||||
*
|
||||
* if (NULL == (found = hashtable_search(h,k) ))
|
||||
* { printf("not found!"); }
|
||||
*
|
||||
* if (NULL == (found = hashtable_remove(h,k) ))
|
||||
* { printf("Not found\n"); }
|
||||
*
|
||||
*/
|
||||
|
||||
/* Macros may be used to define type-safe(r) hashtable access functions, with
|
||||
* methods specialized to take known key and value types as parameters.
|
||||
*
|
||||
* Example:
|
||||
*
|
||||
* Insert this at the start of your file:
|
||||
*
|
||||
* DEFINE_HASHTABLE_INSERT(insert_some, struct some_key, struct some_value);
|
||||
* DEFINE_HASHTABLE_SEARCH(search_some, struct some_key, struct some_value);
|
||||
* DEFINE_HASHTABLE_REMOVE(remove_some, struct some_key, struct some_value);
|
||||
*
|
||||
* This defines the functions 'insert_some', 'search_some' and 'remove_some'.
|
||||
* These operate just like hashtable_insert etc., with the same parameters,
|
||||
* but their function signatures have 'struct some_key *' rather than
|
||||
* 'void *', and hence can generate compile time errors if your program is
|
||||
* supplying incorrect data as a key (and similarly for value).
|
||||
*
|
||||
* Note that the hash and key equality functions passed to create_hashtable
|
||||
* still take 'void *' parameters instead of 'some key *'. This shouldn't be
|
||||
* a difficult issue as they're only defined and passed once, and the other
|
||||
* functions will ensure that only valid keys are supplied to them.
|
||||
*
|
||||
* The cost for this checking is increased code size and runtime overhead
|
||||
* - if performance is important, it may be worth switching back to the
|
||||
* unsafe methods once your program has been debugged with the safe methods.
|
||||
* This just requires switching to some simple alternative defines - eg:
|
||||
* #define insert_some hashtable_insert
|
||||
*
|
||||
*/
|
||||
|
||||
/*****************************************************************************
|
||||
* create_hashtable
|
||||
|
||||
* @name create_hashtable
|
||||
* @param minsize minimum initial size of hashtable
|
||||
* @param hashfunction function for hashing keys
|
||||
* @param key_eq_fn function for determining key equality
|
||||
* @return newly created hashtable or NULL on failure
|
||||
*/
|
||||
|
||||
struct hashtable *
|
||||
create_hashtable(unsigned int minsize,
|
||||
unsigned int (*hashfunction) (void*),
|
||||
int (*key_eq_fn) (void*,void*));
|
||||
|
||||
/*****************************************************************************
|
||||
* hashtable_insert
|
||||
|
||||
* @name hashtable_insert
|
||||
* @param h the hashtable to insert into
|
||||
* @param k the key - hashtable claims ownership and will free on removal
|
||||
* @param v the value - does not claim ownership
|
||||
* @return non-zero for successful insertion
|
||||
*
|
||||
* This function will cause the table to expand if the insertion would take
|
||||
* the ratio of entries to table size over the maximum load factor.
|
||||
*
|
||||
* This function does not check for repeated insertions with a duplicate key.
|
||||
* The value returned when using a duplicate key is undefined -- when
|
||||
* the hashtable changes size, the order of retrieval of duplicate key
|
||||
* entries is reversed.
|
||||
* If in doubt, remove before insert.
|
||||
*/
|
||||
|
||||
int
|
||||
hashtable_insert(struct hashtable *h, void *k, void *v);
|
||||
|
||||
#define DEFINE_HASHTABLE_INSERT(fnname, keytype, valuetype) \
|
||||
int fnname (struct hashtable *h, keytype *k, valuetype *v) \
|
||||
{ \
|
||||
return hashtable_insert(h,k,v); \
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* hashtable_search
|
||||
|
||||
* @name hashtable_search
|
||||
* @param h the hashtable to search
|
||||
* @param k the key to search for - does not claim ownership
|
||||
* @return the value associated with the key, or NULL if none found
|
||||
*/
|
||||
|
||||
void *
|
||||
hashtable_search(struct hashtable *h, void *k);
|
||||
|
||||
#define DEFINE_HASHTABLE_SEARCH(fnname, keytype, valuetype) \
|
||||
valuetype * fnname (struct hashtable *h, keytype *k) \
|
||||
{ \
|
||||
return (valuetype *) (hashtable_search(h,k)); \
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* hashtable_remove
|
||||
|
||||
* @name hashtable_remove
|
||||
* @param h the hashtable to remove the item from
|
||||
* @param k the key to search for - does not claim ownership
|
||||
* @return the value associated with the key, or NULL if none found
|
||||
*/
|
||||
|
||||
void * /* returns value */
|
||||
hashtable_remove(struct hashtable *h, void *k);
|
||||
|
||||
#define DEFINE_HASHTABLE_REMOVE(fnname, keytype, valuetype) \
|
||||
valuetype * fnname (struct hashtable *h, keytype *k) \
|
||||
{ \
|
||||
return (valuetype *) (hashtable_remove(h,k)); \
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* hashtable_count
|
||||
|
||||
* @name hashtable_count
|
||||
* @param h the hashtable
|
||||
* @return the number of items stored in the hashtable
|
||||
*/
|
||||
unsigned int
|
||||
hashtable_count(struct hashtable *h);
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* hashtable_destroy
|
||||
|
||||
* @name hashtable_destroy
|
||||
* @param h the hashtable
|
||||
* @param free_values whether to call 'free' on the remaining values
|
||||
*/
|
||||
|
||||
void
|
||||
hashtable_destroy(struct hashtable *h, int free_values);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __HASHTABLE_CWC22_H__ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2002, Christopher Clark
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* * Neither the name of the original author; nor the names of any contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
176
contrib/libzookeeper/src/hashtable/hashtable_itr.c
Normal file
176
contrib/libzookeeper/src/hashtable/hashtable_itr.c
Normal file
@ -0,0 +1,176 @@
|
||||
/* Copyright (C) 2002, 2004 Christopher Clark <firstname.lastname@cl.cam.ac.uk> */
|
||||
|
||||
#include "hashtable.h"
|
||||
#include "hashtable_private.h"
|
||||
#include "hashtable_itr.h"
|
||||
#include <stdlib.h> /* defines NULL */
|
||||
|
||||
/*****************************************************************************/
|
||||
/* hashtable_iterator - iterator constructor */
|
||||
|
||||
struct hashtable_itr *
|
||||
hashtable_iterator(struct hashtable *h)
|
||||
{
|
||||
unsigned int i, tablelength;
|
||||
struct hashtable_itr *itr = (struct hashtable_itr *)
|
||||
malloc(sizeof(struct hashtable_itr));
|
||||
if (NULL == itr) return NULL;
|
||||
itr->h = h;
|
||||
itr->e = NULL;
|
||||
itr->parent = NULL;
|
||||
tablelength = h->tablelength;
|
||||
itr->index = tablelength;
|
||||
if (0 == h->entrycount) return itr;
|
||||
|
||||
for (i = 0; i < tablelength; i++)
|
||||
{
|
||||
if (NULL != h->table[i])
|
||||
{
|
||||
itr->e = h->table[i];
|
||||
itr->index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return itr;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* advance - advance the iterator to the next element
|
||||
* returns zero if advanced to end of table */
|
||||
|
||||
int
|
||||
hashtable_iterator_advance(struct hashtable_itr *itr)
|
||||
{
|
||||
unsigned int j,tablelength;
|
||||
struct entry **table;
|
||||
struct entry *next;
|
||||
if (NULL == itr->e) return 0; /* stupidity check */
|
||||
|
||||
next = itr->e->next;
|
||||
if (NULL != next)
|
||||
{
|
||||
itr->parent = itr->e;
|
||||
itr->e = next;
|
||||
return -1;
|
||||
}
|
||||
tablelength = itr->h->tablelength;
|
||||
itr->parent = NULL;
|
||||
if (tablelength <= (j = ++(itr->index)))
|
||||
{
|
||||
itr->e = NULL;
|
||||
return 0;
|
||||
}
|
||||
table = itr->h->table;
|
||||
while (NULL == (next = table[j]))
|
||||
{
|
||||
if (++j >= tablelength)
|
||||
{
|
||||
itr->index = tablelength;
|
||||
itr->e = NULL;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
itr->index = j;
|
||||
itr->e = next;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* remove - remove the entry at the current iterator position
|
||||
* and advance the iterator, if there is a successive
|
||||
* element.
|
||||
* If you want the value, read it before you remove:
|
||||
* beware memory leaks if you don't.
|
||||
* Returns zero if end of iteration. */
|
||||
|
||||
int
|
||||
hashtable_iterator_remove(struct hashtable_itr *itr)
|
||||
{
|
||||
struct entry *remember_e, *remember_parent;
|
||||
int ret;
|
||||
|
||||
/* Do the removal */
|
||||
if (NULL == (itr->parent))
|
||||
{
|
||||
/* element is head of a chain */
|
||||
itr->h->table[itr->index] = itr->e->next;
|
||||
} else {
|
||||
/* element is mid-chain */
|
||||
itr->parent->next = itr->e->next;
|
||||
}
|
||||
/* itr->e is now outside the hashtable */
|
||||
remember_e = itr->e;
|
||||
itr->h->entrycount--;
|
||||
freekey(remember_e->k);
|
||||
|
||||
/* Advance the iterator, correcting the parent */
|
||||
remember_parent = itr->parent;
|
||||
ret = hashtable_iterator_advance(itr);
|
||||
if (itr->parent == remember_e) { itr->parent = remember_parent; }
|
||||
free(remember_e);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
int /* returns zero if not found */
|
||||
hashtable_iterator_search(struct hashtable_itr *itr,
|
||||
struct hashtable *h, void *k)
|
||||
{
|
||||
struct entry *e, *parent;
|
||||
unsigned int hashvalue, index;
|
||||
|
||||
hashvalue = hash(h,k);
|
||||
index = indexFor(h->tablelength,hashvalue);
|
||||
|
||||
e = h->table[index];
|
||||
parent = NULL;
|
||||
while (NULL != e)
|
||||
{
|
||||
/* Check hash value to short circuit heavier comparison */
|
||||
if ((hashvalue == e->h) && (h->eqfn(k, e->k)))
|
||||
{
|
||||
itr->index = index;
|
||||
itr->e = e;
|
||||
itr->parent = parent;
|
||||
itr->h = h;
|
||||
return -1;
|
||||
}
|
||||
parent = e;
|
||||
e = e->next;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Copyright (c) 2002, 2004, Christopher Clark
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* * Neither the name of the original author; nor the names of any contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
119
contrib/libzookeeper/src/hashtable/hashtable_itr.h
Normal file
119
contrib/libzookeeper/src/hashtable/hashtable_itr.h
Normal file
@ -0,0 +1,119 @@
|
||||
/* Copyright (C) 2002, 2004 Christopher Clark <firstname.lastname@cl.cam.ac.uk> */
|
||||
|
||||
#ifndef __HASHTABLE_ITR_CWC22__
|
||||
#define __HASHTABLE_ITR_CWC22__
|
||||
#include "hashtable.h"
|
||||
#include "hashtable_private.h" /* needed to enable inlining */
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*****************************************************************************/
|
||||
/* This struct is only concrete here to allow the inlining of two of the
|
||||
* accessor functions. */
|
||||
struct hashtable_itr
|
||||
{
|
||||
struct hashtable *h;
|
||||
struct entry *e;
|
||||
struct entry *parent;
|
||||
unsigned int index;
|
||||
};
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/* hashtable_iterator
|
||||
*/
|
||||
|
||||
struct hashtable_itr *
|
||||
hashtable_iterator(struct hashtable *h);
|
||||
|
||||
/*****************************************************************************/
|
||||
/* hashtable_iterator_key
|
||||
* - return the value of the (key,value) pair at the current position */
|
||||
|
||||
static inline void *
|
||||
hashtable_iterator_key(struct hashtable_itr *i)
|
||||
{
|
||||
return i->e->k;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* value - return the value of the (key,value) pair at the current position */
|
||||
|
||||
static inline void *
|
||||
hashtable_iterator_value(struct hashtable_itr *i)
|
||||
{
|
||||
return i->e->v;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* advance - advance the iterator to the next element
|
||||
* returns zero if advanced to end of table */
|
||||
|
||||
int
|
||||
hashtable_iterator_advance(struct hashtable_itr *itr);
|
||||
|
||||
/*****************************************************************************/
|
||||
/* remove - remove current element and advance the iterator to the next element
|
||||
* NB: if you need the value to free it, read it before
|
||||
* removing. ie: beware memory leaks!
|
||||
* returns zero if advanced to end of table */
|
||||
|
||||
int
|
||||
hashtable_iterator_remove(struct hashtable_itr *itr);
|
||||
|
||||
/*****************************************************************************/
|
||||
/* search - overwrite the supplied iterator, to point to the entry
|
||||
* matching the supplied key.
|
||||
h points to the hashtable to be searched.
|
||||
* returns zero if not found. */
|
||||
int
|
||||
hashtable_iterator_search(struct hashtable_itr *itr,
|
||||
struct hashtable *h, void *k);
|
||||
|
||||
#define DEFINE_HASHTABLE_ITERATOR_SEARCH(fnname, keytype) \
|
||||
int fnname (struct hashtable_itr *i, struct hashtable *h, keytype *k) \
|
||||
{ \
|
||||
return (hashtable_iterator_search(i,h,k)); \
|
||||
}
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __HASHTABLE_ITR_CWC22__*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2002, 2004, Christopher Clark
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* * Neither the name of the original author; nor the names of any contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
85
contrib/libzookeeper/src/hashtable/hashtable_private.h
Normal file
85
contrib/libzookeeper/src/hashtable/hashtable_private.h
Normal file
@ -0,0 +1,85 @@
|
||||
/* Copyright (C) 2002, 2004 Christopher Clark <firstname.lastname@cl.cam.ac.uk> */
|
||||
|
||||
#ifndef __HASHTABLE_PRIVATE_CWC22_H__
|
||||
#define __HASHTABLE_PRIVATE_CWC22_H__
|
||||
|
||||
#include "hashtable.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
struct entry
|
||||
{
|
||||
void *k, *v;
|
||||
unsigned int h;
|
||||
struct entry *next;
|
||||
};
|
||||
|
||||
struct hashtable {
|
||||
unsigned int tablelength;
|
||||
struct entry **table;
|
||||
unsigned int entrycount;
|
||||
unsigned int loadlimit;
|
||||
unsigned int primeindex;
|
||||
unsigned int (*hashfn) (void *k);
|
||||
int (*eqfn) (void *k1, void *k2);
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
unsigned int
|
||||
hash(struct hashtable *h, void *k);
|
||||
|
||||
/*****************************************************************************/
|
||||
/* indexFor */
|
||||
static inline unsigned int
|
||||
indexFor(unsigned int tablelength, unsigned int hashvalue) {
|
||||
return (hashvalue % tablelength);
|
||||
};
|
||||
|
||||
/* Only works if tablelength == 2^N */
|
||||
/*static inline unsigned int
|
||||
indexFor(unsigned int tablelength, unsigned int hashvalue)
|
||||
{
|
||||
return (hashvalue & (tablelength - 1u));
|
||||
}
|
||||
*/
|
||||
|
||||
/*****************************************************************************/
|
||||
#define freekey(X) free(X)
|
||||
/*define freekey(X) ; */
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#endif /* __HASHTABLE_PRIVATE_CWC22_H__*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2002, Christopher Clark
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* * Neither the name of the original author; nor the names of any contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
536
contrib/libzookeeper/src/mt_adaptor.c
Normal file
536
contrib/libzookeeper/src/mt_adaptor.c
Normal file
@ -0,0 +1,536 @@
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef THREADED
|
||||
#define THREADED
|
||||
#endif
|
||||
|
||||
#ifndef DLL_EXPORT
|
||||
# define USE_STATIC_LIB
|
||||
#endif
|
||||
|
||||
#ifndef _GNU_SOURCE
|
||||
#define _GNU_SOURCE
|
||||
#endif
|
||||
|
||||
#include "zk_adaptor.h"
|
||||
#include "zookeeper_log.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#include <fcntl.h>
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
|
||||
#ifndef WIN32
|
||||
#include <signal.h>
|
||||
#include <poll.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
|
||||
int zoo_lock_auth(zhandle_t *zh)
|
||||
{
|
||||
return pthread_mutex_lock(&zh->auth_h.lock);
|
||||
}
|
||||
int zoo_unlock_auth(zhandle_t *zh)
|
||||
{
|
||||
return pthread_mutex_unlock(&zh->auth_h.lock);
|
||||
}
|
||||
int lock_buffer_list(buffer_head_t *l)
|
||||
{
|
||||
return pthread_mutex_lock(&l->lock);
|
||||
}
|
||||
int unlock_buffer_list(buffer_head_t *l)
|
||||
{
|
||||
return pthread_mutex_unlock(&l->lock);
|
||||
}
|
||||
int lock_completion_list(completion_head_t *l)
|
||||
{
|
||||
return pthread_mutex_lock(&l->lock);
|
||||
}
|
||||
int unlock_completion_list(completion_head_t *l)
|
||||
{
|
||||
pthread_cond_broadcast(&l->cond);
|
||||
return pthread_mutex_unlock(&l->lock);
|
||||
}
|
||||
struct sync_completion *alloc_sync_completion(void)
|
||||
{
|
||||
struct sync_completion *sc = (struct sync_completion*)calloc(1, sizeof(struct sync_completion));
|
||||
if (sc) {
|
||||
pthread_cond_init(&sc->cond, 0);
|
||||
pthread_mutex_init(&sc->lock, 0);
|
||||
}
|
||||
return sc;
|
||||
}
|
||||
int wait_sync_completion(struct sync_completion *sc)
|
||||
{
|
||||
pthread_mutex_lock(&sc->lock);
|
||||
while (!sc->complete) {
|
||||
pthread_cond_wait(&sc->cond, &sc->lock);
|
||||
}
|
||||
pthread_mutex_unlock(&sc->lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void free_sync_completion(struct sync_completion *sc)
|
||||
{
|
||||
if (sc) {
|
||||
pthread_mutex_destroy(&sc->lock);
|
||||
pthread_cond_destroy(&sc->cond);
|
||||
free(sc);
|
||||
}
|
||||
}
|
||||
|
||||
void notify_sync_completion(struct sync_completion *sc)
|
||||
{
|
||||
pthread_mutex_lock(&sc->lock);
|
||||
sc->complete = 1;
|
||||
pthread_cond_broadcast(&sc->cond);
|
||||
pthread_mutex_unlock(&sc->lock);
|
||||
}
|
||||
|
||||
int process_async(int outstanding_sync)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef WIN32
|
||||
unsigned __stdcall do_io( void * );
|
||||
unsigned __stdcall do_completion( void * );
|
||||
|
||||
int handle_error(SOCKET sock, char* message)
|
||||
{
|
||||
LOG_ERROR(("%s. %d",message, WSAGetLastError()));
|
||||
closesocket (sock);
|
||||
return -1;
|
||||
}
|
||||
|
||||
//--create socket pair for interupting selects.
|
||||
int create_socket_pair(SOCKET fds[2])
|
||||
{
|
||||
struct sockaddr_in inaddr;
|
||||
struct sockaddr addr;
|
||||
int yes=1;
|
||||
int len=0;
|
||||
|
||||
SOCKET lst=socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);
|
||||
if (lst == INVALID_SOCKET ){
|
||||
LOG_ERROR(("Error creating socket. %d",WSAGetLastError()));
|
||||
return -1;
|
||||
}
|
||||
memset(&inaddr, 0, sizeof(inaddr));
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
inaddr.sin_family = AF_INET;
|
||||
inaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
|
||||
inaddr.sin_port = 0; //--system assigns the port
|
||||
|
||||
if ( setsockopt(lst,SOL_SOCKET,SO_REUSEADDR,(char*)&yes,sizeof(yes)) == SOCKET_ERROR ) {
|
||||
return handle_error(lst,"Error trying to set socket option.");
|
||||
}
|
||||
if (bind(lst,(struct sockaddr *)&inaddr,sizeof(inaddr)) == SOCKET_ERROR){
|
||||
return handle_error(lst,"Error trying to bind socket.");
|
||||
}
|
||||
if (listen(lst,1) == SOCKET_ERROR){
|
||||
return handle_error(lst,"Error trying to listen on socket.");
|
||||
}
|
||||
len=sizeof(inaddr);
|
||||
getsockname(lst, &addr,&len);
|
||||
fds[0]=socket(AF_INET, SOCK_STREAM,0);
|
||||
if (connect(fds[0],&addr,len) == SOCKET_ERROR){
|
||||
return handle_error(lst, "Error while connecting to socket.");
|
||||
}
|
||||
if ((fds[1]=accept(lst,0,0)) == INVALID_SOCKET){
|
||||
closesocket(fds[0]);
|
||||
return handle_error(lst, "Error while accepting socket connection.");
|
||||
}
|
||||
closesocket(lst);
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
void *do_io(void *);
|
||||
void *do_completion(void *);
|
||||
#endif
|
||||
|
||||
|
||||
int wakeup_io_thread(zhandle_t *zh);
|
||||
|
||||
#ifdef WIN32
|
||||
static int set_nonblock(SOCKET fd){
|
||||
ULONG nonblocking_flag = 1;
|
||||
if (ioctlsocket(fd, FIONBIO, &nonblocking_flag) == 0)
|
||||
return 1;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
#else
|
||||
static int set_nonblock(int fd){
|
||||
long l = fcntl(fd, F_GETFL);
|
||||
if(l & O_NONBLOCK) return 0;
|
||||
return fcntl(fd, F_SETFL, l | O_NONBLOCK);
|
||||
}
|
||||
#endif
|
||||
|
||||
void wait_for_others(zhandle_t* zh)
|
||||
{
|
||||
struct adaptor_threads* adaptor=zh->adaptor_priv;
|
||||
pthread_mutex_lock(&adaptor->lock);
|
||||
while(adaptor->threadsToWait>0)
|
||||
pthread_cond_wait(&adaptor->cond,&adaptor->lock);
|
||||
pthread_mutex_unlock(&adaptor->lock);
|
||||
}
|
||||
|
||||
void notify_thread_ready(zhandle_t* zh)
|
||||
{
|
||||
struct adaptor_threads* adaptor=zh->adaptor_priv;
|
||||
pthread_mutex_lock(&adaptor->lock);
|
||||
adaptor->threadsToWait--;
|
||||
pthread_cond_broadcast(&adaptor->cond);
|
||||
while(adaptor->threadsToWait>0)
|
||||
pthread_cond_wait(&adaptor->cond,&adaptor->lock);
|
||||
pthread_mutex_unlock(&adaptor->lock);
|
||||
}
|
||||
|
||||
|
||||
void start_threads(zhandle_t* zh)
|
||||
{
|
||||
int rc = 0;
|
||||
struct adaptor_threads* adaptor=zh->adaptor_priv;
|
||||
pthread_cond_init(&adaptor->cond,0);
|
||||
pthread_mutex_init(&adaptor->lock,0);
|
||||
adaptor->threadsToWait=2; // wait for 2 threads before opening the barrier
|
||||
|
||||
// use api_prolog() to make sure zhandle doesn't get destroyed
|
||||
// while initialization is in progress
|
||||
api_prolog(zh);
|
||||
LOG_DEBUG(("starting threads..."));
|
||||
rc=pthread_create(&adaptor->io, 0, do_io, zh);
|
||||
assert("pthread_create() failed for the IO thread"&&!rc);
|
||||
rc=pthread_create(&adaptor->completion, 0, do_completion, zh);
|
||||
assert("pthread_create() failed for the completion thread"&&!rc);
|
||||
wait_for_others(zh);
|
||||
api_epilog(zh, 0);
|
||||
}
|
||||
|
||||
int adaptor_init(zhandle_t *zh)
|
||||
{
|
||||
pthread_mutexattr_t recursive_mx_attr;
|
||||
struct adaptor_threads *adaptor_threads = calloc(1, sizeof(*adaptor_threads));
|
||||
if (!adaptor_threads) {
|
||||
LOG_ERROR(("Out of memory"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* We use a pipe for interrupting select() in unix/sol and socketpair in windows. */
|
||||
#ifdef WIN32
|
||||
if (create_socket_pair(adaptor_threads->self_pipe) == -1){
|
||||
LOG_ERROR(("Can't make a socket."));
|
||||
#else
|
||||
if(pipe(adaptor_threads->self_pipe)==-1) {
|
||||
LOG_ERROR(("Can't make a pipe %d",errno));
|
||||
#endif
|
||||
free(adaptor_threads);
|
||||
return -1;
|
||||
}
|
||||
set_nonblock(adaptor_threads->self_pipe[1]);
|
||||
set_nonblock(adaptor_threads->self_pipe[0]);
|
||||
|
||||
pthread_mutex_init(&zh->auth_h.lock,0);
|
||||
|
||||
zh->adaptor_priv = adaptor_threads;
|
||||
pthread_mutex_init(&zh->to_process.lock,0);
|
||||
pthread_mutex_init(&adaptor_threads->zh_lock,0);
|
||||
// to_send must be recursive mutex
|
||||
pthread_mutexattr_init(&recursive_mx_attr);
|
||||
pthread_mutexattr_settype(&recursive_mx_attr, PTHREAD_MUTEX_RECURSIVE);
|
||||
pthread_mutex_init(&zh->to_send.lock,&recursive_mx_attr);
|
||||
pthread_mutexattr_destroy(&recursive_mx_attr);
|
||||
|
||||
pthread_mutex_init(&zh->sent_requests.lock,0);
|
||||
pthread_cond_init(&zh->sent_requests.cond,0);
|
||||
pthread_mutex_init(&zh->completions_to_process.lock,0);
|
||||
pthread_cond_init(&zh->completions_to_process.cond,0);
|
||||
start_threads(zh);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void adaptor_finish(zhandle_t *zh)
|
||||
{
|
||||
struct adaptor_threads *adaptor_threads;
|
||||
// make sure zh doesn't get destroyed until after we're done here
|
||||
api_prolog(zh);
|
||||
adaptor_threads = zh->adaptor_priv;
|
||||
if(adaptor_threads==0) {
|
||||
api_epilog(zh,0);
|
||||
return;
|
||||
}
|
||||
|
||||
if(!pthread_equal(adaptor_threads->io,pthread_self())){
|
||||
wakeup_io_thread(zh);
|
||||
pthread_join(adaptor_threads->io, 0);
|
||||
}else
|
||||
pthread_detach(adaptor_threads->io);
|
||||
|
||||
if(!pthread_equal(adaptor_threads->completion,pthread_self())){
|
||||
pthread_mutex_lock(&zh->completions_to_process.lock);
|
||||
pthread_cond_broadcast(&zh->completions_to_process.cond);
|
||||
pthread_mutex_unlock(&zh->completions_to_process.lock);
|
||||
pthread_join(adaptor_threads->completion, 0);
|
||||
}else
|
||||
pthread_detach(adaptor_threads->completion);
|
||||
|
||||
api_epilog(zh,0);
|
||||
}
|
||||
|
||||
void adaptor_destroy(zhandle_t *zh)
|
||||
{
|
||||
struct adaptor_threads *adaptor = zh->adaptor_priv;
|
||||
if(adaptor==0) return;
|
||||
|
||||
pthread_cond_destroy(&adaptor->cond);
|
||||
pthread_mutex_destroy(&adaptor->lock);
|
||||
pthread_mutex_destroy(&zh->to_process.lock);
|
||||
pthread_mutex_destroy(&zh->to_send.lock);
|
||||
pthread_mutex_destroy(&zh->sent_requests.lock);
|
||||
pthread_cond_destroy(&zh->sent_requests.cond);
|
||||
pthread_mutex_destroy(&zh->completions_to_process.lock);
|
||||
pthread_cond_destroy(&zh->completions_to_process.cond);
|
||||
pthread_mutex_destroy(&adaptor->zh_lock);
|
||||
|
||||
pthread_mutex_destroy(&zh->auth_h.lock);
|
||||
|
||||
close(adaptor->self_pipe[0]);
|
||||
close(adaptor->self_pipe[1]);
|
||||
free(adaptor);
|
||||
zh->adaptor_priv=0;
|
||||
}
|
||||
|
||||
int wakeup_io_thread(zhandle_t *zh)
|
||||
{
|
||||
struct adaptor_threads *adaptor_threads = zh->adaptor_priv;
|
||||
char c=0;
|
||||
#ifndef WIN32
|
||||
return write(adaptor_threads->self_pipe[1],&c,1)==1? ZOK: ZSYSTEMERROR;
|
||||
#else
|
||||
return send(adaptor_threads->self_pipe[1], &c, 1, 0)==1? ZOK: ZSYSTEMERROR;
|
||||
#endif
|
||||
}
|
||||
|
||||
int adaptor_send_queue(zhandle_t *zh, int timeout)
|
||||
{
|
||||
if(!zh->close_requested)
|
||||
return wakeup_io_thread(zh);
|
||||
// don't rely on the IO thread to send the messages if the app has
|
||||
// requested to close
|
||||
return flush_send_queue(zh, timeout);
|
||||
}
|
||||
|
||||
/* These two are declared here because we will run the event loop
|
||||
* and not the client */
|
||||
#ifdef WIN32
|
||||
int zookeeper_interest(zhandle_t *zh, SOCKET *fd, int *interest,
|
||||
struct timeval *tv);
|
||||
#else
|
||||
int zookeeper_interest(zhandle_t *zh, int *fd, int *interest,
|
||||
struct timeval *tv);
|
||||
#endif
|
||||
int zookeeper_process(zhandle_t *zh, int events);
|
||||
|
||||
#ifdef WIN32
|
||||
unsigned __stdcall do_io( void * v)
|
||||
#else
|
||||
void *do_io(void *v)
|
||||
#endif
|
||||
{
|
||||
zhandle_t *zh = (zhandle_t*)v;
|
||||
#ifndef WIN32
|
||||
struct pollfd fds[2];
|
||||
struct adaptor_threads *adaptor_threads = zh->adaptor_priv;
|
||||
|
||||
api_prolog(zh);
|
||||
notify_thread_ready(zh);
|
||||
LOG_DEBUG(("started IO thread"));
|
||||
fds[0].fd=adaptor_threads->self_pipe[0];
|
||||
fds[0].events=POLLIN;
|
||||
while(!zh->close_requested) {
|
||||
struct timeval tv;
|
||||
int fd;
|
||||
int interest;
|
||||
int timeout;
|
||||
int maxfd=1;
|
||||
int rc;
|
||||
|
||||
zookeeper_interest(zh, &fd, &interest, &tv);
|
||||
if (fd != -1) {
|
||||
fds[1].fd=fd;
|
||||
fds[1].events=(interest&ZOOKEEPER_READ)?POLLIN:0;
|
||||
fds[1].events|=(interest&ZOOKEEPER_WRITE)?POLLOUT:0;
|
||||
maxfd=2;
|
||||
}
|
||||
timeout=tv.tv_sec * 1000 + (tv.tv_usec/1000);
|
||||
|
||||
poll(fds,maxfd,timeout);
|
||||
if (fd != -1) {
|
||||
interest=(fds[1].revents&POLLIN)?ZOOKEEPER_READ:0;
|
||||
interest|=((fds[1].revents&POLLOUT)||(fds[1].revents&POLLHUP))?ZOOKEEPER_WRITE:0;
|
||||
}
|
||||
if(fds[0].revents&POLLIN){
|
||||
// flush the pipe
|
||||
char b[128];
|
||||
while(read(adaptor_threads->self_pipe[0],b,sizeof(b))==sizeof(b)){}
|
||||
}
|
||||
#else
|
||||
fd_set rfds, wfds, efds;
|
||||
struct adaptor_threads *adaptor_threads = zh->adaptor_priv;
|
||||
api_prolog(zh);
|
||||
notify_thread_ready(zh);
|
||||
LOG_DEBUG(("started IO thread"));
|
||||
FD_ZERO(&rfds); FD_ZERO(&wfds); FD_ZERO(&efds);
|
||||
while(!zh->close_requested) {
|
||||
struct timeval tv;
|
||||
SOCKET fd;
|
||||
SOCKET maxfd=adaptor_threads->self_pipe[0];
|
||||
int interest;
|
||||
int rc;
|
||||
|
||||
zookeeper_interest(zh, &fd, &interest, &tv);
|
||||
if (fd != -1) {
|
||||
if (interest&ZOOKEEPER_READ) {
|
||||
FD_SET(fd, &rfds);
|
||||
} else {
|
||||
FD_CLR(fd, &rfds);
|
||||
}
|
||||
if (interest&ZOOKEEPER_WRITE) {
|
||||
FD_SET(fd, &wfds);
|
||||
} else {
|
||||
FD_CLR(fd, &wfds);
|
||||
}
|
||||
}
|
||||
FD_SET( adaptor_threads->self_pipe[0] ,&rfds );
|
||||
rc = select((int)maxfd, &rfds, &wfds, &efds, &tv);
|
||||
if (fd != -1)
|
||||
{
|
||||
interest = (FD_ISSET(fd, &rfds))? ZOOKEEPER_READ:0;
|
||||
interest|= (FD_ISSET(fd, &wfds))? ZOOKEEPER_WRITE:0;
|
||||
}
|
||||
|
||||
if (FD_ISSET(adaptor_threads->self_pipe[0], &rfds)){
|
||||
// flush the pipe/socket
|
||||
char b[128];
|
||||
while(recv(adaptor_threads->self_pipe[0],b,sizeof(b), 0)==sizeof(b)){}
|
||||
}
|
||||
#endif
|
||||
// dispatch zookeeper events
|
||||
rc = zookeeper_process(zh, interest);
|
||||
// check the current state of the zhandle and terminate
|
||||
// if it is_unrecoverable()
|
||||
if(is_unrecoverable(zh))
|
||||
break;
|
||||
}
|
||||
api_epilog(zh, 0);
|
||||
LOG_DEBUG(("IO thread terminated"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef WIN32
|
||||
unsigned __stdcall do_completion( void * v)
|
||||
#else
|
||||
void *do_completion(void *v)
|
||||
#endif
|
||||
{
|
||||
zhandle_t *zh = v;
|
||||
api_prolog(zh);
|
||||
notify_thread_ready(zh);
|
||||
LOG_DEBUG(("started completion thread"));
|
||||
while(!zh->close_requested) {
|
||||
pthread_mutex_lock(&zh->completions_to_process.lock);
|
||||
while(!zh->completions_to_process.head && !zh->close_requested) {
|
||||
pthread_cond_wait(&zh->completions_to_process.cond, &zh->completions_to_process.lock);
|
||||
}
|
||||
pthread_mutex_unlock(&zh->completions_to_process.lock);
|
||||
process_completions(zh);
|
||||
}
|
||||
api_epilog(zh, 0);
|
||||
LOG_DEBUG(("completion thread terminated"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32_t inc_ref_counter(zhandle_t* zh,int i)
|
||||
{
|
||||
int incr=(i<0?-1:(i>0?1:0));
|
||||
// fetch_and_add implements atomic post-increment
|
||||
int v=fetch_and_add(&zh->ref_counter,incr);
|
||||
// inc_ref_counter wants pre-increment
|
||||
v+=incr; // simulate pre-increment
|
||||
return v;
|
||||
}
|
||||
|
||||
int32_t fetch_and_add(volatile int32_t* operand, int incr)
|
||||
{
|
||||
#ifndef WIN32
|
||||
int32_t result;
|
||||
asm __volatile__(
|
||||
"lock xaddl %0,%1\n"
|
||||
: "=r"(result), "=m"(*(int *)operand)
|
||||
: "0"(incr)
|
||||
: "memory");
|
||||
return result;
|
||||
#else
|
||||
volatile int32_t result;
|
||||
_asm
|
||||
{
|
||||
mov eax, operand; //eax = v;
|
||||
mov ebx, incr; // ebx = i;
|
||||
mov ecx, 0x0; // ecx = 0;
|
||||
lock xadd dword ptr [eax], ecx;
|
||||
lock xadd dword ptr [eax], ebx;
|
||||
mov result, ecx; // result = ebx;
|
||||
}
|
||||
return result;
|
||||
#endif
|
||||
}
|
||||
|
||||
// make sure the static xid is initialized before any threads started
|
||||
__attribute__((constructor)) int32_t get_xid()
|
||||
{
|
||||
static int32_t xid = -1;
|
||||
if (xid == -1) {
|
||||
xid = time(0);
|
||||
}
|
||||
return fetch_and_add(&xid,1);
|
||||
}
|
||||
|
||||
int enter_critical(zhandle_t* zh)
|
||||
{
|
||||
struct adaptor_threads *adaptor = zh->adaptor_priv;
|
||||
if (adaptor) {
|
||||
return pthread_mutex_lock(&adaptor->zh_lock);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
int leave_critical(zhandle_t* zh)
|
||||
{
|
||||
struct adaptor_threads *adaptor = zh->adaptor_priv;
|
||||
if (adaptor) {
|
||||
return pthread_mutex_unlock(&adaptor->zh_lock);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
360
contrib/libzookeeper/src/recordio.c
Normal file
360
contrib/libzookeeper/src/recordio.c
Normal file
@ -0,0 +1,360 @@
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <recordio.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#ifndef WIN32
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
|
||||
void deallocate_String(char **s)
|
||||
{
|
||||
if (*s)
|
||||
free(*s);
|
||||
*s = 0;
|
||||
}
|
||||
|
||||
void deallocate_Buffer(struct buffer *b)
|
||||
{
|
||||
if (b->buff)
|
||||
free(b->buff);
|
||||
b->buff = 0;
|
||||
}
|
||||
|
||||
struct buff_struct {
|
||||
int32_t len;
|
||||
int32_t off;
|
||||
char *buffer;
|
||||
};
|
||||
|
||||
static int resize_buffer(struct buff_struct *s, int newlen)
|
||||
{
|
||||
char *buffer= NULL;
|
||||
while (s->len < newlen) {
|
||||
s->len *= 2;
|
||||
}
|
||||
buffer = (char*)realloc(s->buffer, s->len);
|
||||
if (!buffer) {
|
||||
s->buffer = 0;
|
||||
return -ENOMEM;
|
||||
}
|
||||
s->buffer = buffer;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int oa_start_record(struct oarchive *oa, const char *tag)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
int oa_end_record(struct oarchive *oa, const char *tag)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
int oa_serialize_int(struct oarchive *oa, const char *tag, const int32_t *d)
|
||||
{
|
||||
struct buff_struct *priv = oa->priv;
|
||||
int32_t i = htonl(*d);
|
||||
if ((priv->len - priv->off) < sizeof(i)) {
|
||||
int rc = resize_buffer(priv, priv->len + sizeof(i));
|
||||
if (rc < 0) return rc;
|
||||
}
|
||||
memcpy(priv->buffer+priv->off, &i, sizeof(i));
|
||||
priv->off+=sizeof(i);
|
||||
return 0;
|
||||
}
|
||||
int64_t zoo_htonll(int64_t v)
|
||||
{
|
||||
int i = 0;
|
||||
char *s = (char *)&v;
|
||||
if (htonl(1) == 1) {
|
||||
return v;
|
||||
}
|
||||
for (i = 0; i < 4; i++) {
|
||||
int tmp = s[i];
|
||||
s[i] = s[8-i-1];
|
||||
s[8-i-1] = tmp;
|
||||
}
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
int oa_serialize_long(struct oarchive *oa, const char *tag, const int64_t *d)
|
||||
{
|
||||
const int64_t i = zoo_htonll(*d);
|
||||
struct buff_struct *priv = oa->priv;
|
||||
if ((priv->len - priv->off) < sizeof(i)) {
|
||||
int rc = resize_buffer(priv, priv->len + sizeof(i));
|
||||
if (rc < 0) return rc;
|
||||
}
|
||||
memcpy(priv->buffer+priv->off, &i, sizeof(i));
|
||||
priv->off+=sizeof(i);
|
||||
return 0;
|
||||
}
|
||||
int oa_start_vector(struct oarchive *oa, const char *tag, const int32_t *count)
|
||||
{
|
||||
return oa_serialize_int(oa, tag, count);
|
||||
}
|
||||
int oa_end_vector(struct oarchive *oa, const char *tag)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
int oa_serialize_bool(struct oarchive *oa, const char *name, const int32_t *i)
|
||||
{
|
||||
//return oa_serialize_int(oa, name, i);
|
||||
struct buff_struct *priv = oa->priv;
|
||||
if ((priv->len - priv->off) < 1) {
|
||||
int rc = resize_buffer(priv, priv->len + 1);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
}
|
||||
priv->buffer[priv->off] = (*i == 0 ? '\0' : '\1');
|
||||
priv->off++;
|
||||
return 0;
|
||||
}
|
||||
static const int32_t negone = -1;
|
||||
int oa_serialize_buffer(struct oarchive *oa, const char *name,
|
||||
const struct buffer *b)
|
||||
{
|
||||
struct buff_struct *priv = oa->priv;
|
||||
int rc;
|
||||
if (!b) {
|
||||
return oa_serialize_int(oa, "len", &negone);
|
||||
}
|
||||
rc = oa_serialize_int(oa, "len", &b->len);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
// this means a buffer of NUll
|
||||
// with size of -1. This is
|
||||
// waht we use in java serialization for NULL
|
||||
if (b->len == -1) {
|
||||
return rc;
|
||||
}
|
||||
if ((priv->len - priv->off) < b->len) {
|
||||
rc = resize_buffer(priv, priv->len + b->len);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
}
|
||||
memcpy(priv->buffer+priv->off, b->buff, b->len);
|
||||
priv->off += b->len;
|
||||
return 0;
|
||||
}
|
||||
int oa_serialize_string(struct oarchive *oa, const char *name, char **s)
|
||||
{
|
||||
struct buff_struct *priv = oa->priv;
|
||||
int32_t len;
|
||||
int rc;
|
||||
if (!*s) {
|
||||
oa_serialize_int(oa, "len", &negone);
|
||||
return 0;
|
||||
}
|
||||
len = strlen(*s);
|
||||
rc = oa_serialize_int(oa, "len", &len);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
if ((priv->len - priv->off) < len) {
|
||||
rc = resize_buffer(priv, priv->len + len);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
}
|
||||
memcpy(priv->buffer+priv->off, *s, len);
|
||||
priv->off += len;
|
||||
return 0;
|
||||
}
|
||||
int ia_start_record(struct iarchive *ia, const char *tag)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
int ia_end_record(struct iarchive *ia, const char *tag)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
int ia_deserialize_int(struct iarchive *ia, const char *tag, int32_t *count)
|
||||
{
|
||||
struct buff_struct *priv = ia->priv;
|
||||
if ((priv->len - priv->off) < sizeof(*count)) {
|
||||
return -E2BIG;
|
||||
}
|
||||
memcpy(count, priv->buffer+priv->off, sizeof(*count));
|
||||
priv->off+=sizeof(*count);
|
||||
*count = ntohl(*count);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ia_deserialize_long(struct iarchive *ia, const char *tag, int64_t *count)
|
||||
{
|
||||
struct buff_struct *priv = ia->priv;
|
||||
int64_t v = 0;
|
||||
if ((priv->len - priv->off) < sizeof(*count)) {
|
||||
return -E2BIG;
|
||||
}
|
||||
memcpy(count, priv->buffer+priv->off, sizeof(*count));
|
||||
priv->off+=sizeof(*count);
|
||||
v = zoo_htonll(*count); // htonll and ntohll do the same
|
||||
*count = v;
|
||||
return 0;
|
||||
}
|
||||
int ia_start_vector(struct iarchive *ia, const char *tag, int32_t *count)
|
||||
{
|
||||
return ia_deserialize_int(ia, tag, count);
|
||||
}
|
||||
int ia_end_vector(struct iarchive *ia, const char *tag)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
int ia_deserialize_bool(struct iarchive *ia, const char *name, int32_t *v)
|
||||
{
|
||||
struct buff_struct *priv = ia->priv;
|
||||
//fprintf(stderr, "Deserializing bool %d\n", priv->off);
|
||||
//return ia_deserialize_int(ia, name, v);
|
||||
if ((priv->len - priv->off) < 1) {
|
||||
return -E2BIG;
|
||||
}
|
||||
*v = priv->buffer[priv->off];
|
||||
priv->off+=1;
|
||||
//fprintf(stderr, "Deserializing bool end %d\n", priv->off);
|
||||
return 0;
|
||||
}
|
||||
int ia_deserialize_buffer(struct iarchive *ia, const char *name,
|
||||
struct buffer *b)
|
||||
{
|
||||
struct buff_struct *priv = ia->priv;
|
||||
int rc = ia_deserialize_int(ia, "len", &b->len);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
if ((priv->len - priv->off) < b->len) {
|
||||
return -E2BIG;
|
||||
}
|
||||
// set the buffer to null
|
||||
if (b->len == -1) {
|
||||
b->buff = NULL;
|
||||
return rc;
|
||||
}
|
||||
b->buff = malloc(b->len);
|
||||
if (!b->buff) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
memcpy(b->buff, priv->buffer+priv->off, b->len);
|
||||
priv->off += b->len;
|
||||
return 0;
|
||||
}
|
||||
int ia_deserialize_string(struct iarchive *ia, const char *name, char **s)
|
||||
{
|
||||
struct buff_struct *priv = ia->priv;
|
||||
int32_t len;
|
||||
int rc = ia_deserialize_int(ia, "len", &len);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
if ((priv->len - priv->off) < len) {
|
||||
return -E2BIG;
|
||||
}
|
||||
if (len < 0) {
|
||||
return -EINVAL;
|
||||
}
|
||||
*s = malloc(len+1);
|
||||
if (!*s) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
memcpy(*s, priv->buffer+priv->off, len);
|
||||
(*s)[len] = '\0';
|
||||
priv->off += len;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct iarchive ia_default = { STRUCT_INITIALIZER (start_record ,ia_start_record),
|
||||
STRUCT_INITIALIZER (end_record ,ia_end_record), STRUCT_INITIALIZER (start_vector , ia_start_vector),
|
||||
STRUCT_INITIALIZER (end_vector ,ia_end_vector), STRUCT_INITIALIZER (deserialize_Bool , ia_deserialize_bool),
|
||||
STRUCT_INITIALIZER (deserialize_Int ,ia_deserialize_int),
|
||||
STRUCT_INITIALIZER (deserialize_Long , ia_deserialize_long) ,
|
||||
STRUCT_INITIALIZER (deserialize_Buffer, ia_deserialize_buffer),
|
||||
STRUCT_INITIALIZER (deserialize_String, ia_deserialize_string) };
|
||||
|
||||
static struct oarchive oa_default = { STRUCT_INITIALIZER (start_record , oa_start_record),
|
||||
STRUCT_INITIALIZER (end_record , oa_end_record), STRUCT_INITIALIZER (start_vector , oa_start_vector),
|
||||
STRUCT_INITIALIZER (end_vector , oa_end_vector), STRUCT_INITIALIZER (serialize_Bool , oa_serialize_bool),
|
||||
STRUCT_INITIALIZER (serialize_Int , oa_serialize_int),
|
||||
STRUCT_INITIALIZER (serialize_Long , oa_serialize_long) ,
|
||||
STRUCT_INITIALIZER (serialize_Buffer , oa_serialize_buffer),
|
||||
STRUCT_INITIALIZER (serialize_String , oa_serialize_string) };
|
||||
|
||||
struct iarchive *create_buffer_iarchive(char *buffer, int len)
|
||||
{
|
||||
struct iarchive *ia = malloc(sizeof(*ia));
|
||||
struct buff_struct *buff = malloc(sizeof(struct buff_struct));
|
||||
if (!ia) return 0;
|
||||
if (!buff) {
|
||||
free(ia);
|
||||
return 0;
|
||||
}
|
||||
*ia = ia_default;
|
||||
buff->off = 0;
|
||||
buff->buffer = buffer;
|
||||
buff->len = len;
|
||||
ia->priv = buff;
|
||||
return ia;
|
||||
}
|
||||
|
||||
struct oarchive *create_buffer_oarchive()
|
||||
{
|
||||
struct oarchive *oa = malloc(sizeof(*oa));
|
||||
struct buff_struct *buff = malloc(sizeof(struct buff_struct));
|
||||
if (!oa) return 0;
|
||||
if (!buff) {
|
||||
free(oa);
|
||||
return 0;
|
||||
}
|
||||
*oa = oa_default;
|
||||
buff->off = 0;
|
||||
buff->buffer = malloc(128);
|
||||
buff->len = 128;
|
||||
oa->priv = buff;
|
||||
return oa;
|
||||
}
|
||||
|
||||
void close_buffer_iarchive(struct iarchive **ia)
|
||||
{
|
||||
free((*ia)->priv);
|
||||
free(*ia);
|
||||
*ia = 0;
|
||||
}
|
||||
|
||||
void close_buffer_oarchive(struct oarchive **oa, int free_buffer)
|
||||
{
|
||||
if (free_buffer) {
|
||||
struct buff_struct *buff = (struct buff_struct *)(*oa)->priv;
|
||||
if (buff->buffer) {
|
||||
free(buff->buffer);
|
||||
}
|
||||
}
|
||||
free((*oa)->priv);
|
||||
free(*oa);
|
||||
*oa = 0;
|
||||
}
|
||||
|
||||
char *get_buffer(struct oarchive *oa)
|
||||
{
|
||||
struct buff_struct *buff = oa->priv;
|
||||
return buff->buffer;
|
||||
}
|
||||
int get_buffer_len(struct oarchive *oa)
|
||||
{
|
||||
struct buff_struct *buff = oa->priv;
|
||||
return buff->off;
|
||||
}
|
113
contrib/libzookeeper/src/st_adaptor.c
Normal file
113
contrib/libzookeeper/src/st_adaptor.c
Normal file
@ -0,0 +1,113 @@
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef DLL_EXPORT
|
||||
# define USE_STATIC_LIB
|
||||
#endif
|
||||
|
||||
#include "zk_adaptor.h"
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
|
||||
int zoo_lock_auth(zhandle_t *zh)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
int zoo_unlock_auth(zhandle_t *zh)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
int lock_buffer_list(buffer_head_t *l)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
int unlock_buffer_list(buffer_head_t *l)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
int lock_completion_list(completion_head_t *l)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
int unlock_completion_list(completion_head_t *l)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
struct sync_completion *alloc_sync_completion(void)
|
||||
{
|
||||
return (struct sync_completion*)calloc(1, sizeof(struct sync_completion));
|
||||
}
|
||||
int wait_sync_completion(struct sync_completion *sc)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void free_sync_completion(struct sync_completion *sc)
|
||||
{
|
||||
free(sc);
|
||||
}
|
||||
|
||||
void notify_sync_completion(struct sync_completion *sc)
|
||||
{
|
||||
}
|
||||
|
||||
int process_async(int outstanding_sync)
|
||||
{
|
||||
return outstanding_sync == 0;
|
||||
}
|
||||
|
||||
int adaptor_init(zhandle_t *zh)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void adaptor_finish(zhandle_t *zh){}
|
||||
|
||||
void adaptor_destroy(zhandle_t *zh){}
|
||||
|
||||
int flush_send_queue(zhandle_t *, int);
|
||||
|
||||
int adaptor_send_queue(zhandle_t *zh, int timeout)
|
||||
{
|
||||
return flush_send_queue(zh, timeout);
|
||||
}
|
||||
|
||||
int32_t inc_ref_counter(zhandle_t* zh,int i)
|
||||
{
|
||||
zh->ref_counter+=(i<0?-1:(i>0?1:0));
|
||||
return zh->ref_counter;
|
||||
}
|
||||
|
||||
int32_t get_xid()
|
||||
{
|
||||
static int32_t xid = -1;
|
||||
if (xid == -1) {
|
||||
xid = time(0);
|
||||
}
|
||||
return xid++;
|
||||
}
|
||||
|
||||
int enter_critical(zhandle_t* zh)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int leave_critical(zhandle_t* zh)
|
||||
{
|
||||
return 0;
|
||||
}
|
276
contrib/libzookeeper/src/zk_adaptor.h
Normal file
276
contrib/libzookeeper/src/zk_adaptor.h
Normal file
@ -0,0 +1,276 @@
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ZK_ADAPTOR_H_
|
||||
#define ZK_ADAPTOR_H_
|
||||
#include <zookeeper.jute.h>
|
||||
#ifdef THREADED
|
||||
#ifndef WIN32
|
||||
#include <pthread.h>
|
||||
#else
|
||||
#include "winport.h"
|
||||
#endif
|
||||
#endif
|
||||
#include "zookeeper.h"
|
||||
#include "zk_hashtable.h"
|
||||
|
||||
/* predefined xid's values recognized as special by the server */
|
||||
#define WATCHER_EVENT_XID -1
|
||||
#define PING_XID -2
|
||||
#define AUTH_XID -4
|
||||
#define SET_WATCHES_XID -8
|
||||
|
||||
/* zookeeper state constants */
|
||||
#define EXPIRED_SESSION_STATE_DEF -112
|
||||
#define AUTH_FAILED_STATE_DEF -113
|
||||
#define CONNECTING_STATE_DEF 1
|
||||
#define ASSOCIATING_STATE_DEF 2
|
||||
#define CONNECTED_STATE_DEF 3
|
||||
#define NOTCONNECTED_STATE_DEF 999
|
||||
|
||||
/* zookeeper event type constants */
|
||||
#define CREATED_EVENT_DEF 1
|
||||
#define DELETED_EVENT_DEF 2
|
||||
#define CHANGED_EVENT_DEF 3
|
||||
#define CHILD_EVENT_DEF 4
|
||||
#define SESSION_EVENT_DEF -1
|
||||
#define NOTWATCHING_EVENT_DEF -2
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct _buffer_list;
|
||||
struct _completion_list;
|
||||
|
||||
typedef struct _buffer_head {
|
||||
struct _buffer_list *volatile head;
|
||||
struct _buffer_list *last;
|
||||
#ifdef THREADED
|
||||
pthread_mutex_t lock;
|
||||
#endif
|
||||
} buffer_head_t;
|
||||
|
||||
typedef struct _completion_head {
|
||||
struct _completion_list *volatile head;
|
||||
struct _completion_list *last;
|
||||
#ifdef THREADED
|
||||
pthread_cond_t cond;
|
||||
pthread_mutex_t lock;
|
||||
#endif
|
||||
} completion_head_t;
|
||||
|
||||
int lock_buffer_list(buffer_head_t *l);
|
||||
int unlock_buffer_list(buffer_head_t *l);
|
||||
int lock_completion_list(completion_head_t *l);
|
||||
int unlock_completion_list(completion_head_t *l);
|
||||
|
||||
struct sync_completion {
|
||||
int rc;
|
||||
union {
|
||||
struct {
|
||||
char *str;
|
||||
int str_len;
|
||||
} str;
|
||||
struct Stat stat;
|
||||
struct {
|
||||
char *buffer;
|
||||
int buff_len;
|
||||
struct Stat stat;
|
||||
} data;
|
||||
struct {
|
||||
struct ACL_vector acl;
|
||||
struct Stat stat;
|
||||
} acl;
|
||||
struct String_vector strs2;
|
||||
struct {
|
||||
struct String_vector strs2;
|
||||
struct Stat stat2;
|
||||
} strs_stat;
|
||||
} u;
|
||||
int complete;
|
||||
#ifdef THREADED
|
||||
pthread_cond_t cond;
|
||||
pthread_mutex_t lock;
|
||||
#endif
|
||||
};
|
||||
|
||||
typedef struct _auth_info {
|
||||
int state; /* 0=>inactive, >0 => active */
|
||||
char* scheme;
|
||||
struct buffer auth;
|
||||
void_completion_t completion;
|
||||
const char* data;
|
||||
struct _auth_info *next;
|
||||
} auth_info;
|
||||
|
||||
/**
|
||||
* This structure represents a packet being read or written.
|
||||
*/
|
||||
typedef struct _buffer_list {
|
||||
char *buffer;
|
||||
int len; /* This represents the length of sizeof(header) + length of buffer */
|
||||
int curr_offset; /* This is the offset into the header followed by offset into the buffer */
|
||||
struct _buffer_list *next;
|
||||
} buffer_list_t;
|
||||
|
||||
/* the size of connect request */
|
||||
#define HANDSHAKE_REQ_SIZE 44
|
||||
/* connect request */
|
||||
struct connect_req {
|
||||
int32_t protocolVersion;
|
||||
int64_t lastZxidSeen;
|
||||
int32_t timeOut;
|
||||
int64_t sessionId;
|
||||
int32_t passwd_len;
|
||||
char passwd[16];
|
||||
};
|
||||
|
||||
/* the connect response */
|
||||
struct prime_struct {
|
||||
int32_t len;
|
||||
int32_t protocolVersion;
|
||||
int32_t timeOut;
|
||||
int64_t sessionId;
|
||||
int32_t passwd_len;
|
||||
char passwd[16];
|
||||
};
|
||||
|
||||
#ifdef THREADED
|
||||
/* this is used by mt_adaptor internally for thread management */
|
||||
struct adaptor_threads {
|
||||
pthread_t io;
|
||||
pthread_t completion;
|
||||
int threadsToWait; // barrier
|
||||
pthread_cond_t cond; // barrier's conditional
|
||||
pthread_mutex_t lock; // ... and a lock
|
||||
pthread_mutex_t zh_lock; // critical section lock
|
||||
#ifdef WIN32
|
||||
SOCKET self_pipe[2];
|
||||
#else
|
||||
int self_pipe[2];
|
||||
#endif
|
||||
};
|
||||
#endif
|
||||
|
||||
/** the auth list for adding auth */
|
||||
typedef struct _auth_list_head {
|
||||
auth_info *auth;
|
||||
#ifdef THREADED
|
||||
pthread_mutex_t lock;
|
||||
#endif
|
||||
} auth_list_head_t;
|
||||
|
||||
/**
|
||||
* This structure represents the connection to zookeeper.
|
||||
*/
|
||||
|
||||
struct _zhandle {
|
||||
#ifdef WIN32
|
||||
SOCKET fd; /* the descriptor used to talk to zookeeper */
|
||||
#else
|
||||
int fd; /* the descriptor used to talk to zookeeper */
|
||||
#endif
|
||||
char *hostname; /* the hostname of zookeeper */
|
||||
struct sockaddr_storage *addrs; /* the addresses that correspond to the hostname */
|
||||
int addrs_count; /* The number of addresses in the addrs array */
|
||||
watcher_fn watcher; /* the registered watcher */
|
||||
struct timeval last_recv; /* The time that the last message was received */
|
||||
struct timeval last_send; /* The time that the last message was sent */
|
||||
struct timeval last_ping; /* The time that the last PING was sent */
|
||||
struct timeval next_deadline; /* The time of the next deadline */
|
||||
int recv_timeout; /* The maximum amount of time that can go by without
|
||||
receiving anything from the zookeeper server */
|
||||
buffer_list_t *input_buffer; /* the current buffer being read in */
|
||||
buffer_head_t to_process; /* The buffers that have been read and are ready to be processed. */
|
||||
buffer_head_t to_send; /* The packets queued to send */
|
||||
completion_head_t sent_requests; /* The outstanding requests */
|
||||
completion_head_t completions_to_process; /* completions that are ready to run */
|
||||
int connect_index; /* The index of the address to connect to */
|
||||
clientid_t client_id;
|
||||
long long last_zxid;
|
||||
int outstanding_sync; /* Number of outstanding synchronous requests */
|
||||
struct _buffer_list primer_buffer; /* The buffer used for the handshake at the start of a connection */
|
||||
struct prime_struct primer_storage; /* the connect response */
|
||||
char primer_storage_buffer[40]; /* the true size of primer_storage */
|
||||
volatile int state;
|
||||
void *context;
|
||||
auth_list_head_t auth_h; /* authentication data list */
|
||||
/* zookeeper_close is not reentrant because it de-allocates the zhandler.
|
||||
* This guard variable is used to defer the destruction of zhandle till
|
||||
* right before top-level API call returns to the caller */
|
||||
int32_t ref_counter;
|
||||
volatile int close_requested;
|
||||
void *adaptor_priv;
|
||||
/* Used for debugging only: non-zero value indicates the time when the zookeeper_process
|
||||
* call returned while there was at least one unprocessed server response
|
||||
* available in the socket recv buffer */
|
||||
struct timeval socket_readable;
|
||||
|
||||
zk_hashtable* active_node_watchers;
|
||||
zk_hashtable* active_exist_watchers;
|
||||
zk_hashtable* active_child_watchers;
|
||||
/** used for chroot path at the client side **/
|
||||
char *chroot;
|
||||
};
|
||||
|
||||
|
||||
int adaptor_init(zhandle_t *zh);
|
||||
void adaptor_finish(zhandle_t *zh);
|
||||
void adaptor_destroy(zhandle_t *zh);
|
||||
struct sync_completion *alloc_sync_completion(void);
|
||||
int wait_sync_completion(struct sync_completion *sc);
|
||||
void free_sync_completion(struct sync_completion *sc);
|
||||
void notify_sync_completion(struct sync_completion *sc);
|
||||
int adaptor_send_queue(zhandle_t *zh, int timeout);
|
||||
int process_async(int outstanding_sync);
|
||||
void process_completions(zhandle_t *zh);
|
||||
int flush_send_queue(zhandle_t*zh, int timeout);
|
||||
char* sub_string(zhandle_t *zh, const char* server_path);
|
||||
void free_duplicate_path(const char* free_path, const char* path);
|
||||
int zoo_lock_auth(zhandle_t *zh);
|
||||
int zoo_unlock_auth(zhandle_t *zh);
|
||||
|
||||
// critical section guards
|
||||
int enter_critical(zhandle_t* zh);
|
||||
int leave_critical(zhandle_t* zh);
|
||||
// zhandle object reference counting
|
||||
void api_prolog(zhandle_t* zh);
|
||||
int api_epilog(zhandle_t *zh, int rc);
|
||||
int32_t get_xid();
|
||||
// returns the new value of the ref counter
|
||||
int32_t inc_ref_counter(zhandle_t* zh,int i);
|
||||
|
||||
#ifdef THREADED
|
||||
// atomic post-increment
|
||||
int32_t fetch_and_add(volatile int32_t* operand, int incr);
|
||||
// in mt mode process session event asynchronously by the completion thread
|
||||
#define PROCESS_SESSION_EVENT(zh,newstate) queue_session_event(zh,newstate)
|
||||
#else
|
||||
// in single-threaded mode process session event immediately
|
||||
//#define PROCESS_SESSION_EVENT(zh,newstate) deliverWatchers(zh,ZOO_SESSION_EVENT,newstate,0)
|
||||
#define PROCESS_SESSION_EVENT(zh,newstate) queue_session_event(zh,newstate)
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /*ZK_ADAPTOR_H_*/
|
||||
|
||||
|
337
contrib/libzookeeper/src/zk_hashtable.c
Normal file
337
contrib/libzookeeper/src/zk_hashtable.c
Normal file
@ -0,0 +1,337 @@
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include "zk_hashtable.h"
|
||||
#include "zk_adaptor.h"
|
||||
#include "hashtable/hashtable.h"
|
||||
#include "hashtable/hashtable_itr.h"
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
|
||||
typedef struct _watcher_object {
|
||||
watcher_fn watcher;
|
||||
void* context;
|
||||
struct _watcher_object* next;
|
||||
} watcher_object_t;
|
||||
|
||||
|
||||
struct _zk_hashtable {
|
||||
struct hashtable* ht;
|
||||
};
|
||||
|
||||
struct watcher_object_list {
|
||||
watcher_object_t* head;
|
||||
};
|
||||
|
||||
/* the following functions are for testing only */
|
||||
typedef struct hashtable hashtable_impl;
|
||||
|
||||
hashtable_impl* getImpl(zk_hashtable* ht){
|
||||
return ht->ht;
|
||||
}
|
||||
|
||||
watcher_object_t* getFirstWatcher(zk_hashtable* ht,const char* path)
|
||||
{
|
||||
watcher_object_list_t* wl=hashtable_search(ht->ht,(void*)path);
|
||||
if(wl!=0)
|
||||
return wl->head;
|
||||
return 0;
|
||||
}
|
||||
/* end of testing functions */
|
||||
|
||||
watcher_object_t* clone_watcher_object(watcher_object_t* wo)
|
||||
{
|
||||
watcher_object_t* res=calloc(1,sizeof(watcher_object_t));
|
||||
assert(res);
|
||||
res->watcher=wo->watcher;
|
||||
res->context=wo->context;
|
||||
return res;
|
||||
}
|
||||
|
||||
static unsigned int string_hash_djb2(void *str)
|
||||
{
|
||||
unsigned int hash = 5381;
|
||||
int c;
|
||||
const char* cstr = (const char*)str;
|
||||
while ((c = *cstr++))
|
||||
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
|
||||
|
||||
return hash;
|
||||
}
|
||||
|
||||
static int string_equal(void *key1,void *key2)
|
||||
{
|
||||
return strcmp((const char*)key1,(const char*)key2)==0;
|
||||
}
|
||||
|
||||
static watcher_object_t* create_watcher_object(watcher_fn watcher,void* ctx)
|
||||
{
|
||||
watcher_object_t* wo=calloc(1,sizeof(watcher_object_t));
|
||||
assert(wo);
|
||||
wo->watcher=watcher;
|
||||
wo->context=ctx;
|
||||
return wo;
|
||||
}
|
||||
|
||||
static watcher_object_list_t* create_watcher_object_list(watcher_object_t* head)
|
||||
{
|
||||
watcher_object_list_t* wl=calloc(1,sizeof(watcher_object_list_t));
|
||||
assert(wl);
|
||||
wl->head=head;
|
||||
return wl;
|
||||
}
|
||||
|
||||
static void destroy_watcher_object_list(watcher_object_list_t* list)
|
||||
{
|
||||
watcher_object_t* e = NULL;
|
||||
|
||||
if(list==0)
|
||||
return;
|
||||
e=list->head;
|
||||
while(e!=0){
|
||||
watcher_object_t* this=e;
|
||||
e=e->next;
|
||||
free(this);
|
||||
}
|
||||
free(list);
|
||||
}
|
||||
|
||||
zk_hashtable* create_zk_hashtable()
|
||||
{
|
||||
struct _zk_hashtable *ht=calloc(1,sizeof(struct _zk_hashtable));
|
||||
assert(ht);
|
||||
ht->ht=create_hashtable(32,string_hash_djb2,string_equal);
|
||||
return ht;
|
||||
}
|
||||
|
||||
static void do_clean_hashtable(zk_hashtable* ht)
|
||||
{
|
||||
struct hashtable_itr *it;
|
||||
int hasMore;
|
||||
if(hashtable_count(ht->ht)==0)
|
||||
return;
|
||||
it=hashtable_iterator(ht->ht);
|
||||
do {
|
||||
watcher_object_list_t* w=hashtable_iterator_value(it);
|
||||
destroy_watcher_object_list(w);
|
||||
hasMore=hashtable_iterator_remove(it);
|
||||
} while(hasMore);
|
||||
free(it);
|
||||
}
|
||||
|
||||
void destroy_zk_hashtable(zk_hashtable* ht)
|
||||
{
|
||||
if(ht!=0){
|
||||
do_clean_hashtable(ht);
|
||||
hashtable_destroy(ht->ht,0);
|
||||
free(ht);
|
||||
}
|
||||
}
|
||||
|
||||
// searches for a watcher object instance in a watcher object list;
|
||||
// two watcher objects are equal if their watcher function and context pointers
|
||||
// are equal
|
||||
static watcher_object_t* search_watcher(watcher_object_list_t** wl,watcher_object_t* wo)
|
||||
{
|
||||
watcher_object_t* wobj=(*wl)->head;
|
||||
while(wobj!=0){
|
||||
if(wobj->watcher==wo->watcher && wobj->context==wo->context)
|
||||
return wobj;
|
||||
wobj=wobj->next;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int add_to_list(watcher_object_list_t **wl, watcher_object_t *wo,
|
||||
int clone)
|
||||
{
|
||||
if (search_watcher(wl, wo)==0) {
|
||||
watcher_object_t* cloned=wo;
|
||||
if (clone) {
|
||||
cloned = clone_watcher_object(wo);
|
||||
assert(cloned);
|
||||
}
|
||||
cloned->next = (*wl)->head;
|
||||
(*wl)->head = cloned;
|
||||
return 1;
|
||||
} else if (!clone) {
|
||||
// If it's here and we aren't supposed to clone, we must destroy
|
||||
free(wo);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int do_insert_watcher_object(zk_hashtable *ht, const char *path, watcher_object_t* wo)
|
||||
{
|
||||
int res=1;
|
||||
watcher_object_list_t* wl;
|
||||
|
||||
wl=hashtable_search(ht->ht,(void*)path);
|
||||
if(wl==0){
|
||||
int res;
|
||||
/* inserting a new path element */
|
||||
res=hashtable_insert(ht->ht,strdup(path),create_watcher_object_list(wo));
|
||||
assert(res);
|
||||
}else{
|
||||
/*
|
||||
* Path already exists; check if the watcher already exists.
|
||||
* Don't clone the watcher since it's allocated on the heap --- avoids
|
||||
* a memory leak and saves a clone operation (calloc + copy).
|
||||
*/
|
||||
res = add_to_list(&wl, wo, 0);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
char **collect_keys(zk_hashtable *ht, int *count)
|
||||
{
|
||||
char **list;
|
||||
struct hashtable_itr *it;
|
||||
int i;
|
||||
|
||||
*count = hashtable_count(ht->ht);
|
||||
list = calloc(*count, sizeof(char*));
|
||||
it=hashtable_iterator(ht->ht);
|
||||
for(i = 0; i < *count; i++) {
|
||||
list[i] = strdup(hashtable_iterator_key(it));
|
||||
hashtable_iterator_advance(it);
|
||||
}
|
||||
free(it);
|
||||
return list;
|
||||
}
|
||||
|
||||
static int insert_watcher_object(zk_hashtable *ht, const char *path,
|
||||
watcher_object_t* wo)
|
||||
{
|
||||
int res;
|
||||
res=do_insert_watcher_object(ht,path,wo);
|
||||
return res;
|
||||
}
|
||||
|
||||
static void copy_watchers(watcher_object_list_t *from, watcher_object_list_t *to, int clone)
|
||||
{
|
||||
watcher_object_t* wo=from->head;
|
||||
while(wo){
|
||||
watcher_object_t *next = wo->next;
|
||||
add_to_list(&to, wo, clone);
|
||||
wo=next;
|
||||
}
|
||||
}
|
||||
|
||||
static void copy_table(zk_hashtable *from, watcher_object_list_t *to) {
|
||||
struct hashtable_itr *it;
|
||||
int hasMore;
|
||||
if(hashtable_count(from->ht)==0)
|
||||
return;
|
||||
it=hashtable_iterator(from->ht);
|
||||
do {
|
||||
watcher_object_list_t *w = hashtable_iterator_value(it);
|
||||
copy_watchers(w, to, 1);
|
||||
hasMore=hashtable_iterator_advance(it);
|
||||
} while(hasMore);
|
||||
free(it);
|
||||
}
|
||||
|
||||
static void collect_session_watchers(zhandle_t *zh,
|
||||
watcher_object_list_t **list)
|
||||
{
|
||||
copy_table(zh->active_node_watchers, *list);
|
||||
copy_table(zh->active_exist_watchers, *list);
|
||||
copy_table(zh->active_child_watchers, *list);
|
||||
}
|
||||
|
||||
static void add_for_event(zk_hashtable *ht, char *path, watcher_object_list_t **list)
|
||||
{
|
||||
watcher_object_list_t* wl;
|
||||
wl = (watcher_object_list_t*)hashtable_remove(ht->ht, path);
|
||||
if (wl) {
|
||||
copy_watchers(wl, *list, 0);
|
||||
// Since we move, not clone the watch_objects, we just need to free the
|
||||
// head pointer
|
||||
free(wl);
|
||||
}
|
||||
}
|
||||
|
||||
static void do_foreach_watcher(watcher_object_t* wo,zhandle_t* zh,
|
||||
const char* path,int type,int state)
|
||||
{
|
||||
// session event's don't have paths
|
||||
const char *client_path =
|
||||
(type != ZOO_SESSION_EVENT ? sub_string(zh, path) : path);
|
||||
while(wo!=0){
|
||||
wo->watcher(zh,type,state,client_path,wo->context);
|
||||
wo=wo->next;
|
||||
}
|
||||
free_duplicate_path(client_path, path);
|
||||
}
|
||||
|
||||
watcher_object_list_t *collectWatchers(zhandle_t *zh,int type, char *path)
|
||||
{
|
||||
struct watcher_object_list *list = create_watcher_object_list(0);
|
||||
|
||||
if(type==ZOO_SESSION_EVENT){
|
||||
watcher_object_t defWatcher;
|
||||
defWatcher.watcher=zh->watcher;
|
||||
defWatcher.context=zh->context;
|
||||
add_to_list(&list, &defWatcher, 1);
|
||||
collect_session_watchers(zh, &list);
|
||||
return list;
|
||||
}
|
||||
switch(type){
|
||||
case CREATED_EVENT_DEF:
|
||||
case CHANGED_EVENT_DEF:
|
||||
// look up the watchers for the path and move them to a delivery list
|
||||
add_for_event(zh->active_node_watchers,path,&list);
|
||||
add_for_event(zh->active_exist_watchers,path,&list);
|
||||
break;
|
||||
case CHILD_EVENT_DEF:
|
||||
// look up the watchers for the path and move them to a delivery list
|
||||
add_for_event(zh->active_child_watchers,path,&list);
|
||||
break;
|
||||
case DELETED_EVENT_DEF:
|
||||
// look up the watchers for the path and move them to a delivery list
|
||||
add_for_event(zh->active_node_watchers,path,&list);
|
||||
add_for_event(zh->active_exist_watchers,path,&list);
|
||||
add_for_event(zh->active_child_watchers,path,&list);
|
||||
break;
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
void deliverWatchers(zhandle_t *zh, int type,int state, char *path, watcher_object_list_t **list)
|
||||
{
|
||||
if (!list || !(*list)) return;
|
||||
do_foreach_watcher((*list)->head, zh, path, type, state);
|
||||
destroy_watcher_object_list(*list);
|
||||
*list = 0;
|
||||
}
|
||||
|
||||
void activateWatcher(zhandle_t *zh, watcher_registration_t* reg, int rc)
|
||||
{
|
||||
if(reg){
|
||||
/* in multithreaded lib, this code is executed
|
||||
* by the IO thread */
|
||||
zk_hashtable *ht = reg->checker(zh, rc);
|
||||
if(ht){
|
||||
insert_watcher_object(ht,reg->path,
|
||||
create_watcher_object(reg->watcher, reg->context));
|
||||
}
|
||||
}
|
||||
}
|
69
contrib/libzookeeper/src/zk_hashtable.h
Normal file
69
contrib/libzookeeper/src/zk_hashtable.h
Normal file
@ -0,0 +1,69 @@
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef ZK_HASHTABLE_H_
|
||||
#define ZK_HASHTABLE_H_
|
||||
|
||||
#include <zookeeper.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct watcher_object_list watcher_object_list_t;
|
||||
typedef struct _zk_hashtable zk_hashtable;
|
||||
|
||||
/**
|
||||
* The function must return a non-zero value if the watcher object can be activated
|
||||
* as a result of the server response. Normally, a watch can only be activated
|
||||
* if the server returns a success code (ZOK). However in the case when zoo_exists()
|
||||
* returns a ZNONODE code the watcher should be activated nevertheless.
|
||||
*/
|
||||
typedef zk_hashtable *(*result_checker_fn)(zhandle_t *, int rc);
|
||||
|
||||
/**
|
||||
* A watcher object gets temporarily stored with the completion entry until
|
||||
* the server response comes back at which moment the watcher object is moved
|
||||
* to the active watchers map.
|
||||
*/
|
||||
typedef struct _watcher_registration {
|
||||
watcher_fn watcher;
|
||||
void* context;
|
||||
result_checker_fn checker;
|
||||
const char* path;
|
||||
} watcher_registration_t;
|
||||
|
||||
zk_hashtable* create_zk_hashtable();
|
||||
void destroy_zk_hashtable(zk_hashtable* ht);
|
||||
|
||||
char **collect_keys(zk_hashtable *ht, int *count);
|
||||
|
||||
/**
|
||||
* check if the completion has a watcher object associated
|
||||
* with it. If it does, move the watcher object to the map of
|
||||
* active watchers (only if the checker allows to do so)
|
||||
*/
|
||||
void activateWatcher(zhandle_t *zh, watcher_registration_t* reg, int rc);
|
||||
watcher_object_list_t *collectWatchers(zhandle_t *zh,int type, char *path);
|
||||
void deliverWatchers(zhandle_t *zh, int type, int state, char *path, struct watcher_object_list **list);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /*ZK_HASHTABLE_H_*/
|
177
contrib/libzookeeper/src/zk_log.c
Normal file
177
contrib/libzookeeper/src/zk_log.c
Normal file
@ -0,0 +1,177 @@
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef DLL_EXPORT
|
||||
# define USE_STATIC_LIB
|
||||
#endif
|
||||
|
||||
#include "zookeeper_log.h"
|
||||
#ifndef WIN32
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <time.h>
|
||||
|
||||
#define TIME_NOW_BUF_SIZE 1024
|
||||
#define FORMAT_LOG_BUF_SIZE 4096
|
||||
|
||||
#ifdef THREADED
|
||||
#ifndef WIN32
|
||||
#include <pthread.h>
|
||||
#else
|
||||
#include "winport.h"
|
||||
#endif
|
||||
|
||||
static pthread_key_t time_now_buffer;
|
||||
static pthread_key_t format_log_msg_buffer;
|
||||
|
||||
void freeBuffer(void* p){
|
||||
if(p) free(p);
|
||||
}
|
||||
|
||||
__attribute__((constructor)) void prepareTSDKeys() {
|
||||
pthread_key_create (&time_now_buffer, freeBuffer);
|
||||
pthread_key_create (&format_log_msg_buffer, freeBuffer);
|
||||
}
|
||||
|
||||
char* getTSData(pthread_key_t key,int size){
|
||||
char* p=pthread_getspecific(key);
|
||||
if(p==0){
|
||||
int res;
|
||||
p=calloc(1,size);
|
||||
res=pthread_setspecific(key,p);
|
||||
if(res!=0){
|
||||
fprintf(stderr,"Failed to set TSD key: %d",res);
|
||||
}
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
char* get_time_buffer(){
|
||||
return getTSData(time_now_buffer,TIME_NOW_BUF_SIZE);
|
||||
}
|
||||
|
||||
char* get_format_log_buffer(){
|
||||
return getTSData(format_log_msg_buffer,FORMAT_LOG_BUF_SIZE);
|
||||
}
|
||||
#else
|
||||
char* get_time_buffer(){
|
||||
static char buf[TIME_NOW_BUF_SIZE];
|
||||
return buf;
|
||||
}
|
||||
|
||||
char* get_format_log_buffer(){
|
||||
static char buf[FORMAT_LOG_BUF_SIZE];
|
||||
return buf;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
ZooLogLevel logLevel=ZOO_LOG_LEVEL_INFO;
|
||||
|
||||
static FILE* logStream=0;
|
||||
FILE* getLogStream(){
|
||||
if(logStream==0)
|
||||
logStream=stderr;
|
||||
return logStream;
|
||||
}
|
||||
|
||||
void zoo_set_log_stream(FILE* stream){
|
||||
logStream=stream;
|
||||
}
|
||||
|
||||
static const char* time_now(char* now_str){
|
||||
struct timeval tv;
|
||||
struct tm lt;
|
||||
time_t now = 0;
|
||||
size_t len = 0;
|
||||
|
||||
gettimeofday(&tv,0);
|
||||
|
||||
now = tv.tv_sec;
|
||||
localtime_r(&now, <);
|
||||
|
||||
// clone the format used by log4j ISO8601DateFormat
|
||||
// specifically: "yyyy-MM-dd HH:mm:ss,SSS"
|
||||
|
||||
len = strftime(now_str, TIME_NOW_BUF_SIZE,
|
||||
"%Y-%m-%d %H:%M:%S",
|
||||
<);
|
||||
|
||||
len += snprintf(now_str + len,
|
||||
TIME_NOW_BUF_SIZE - len,
|
||||
",%03d",
|
||||
(int)(tv.tv_usec/1000));
|
||||
|
||||
return now_str;
|
||||
}
|
||||
|
||||
void log_message(ZooLogLevel curLevel,int line,const char* funcName,
|
||||
const char* message)
|
||||
{
|
||||
static const char* dbgLevelStr[]={"ZOO_INVALID","ZOO_ERROR","ZOO_WARN",
|
||||
"ZOO_INFO","ZOO_DEBUG"};
|
||||
static pid_t pid=0;
|
||||
#ifdef WIN32
|
||||
char timebuf [TIME_NOW_BUF_SIZE];
|
||||
#endif
|
||||
if(pid==0)pid=getpid();
|
||||
#ifndef THREADED
|
||||
// pid_t is long on Solaris
|
||||
fprintf(LOGSTREAM, "%s:%ld:%s@%s@%d: %s\n", time_now(get_time_buffer()),(long)pid,
|
||||
dbgLevelStr[curLevel],funcName,line,message);
|
||||
#else
|
||||
#ifdef WIN32
|
||||
fprintf(LOGSTREAM, "%s:%d(0x%lx):%s@%s@%d: %s\n", time_now(timebuf),pid,
|
||||
(unsigned long int)(pthread_self().thread_id),
|
||||
dbgLevelStr[curLevel],funcName,line,message);
|
||||
#else
|
||||
fprintf(LOGSTREAM, "%s:%ld(0x%lx):%s@%s@%d: %s\n", time_now(get_time_buffer()),(long)pid,
|
||||
(unsigned long int)pthread_self(),
|
||||
dbgLevelStr[curLevel],funcName,line,message);
|
||||
#endif
|
||||
#endif
|
||||
fflush(LOGSTREAM);
|
||||
}
|
||||
|
||||
const char* format_log_message(const char* format,...)
|
||||
{
|
||||
va_list va;
|
||||
char* buf=get_format_log_buffer();
|
||||
if(!buf)
|
||||
return "format_log_message: Unable to allocate memory buffer";
|
||||
|
||||
va_start(va,format);
|
||||
vsnprintf(buf, FORMAT_LOG_BUF_SIZE-1,format,va);
|
||||
va_end(va);
|
||||
return buf;
|
||||
}
|
||||
|
||||
void zoo_set_debug_level(ZooLogLevel level)
|
||||
{
|
||||
if(level==0){
|
||||
// disable logging (unit tests do this)
|
||||
logLevel=(ZooLogLevel)0;
|
||||
return;
|
||||
}
|
||||
if(level<ZOO_LOG_LEVEL_ERROR)level=ZOO_LOG_LEVEL_ERROR;
|
||||
if(level>ZOO_LOG_LEVEL_DEBUG)level=ZOO_LOG_LEVEL_DEBUG;
|
||||
logLevel=level;
|
||||
}
|
||||
|
3729
contrib/libzookeeper/src/zookeeper.c
Normal file
3729
contrib/libzookeeper/src/zookeeper.c
Normal file
File diff suppressed because it is too large
Load Diff
1315
contrib/libzookeeper/src/zookeeper.jute.c
Normal file
1315
contrib/libzookeeper/src/zookeeper.jute.c
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user