| | |
| | | # set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}") |
| | | |
| | | option(BUILD_SHARED_LIBS "Build using shared libraries" ON) |
| | | |
| | | option(BUILD_DOC "Build doc" OFF) |
| | | |
| | | list(APPEND EXTRA_INCLUDES "${PROJECT_SOURCE_DIR}/include/usgcommon") |
| | | list(APPEND EXTRA_LIBS ${PROJECT_SOURCE_DIR}/lib/libusgcommon.a pthread rt) |
| | | |
| | | add_subdirectory(${PROJECT_SOURCE_DIR}/src) |
| | | add_subdirectory(${PROJECT_SOURCE_DIR}/test) |
| | | add_subdirectory(${PROJECT_SOURCE_DIR}/test_net_socket) |
| | | |
| | | # build api doc |
| | | if (CMAKE_BUILD_TYPE MATCHES "^[Rr]elease") |
| | | if (BUILD_DOC) |
| | | # build the docs |
| | | add_subdirectory(${PROJECT_SOURCE_DIR}/doc) |
| | | else() |
| | | add_subdirectory(${PROJECT_SOURCE_DIR}/src) |
| | | add_subdirectory(${PROJECT_SOURCE_DIR}/test) |
| | | add_subdirectory(${PROJECT_SOURCE_DIR}/test_net_socket) |
| | | endif() |
| | |
| | | #! /bin/bash |
| | | |
| | | BUILD_TYPE="Debug" |
| | | BUILD_DOC="OFF" |
| | | |
| | | function usage() { |
| | | echo "build.sh [release | debug]" |
| | | echo "build.sh [release | debug | doc]" |
| | | } |
| | | |
| | | case ${1} in |
| | |
| | | BUILD_TYPE="Debug" |
| | | ;; |
| | | |
| | | "doc") |
| | | BUILD_TYPE="Release" |
| | | BUILD_DOC="ON" |
| | | ;; |
| | | |
| | | "help") |
| | | usage |
| | | ;; |
| | | |
| | | "") |
| | | BUILD_TYPE="Debug" |
| | | ;; |
| | |
| | | echo "Invalid Argument." |
| | | usage |
| | | ;; |
| | | |
| | | esac |
| | | |
| | | |
| | |
| | | |
| | | |
| | | |
| | | # -DCMAKE_BUILD_TYPE=Debug | Release |
| | | # -DCMAKE_BUILD_TYPE=Debug | Release |
| | | # -DBUILD_SHARED_LIBS=ON |
| | | # -DCMAKE_INSTALL_PREFIX=$(pwd/../dest) |
| | | # -DQCA_MAN_INSTALL_DIR:PATH=/usr/share/man |
| | | cmake -DCMAKE_INSTALL_PREFIX="$(pwd)/../dest" -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DBUILD_SHARED_LIBS=ON -DSUPPORT_RDMA=OFF .. |
| | | cmake -DCMAKE_INSTALL_PREFIX="$(pwd)/../dest" -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DBUILD_SHARED_LIBS=ON \ |
| | | -DBUILD_DOC=${BUILD_DOC} -DSUPPORT_RDMA=OFF .. |
| | | |
| | | cmake --build . |
| | | |
| | | cmake --build . --target install |
| | | # cmake --build . --target install |
| | | |
| | |
| | | void error(const char *fmt, ...); |
| | | void error(int err, const char *fmt, ...); |
| | | void fatal(const char *fmt, ...); |
| | | |
| | | void fatal(int err, const char *fmt, ...) ; |
| | | |
| | | static const char * strlevel(int level); |
| | | }; |
| | |
| | | |
| | | |
| | | # should we use our own math functions |
| | | option(SUPPORT_RDMA "If support rdma" ON) |
| | | option(SUPPORT_RDMA "If support rdma" OFF) |
| | | |
| | | # configure a header file to pass some of the CMake settings |
| | | # to the source code |
| | |
| | | shm/mm.cpp |
| | | shm/hashtable.cpp |
| | | px_sem_util.cpp |
| | | svsem_util.cpp |
| | | |
| | | ) |
| | | |
| | |
| | | hashtable->wlock = SemUtil::get(IPC_PRIVATE, 1); |
| | | hashtable->cond = SemUtil::get(IPC_PRIVATE, 1); |
| | | hashtable->readcnt = 0; |
| | | |
| | | printf("hashtable->mutex=%d\n", hashtable->mutex); |
| | | } |
| | | |
| | | void hashtable_destroy(hashtable_t *hashtable) { |
| | |
| | | int rv; |
| | | rv = SemUtil::dec(hashtable->mutex); |
| | | if(rv != 0) { |
| | | LoggerFactory::getLogger()->error(rv, "hashtable_get\n"); |
| | | LoggerFactory::getLogger()->error(rv, "hashtable_get 1"); |
| | | } |
| | | hashtable->readcnt++; |
| | | if (hashtable->readcnt == 1) { |
| | | //获取读写锁 |
| | | rv = SemUtil::dec(hashtable->wlock); |
| | | if(rv != 0) { |
| | | LoggerFactory::getLogger()->error(rv, "hashtable_get\n"); |
| | | LoggerFactory::getLogger()->error(rv, "hashtable_get 2"); |
| | | } |
| | | } |
| | | rv = SemUtil::inc(hashtable->mutex); |
| | | if(rv != 0) { |
| | | LoggerFactory::getLogger()->error(rv, "hashtable_get\n"); |
| | | LoggerFactory::getLogger()->error(rv, "hashtable_get 3"); |
| | | } |
| | | // ================ |
| | | |
| | |
| | | |
| | | rv = SemUtil::dec(hashtable->mutex); |
| | | if(rv != 0) { |
| | | LoggerFactory::getLogger()->error(rv, "hashtable_get\n"); |
| | | LoggerFactory::getLogger()->error(rv, "hashtable_get 4"); |
| | | } |
| | | hashtable->readcnt--; |
| | | if(hashtable->readcnt == 0) { |
| | | //释放读写锁 |
| | | rv = SemUtil::inc(hashtable->wlock); |
| | | if(rv != 0) { |
| | | LoggerFactory::getLogger()->error(rv, "hashtable_get\n"); |
| | | LoggerFactory::getLogger()->error(rv, "hashtable_get 5"); |
| | | } |
| | | //通知写 |
| | | rv = SemUtil::set(hashtable->cond, 1); |
| | | if(rv != 0) { |
| | | LoggerFactory::getLogger()->error(rv, "hashtable_get\n"); |
| | | LoggerFactory::getLogger()->error(rv, "hashtable_get 6"); |
| | | } |
| | | } |
| | | |
| | | rv = SemUtil::inc(hashtable->mutex); |
| | | if(rv != 0) { |
| | | LoggerFactory::getLogger()->error(rv, "hashtable_get\n"); |
| | | LoggerFactory::getLogger()->error(rv, "hashtable_get 7"); |
| | | } |
| | | return res; |
| | | } |
| | |
| | | ) |
| | | |
| | | |
| | | # add the install targets |
| | | install(TARGETS test1 DESTINATION bin) |
| | | add_executable(svsem_test svsem_test.cpp ) |
| | | target_link_libraries(svsem_test PRIVATE ${EXTRA_LIBS} ) |
| | | target_include_directories(svsem_test PRIVATE |
| | | "${PROJECT_BINARY_DIR}" |
| | | ${EXTRA_INCLUDES} |
| | | ) |
| | | |
| | | |
| | | |
| | | add_executable(svsem_mon svsem_mon.cpp ) |
| | | target_link_libraries(svsem_mon PRIVATE ${EXTRA_LIBS} ) |
| | | target_include_directories(svsem_mon PRIVATE |
| | | "${PROJECT_BINARY_DIR}" |
| | | ${EXTRA_INCLUDES} |
| | | ) |
| | | |
| | | |
| | |
| | | { |
| | | int s; |
| | | |
| | | sigset_t mask_all, pre; |
| | | sigfillset(&mask_all); |
| | | /* __sync_bool_compare_and_swap(ptr, oldval, newval) is a gcc |
| | | built-in function. It atomically performs the equivalent of: |
| | | |
| | |
| | | |
| | | /* Is the futex available? */ |
| | | |
| | | if (__sync_bool_compare_and_swap(futexp, 1, 0)) |
| | | if (__sync_bool_compare_and_swap(futexp, 1, 0)) { |
| | | sigprocmask(SIG_BLOCK, &mask_all, &pre); |
| | | break; /* Yes */ |
| | | } |
| | | |
| | | /* Futex is not available; wait */ |
| | | |
| | | s = futex(futexp, FUTEX_WAIT, 0, NULL, NULL, 0); |
| | | if (s == -1 && errno != EAGAIN) |
| | | errExit("futex-FUTEX_WAIT"); |
| | |
| | | fpost(int *futexp) |
| | | { |
| | | int s; |
| | | |
| | | sigset_t mask; |
| | | sigemptyset(&mask); |
| | | /* __sync_bool_compare_and_swap() was described in comments above */ |
| | | |
| | | if (__sync_bool_compare_and_swap(futexp, 0, 1)) { |
| | | |
| | | s = futex(futexp, FUTEX_WAKE, 1, NULL, NULL, 0); |
| | | sigprocmask(SIG_SETMASK, &mask, NULL); |
| | | if (s == -1) |
| | | errExit("futex-FUTEX_WAKE"); |
| | | } |
| | |
| | | |
| | | void sigint_handler(int sig) { |
| | | // net_mod_socket_close(server_socket); |
| | | printf("===Catch sigint======================\n"); |
| | | shm_mm_wrapper_destroy(); |
| | | exit(0); |
| | | // printf("===Catch sigint======================\n"); |
| | | // shm_mm_wrapper_destroy(); |
| | | // exit(0); |
| | | } |
| | | |
| | | void server(int port) { |
| | |
| | | |
| | | |
| | | void *runclient(void *arg) { |
| | | signal(SIGINT, sigint_handler); |
| | | // signal(SIGINT, sigint_handler); |
| | | Targ *targ = (Targ *)arg; |
| | | int port = targ->port; |
| | | void *client = net_mod_socket_open(); |
| | |
| | | #! /bin/bash |
| | | |
| | | PROCESSES=100 |
| | | PROCESSES=10 |
| | | function clean() { |
| | | ps -ef | grep "heart_beat" | awk '{print $2}' | xargs -i kill -9 {} |
| | | ipcrm -a |
| | | ipcrm -a |
| | | ps -ef | grep "heart_beat" | awk '{print $2}' | xargs -i kill -9 {} |
| | | |
| | | } |
| | | |
| | | function start_server() { |
| | |
| | | kill -9 ${pid_arr[$i]} |
| | | #./heart_beat client 101 & ${pid_arr[$i]}=$! |
| | | done |
| | | ipcrm -a |
| | | } |
| | | |
| | | |
| | |
| | | "server") |
| | | start_server |
| | | ;; |
| | | |
| | | "clients") |
| | | start_clients |
| | | sleep 5 |
| | | close_clients |
| | | ;; |
| | | |
| | | |
| | | "clean") |
| | | clean |
| | | ;; |
| | | |
| | | "") |
| | | start_server |
| | | sleep 1 |
| | |
| | | sleep 5 |
| | | close_clients |
| | | ;; |
| | | |
| | | |
| | | *) |
| | | echo "error input" |
| | | exit 1 |