X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fceph%2Fsrc%2Ftest%2Fsystem%2Fcross_process_sem.cc;fp=src%2Fceph%2Fsrc%2Ftest%2Fsystem%2Fcross_process_sem.cc;h=0000000000000000000000000000000000000000;hb=7da45d65be36d36b880cc55c5036e96c24b53f00;hp=5785a6626b0d64a2c869c49408a1d4696f79e279;hpb=691462d09d0987b47e112d6ee8740375df3c51b2;p=stor4nfv.git diff --git a/src/ceph/src/test/system/cross_process_sem.cc b/src/ceph/src/test/system/cross_process_sem.cc deleted file mode 100644 index 5785a66..0000000 --- a/src/ceph/src/test/system/cross_process_sem.cc +++ /dev/null @@ -1,107 +0,0 @@ -// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- -// vim: ts=8 sw=2 smarttab -/* -* Ceph - scalable distributed file system -* -* Copyright (C) 2011 New Dream Network -* -* This is free software; you can redistribute it and/or -* modify it under the terms of the GNU Lesser General Public -* License version 2.1, as published by the Free Software -* Foundation. See file COPYING. -* -*/ - -#include "cross_process_sem.h" - -#include -#include -#include -#include - -/* We put our cross-process semaphore into a page of memory mapped with mmap. */ -struct cross_process_sem_data_t -{ - sem_t sem; -}; - -/* A factory function is a good choice here because we want to be able to - * return an error code. It does force heap allocation, but that is the - * easiest way to use synchronization primitives anyway. Most programmers don't - * care about destroying semaphores before the process finishes. It's pretty - * difficult to get it right and there is usually no benefit. - */ -int CrossProcessSem:: -create(int initial_val, CrossProcessSem** res) -{ - struct cross_process_sem_data_t *data = static_cast < cross_process_sem_data_t*> ( - mmap(NULL, sizeof(struct cross_process_sem_data_t), - PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0)); - if (data == MAP_FAILED) { - int err = errno; - return err; - } - int ret = sem_init(&data->sem, 1, initial_val); - if (ret) { - return ret; - } - *res = new CrossProcessSem(data); - return 0; -} - -CrossProcessSem:: -~CrossProcessSem() -{ - munmap(m_data, sizeof(struct cross_process_sem_data_t)); - m_data = NULL; -} - -void CrossProcessSem:: -wait() -{ - while(true) { - int ret = sem_wait(&m_data->sem); - if (ret == 0) - return; - int err = errno; - if (err == -EINTR) - continue; - abort(); - } -} - -void CrossProcessSem:: -post() -{ - int ret = sem_post(&m_data->sem); - if (ret == -1) { - abort(); - } -} - -int CrossProcessSem:: -reinit(int dval) -{ - if (dval < 0) - return -EINVAL; - int cval; - if (sem_getvalue(&m_data->sem, &cval) == -1) - return errno; - if (cval < dval) { - int diff = dval - cval; - for (int i = 0; i < diff; ++i) - sem_post(&m_data->sem); - } - else { - int diff = cval - dval; - for (int i = 0; i < diff; ++i) - sem_wait(&m_data->sem); - } - return 0; -} - -CrossProcessSem:: -CrossProcessSem(struct cross_process_sem_data_t *data) - : m_data(data) -{ -}