/** * lock.c * Функции блокировок * * Функционал блокировок и синхронизации * */ #include #include #include #include #include // Если не заблокировано - блокируем int lock_swap(lock_t lock) { if (lock.lock) { return 0; } lock.lock = 1; return 1; } // Запрос блокировки ресурса void lock_acquire(lock_t lock) { uint64_t count = 0; for (;;) { if (lock_swap(lock)) { break; } count++; if (count > 10000) { LOG("%s:%u блокировка зависла", lock.func, lock.line); assert(0); } asm volatile("pause"); if (task_f_init) { task_switch( ); } } } // Запрос разблокировки ресурса void lock_release(lock_t lock) { if (lock.lock) { lock.lock = 0; } }