Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> из "с" в "с++" 
:(
    Опции темы
box
Дата 9.9.2013, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



всем привет!
народ , помогите переделать функцию из с в с++ совместимую
Код

static inline void
pkt_copy(const void *_src, void *_dst, int l)
{
    const uint64_t *src = _src;
    uint64_t *dst = _dst;
#define likely(x)       __builtin_expect(!!(x), 1)
#define unlikely(x)       __builtin_expect(!!(x), 0)
    if (unlikely(l >= 1024)) {
        bcopy(src, dst, l);
        return;
    }
    for (; l > 0; l-=64) {
        *dst++ = *src++;
        *dst++ = *src++;
        *dst++ = *src++;
        *dst++ = *src++;
        *dst++ = *src++;
        *dst++ = *src++;
        *dst++ = *src++;
        *dst++ = *src++;
    }
}

просто когда компилю g++ сыпятся ошибки :

./nm_util.h:170:18: error: cannot initialize a variable of type 'const uint64_t *' (aka 'const unsigned long *') with an lvalue of type 'const void *'
        const uint64_t *src = _src;
                        ^     ~~~~
./nm_util.h:171:12: error: cannot initialize a variable of type 'uint64_t *' (aka 'unsigned long *') with an lvalue of type 'void *'
        uint64_t *dst = _dst;

PM MAIL   Вверх
kuzulis
Дата 9.9.2013, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 5.9.2007

Репутация: нет
Всего: 1



#include <cstdint>

Ах, сорри, скорее всего надо просто кастить, читай про reinterpret_cast и пр. касты.

Это сообщение отредактировал(а) kuzulis - 9.9.2013, 17:12
PM MAIL   Вверх
feodorv
Дата 9.9.2013, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



C++ более требовательный к преобразованию типов, и по умолчанию void* не сводится к long*.
Можно в старом стиле просто написать:
Код

    const uint64_t *src = (uint64_t *) _src;

либо более культурно воспользоваться static_cast.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
box
Дата 9.9.2013, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



спасибо
а еще вопросик , там как я понимаю идет копирование данных из структуры в структуру , как унгичтожить данные по адресу src ?
PM MAIL   Вверх
bsa
Дата 9.9.2013, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



box, если не секрет, а чем memcpy не подошел?
Цитата(box @  9.9.2013,  19:29 Найти цитируемый пост)
 как унгичтожить данные по адресу src ?
Что ты понимаешь под "уничтожить"? Освободить память или записать мусор? Если первое, то free().
PM   Вверх
feodorv
Дата 9.9.2013, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(box @  9.9.2013,  19:29 Найти цитируемый пост)
как унгичтожить данные по адресу src ? 

Очень мало информации Вы предоставили для ответа.
  • что происходит с данными по адресу dst?
  • была ли аллокирована память под src?
  • что сбой представляют данные scr?
  • что Вы вкладываете в термин "уничтожить"?



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
box
Дата 9.9.2013, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



дело имею с кольцевыми буферами netmap , напрямую освобождать память не получается free(rxring) 
<jemalloc>: /usr/src/lib/libc/../../contrib/jemalloc/include/jemalloc/internal/arena.h:949: Failed assertion: "arena_mapbits_allocated_get(chunk, pageind) != 0"
а если не освобождать память то буфер сетевой карты очень быстро переполняется...
надо не заметно удалить все данные из слота ринг буфера 
даже и не знаю куда копать ...

Добавлено через 12 минут и 32 секунды
смотрите комент:
Код


static int
process_rings(struct netmap_ring *rxring, struct netmap_ring *txring,
          u_int limit, const char *msg, struct my_ring *src, struct my_ring *dst)
{
    u_int j, k, m = 0;

    /* print a warning if any of the ring flags is set (e.g. NM_REINIT) */
    if (rxring->flags || txring->flags)
        D("%s rxflags %x txflags %x",
            msg, rxring->flags, txring->flags);
    j = rxring->cur; /* RX */
    k = txring->cur; /* TX */
    if (rxring->avail < limit)
        limit = rxring->avail;
    if (txring->avail < limit)
        limit = txring->avail;
    m = limit;
    while (limit-- > 0) {
        struct netmap_slot *rs = &rxring->slot[j];
        struct netmap_slot *ts = &txring->slot[k];
        
        char *rxbuf = NETMAP_BUF(rxring, rs->buf_idx);
        char *txbuf = NETMAP_BUF(txring, ts->buf_idx);

        /* swap packets */
        if (ts->buf_idx < 2 || rs->buf_idx < 2) {D("wrong index rx[%d] = %d  -> tx[%d] = %d", j, rs->buf_idx, k, ts->buf_idx);sleep(2);}

        /* copy the packet length. */
        if (rs->len < 14 || rs->len > 2048)
            D("wrong len %d rx[%d] -> tx[%d]", rs->len, j, k);
        else if (verbose > 1)
            D("%s send len %d rx[%d] -> tx[%d]", msg, rs->len, j, k);
        ts->len = rs->len;

                int res = 1;
                res = check_(rxbuf, rs->len);//тут проводим проверку пакета и если возвращаем 1 то пускаем пакет по назначению а если 0 то дропаем его не посылая в стек ядра 

                 if(res == 1)
                 {
        pkt_copy(rxbuf, txbuf, ts->len);
                  }else{
/*тут надо освободить память */
                  }

        j = NETMAP_RING_NEXT(rxring, j);
        k = NETMAP_RING_NEXT(txring, k);
    }
    rxring->avail -= m;
    txring->avail -= m;
    rxring->cur = j;
    txring->cur = k;

    return (m);
}



/* move packts from src to destination */
static int
move(struct my_ring *src, struct my_ring *dst, u_int limit)
{
    struct netmap_ring *txring, *rxring;
    u_int m = 0, si = src->begin, di = dst->begin;
    const char *msg = (src->queueid & NETMAP_SW_RING) ? "host->net" : "net->host";

    while (si < src->end && di < dst->end) {
        rxring = NETMAP_RXRING(src->nifp, si);
        txring = NETMAP_TXRING(dst->nifp, di);
        ND("txring %p rxring %p", txring, rxring);
        if (rxring->avail == 0) {
            si++;
            continue;
        }
        if (txring->avail == 0) {
            di++;
            continue;
        }
        m += process_rings(rxring, txring, limit, msg, src, dst);
    }

    return (m);
}


PM MAIL   Вверх
akizelokro
Дата 9.9.2013, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Код

static inline void
pkt_copy(const void *_src, void *_dst, int l)

написать в одну строку. это раз.

И вообще, код забавный. Лучше это не переделывать


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
feodorv
Дата 10.9.2013, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(box @  9.9.2013,  20:52 Найти цитируемый пост)
напрямую освобождать память не получается free(rxring) 

Ну, если не Вы лично эту память заказывали, то вполне понятно.

С NETMAP, увы, не знаком. Поверхностное чтение ознакомительного мануала показала, что эти буферы не нуждаются в непосредственном высвобождении, так как созданы в разделяемой памяти. Тем не менее, как-то нужно дать знать драйверу, что этот буфер больше не используется. Как - не знаю.

Этот вопрос лучше всего задать в этом разделе форума.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
box
Дата 10.9.2013, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



всем спасибо , вопрос решен!
Код

.....
memset(rxbuf, 0, rs->len);
pkt_copy(rxbuf, txbuf, ts->len);    
.....

немножко через опу но работает , не виснет от переполнения буфера.
странно , но иоцтл не работает почему то :
Код

        ioctl(src->fd, NIOCRXSYNC, NULL);

PM MAIL   Вверх
volatile
Дата 10.9.2013, 20:52 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(box @  9.9.2013,  15:14 Найти цитируемый пост)
всем привет!
народ , помогите переделать функцию из с в с++ совместимую

Код

static inline void
pkt_copy(const void *_src, void *_dst, int l)
{
   memcpy (_dst, _src, l);
}
 smile 
так побыстрее и побезопаснее будет,
а то у вас нехорошо, например, длина данных должна быть обязательно кратна 64 байтам, иначе случится что-то очень некрасивое...

PM MAIL   Вверх
borisbn
Дата 11.9.2013, 06:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



> длина данных должна быть обязательно кратна 64 байтам
Из названия ф-ции ИМХО следует, что так оно и д.б.
> так побыстрее
не факт  smile 



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 12.9.2013, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(borisbn @  11.9.2013,  06:58 Найти цитируемый пост)
> длина данных должна быть обязательно кратна 64 байтам
Из названия ф-ции ИМХО следует, что так оно и д.б.

pkt_copy - да, тут и ежу ясно что именно 64 байтные блоки должны быть, и никак иначе. как это я не догадался...

И кстати если делать копирование пакетами, то лучше уж передавать размер не в байтах, а кол-во пакетов.
Вот тогда, физически невозможно будет передать нечетное число. (как бы там офигенно ясно функция не называлась  smile )

Цитата(borisbn @  11.9.2013,  06:58 Найти цитируемый пост)
> так побыстрее
не факт   

memcpy - одна из наиболее оптимизированных функций CRT, написана на асме, с применением SSE
впрочем да, не факт.


Это сообщение отредактировал(а) volatile - 12.9.2013, 01:50
PM MAIL   Вверх
ТарасАтавин
Дата 16.9.2013, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



Поставь явное приведение типов указателей: 
Код
const uint64_t *src = (const uint64_t *) _src;
uint64_t *dst = (uint64_t *)_dst;
 вместо 
Код
const uint64_t *src =  _src;
uint64_t *dst =_dst;
.


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1177 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.