Useless contribution and activities.
Night mode:
@nightcardat25
Post #1488
68
یه 20 دقیقه ای وقت دارم، بیاین یک کار جالب بکنیم.
توی liburing یک فانکشن ساده هست که یک فلگ روی ring تنظیم میکنه، باعث میشه اون پشت ring یک عملکرد پیچیده انجام بده ولی خود فانکشن ساده است، فقط یک فلگ تنظیم میکنه.
خب... بیاین بریم سورس کدش رو پیدا کنیم 🥹
(2minutes...)
پیداش کردم، تو liburing عه.
خب خب خب، جالب میشه اینجاش.
مثلا اینجا:
اون
خب حالا باز دقت کد رو نگاه کنین. 3 تا
توی liburing یک فانکشن ساده هست که یک فلگ روی ring تنظیم میکنه، باعث میشه اون پشت ring یک عملکرد پیچیده انجام بده ولی خود فانکشن ساده است، فقط یک فلگ تنظیم میکنه.
خب... بیاین بریم سورس کدش رو پیدا کنیم 🥹
(2minutes...)
پیداش کردم، تو liburing عه.
__cold int io_uring_ring_dontfork(struct io_uring *ring)
{
size_t len;
int ret;
if (!ring->sq.ring_ptr || !ring->sq.sqes || !ring->cq.ring_ptr)
return -EINVAL;
len = io_uring_sqes_size(ring);
ret = __sys_madvise(ring->sq.sqes, len, MADV_DONTFORK);
if (ret < 0)
return ret;
len = ring->sq.ring_sz;
ret = __sys_madvise(ring->sq.ring_ptr, len, MADV_DONTFORK);
if (ret < 0)
return ret;
if (ring->cq.ring_ptr != ring->sq.ring_ptr) {
len = ring->cq.ring_sz;
ret = __sys_madvise(ring->cq.ring_ptr, len, MADV_DONTFORK);
if (ret < 0)
return ret;
}
return 0;
}
خب خب خب، جالب میشه اینجاش.
madvise اینجوریه که به کرنل یک چیزی راجب یک تیکه از حافظه میگی.مثلا اینجا:
len = io_uring_sqes_size(ring);
ret = __sys_madvise(ring->sq.sqes, len, MADV_DONTFORK);
if (ret < 0)
return ret;
اون
sqes یک پوینتر عه. len داره به اندازه اون متغییر اشاره میکنه و MADV_DONTFORK یعنی fork های این پراسس اجازه دسترسی به این حافظه رو ندارن.خب حالا باز دقت کد رو نگاه کنین. 3 تا
MADV_DONTFORK ست کرده. بیشتر توضیح نمیدم.- 🕊 1



