diff --git a/libs/libc/misc/lib_filesem.c b/libs/libc/misc/lib_filesem.c index 480d35cc814..5550d06fdf6 100644 --- a/libs/libc/misc/lib_filesem.c +++ b/libs/libc/misc/lib_filesem.c @@ -47,6 +47,10 @@ #include #include +#ifdef CONFIG_SMP +# include +#endif + #include "libc.h" #ifndef CONFIG_STDIO_DISABLE_BUFFERING @@ -77,6 +81,10 @@ void lib_sem_initialize(FAR struct file_struct *stream) void lib_take_semaphore(FAR struct file_struct *stream) { +#ifdef CONFIG_SMP + irqstate_t flags = enter_critical_section(); +#endif + pid_t my_pid = getpid(); int ret; @@ -108,6 +116,10 @@ void lib_take_semaphore(FAR struct file_struct *stream) stream->fs_holder = my_pid; stream->fs_counts = 1; } + +#ifdef CONFIG_SMP + leave_critical_section(flags); +#endif } /**************************************************************************** @@ -116,6 +128,10 @@ void lib_take_semaphore(FAR struct file_struct *stream) void lib_give_semaphore(FAR struct file_struct *stream) { +#ifdef CONFIG_SMP + irqstate_t flags = enter_critical_section(); +#endif + /* I better be holding at least one reference to the semaphore */ DEBUGASSERT(stream->fs_holder == getpid()); @@ -136,6 +152,10 @@ void lib_give_semaphore(FAR struct file_struct *stream) stream->fs_counts = 0; DEBUGVERIFY(_SEM_POST(&stream->fs_sem)); } + +#ifdef CONFIG_SMP + leave_critical_section(flags); +#endif } #endif /* CONFIG_STDIO_DISABLE_BUFFERING */