ftpd: Use self-contained synchronization objects

Update #2843.
This commit is contained in:
Sebastian Huber
2018-01-03 06:24:59 +01:00
parent a59a61828b
commit 0a593c2d3f

View File

@@ -205,6 +205,7 @@
#include <rtems/error.h> #include <rtems/error.h>
#include <rtems/ftpd.h> #include <rtems/ftpd.h>
#include <rtems/libio.h> #include <rtems/libio.h>
#include <rtems/thread.h>
#include <rtems/userenv.h> #include <rtems/userenv.h>
#include <syslog.h> #include <syslog.h>
@@ -279,8 +280,8 @@ typedef struct
int count; int count;
int head; int head;
int tail; int tail;
rtems_id mutex; rtems_mutex mutex;
rtems_id sem; rtems_counting_semaphore sem;
} FTPD_TaskPool_t; } FTPD_TaskPool_t;
/* /*
@@ -363,15 +364,11 @@ task_pool_done(int count)
free(task_pool.info); free(task_pool.info);
if(task_pool.queue) if(task_pool.queue)
free(task_pool.queue); free(task_pool.queue);
if(task_pool.mutex != (rtems_id)-1) rtems_mutex_destroy(&task_pool.mutex);
rtems_semaphore_delete(task_pool.mutex); rtems_counting_semaphore_destroy(&task_pool.sem);
if(task_pool.sem != (rtems_id)-1)
rtems_semaphore_delete(task_pool.sem);
task_pool.info = 0; task_pool.info = 0;
task_pool.queue = 0; task_pool.queue = 0;
task_pool.count = 0; task_pool.count = 0;
task_pool.sem = -1;
task_pool.mutex = -1;
} }
/* /*
@@ -398,32 +395,9 @@ task_pool_init(int count, rtems_task_priority priority)
task_pool.count = 0; task_pool.count = 0;
task_pool.head = task_pool.tail = 0; task_pool.head = task_pool.tail = 0;
task_pool.mutex = (rtems_id)-1;
task_pool.sem = (rtems_id)-1;
sc = rtems_semaphore_create( rtems_mutex_init(&task_pool.mutex, "FTPD");
rtems_build_name('F', 'T', 'P', 'M'), rtems_counting_semaphore_init(&task_pool.sem, "FTPD", (unsigned int) count);
1,
RTEMS_DEFAULT_ATTRIBUTES
| RTEMS_BINARY_SEMAPHORE
| RTEMS_INHERIT_PRIORITY
| RTEMS_PRIORITY,
RTEMS_NO_PRIORITY,
&task_pool.mutex);
if(sc == RTEMS_SUCCESSFUL)
sc = rtems_semaphore_create(
rtems_build_name('F', 'T', 'P', 'S'),
count,
RTEMS_DEFAULT_ATTRIBUTES,
RTEMS_NO_PRIORITY,
&task_pool.sem);
if(sc != RTEMS_SUCCESSFUL) {
task_pool_done(0);
syslog(LOG_ERR, "ftpd: Can not create semaphores");
return 0;
}
task_pool.info = (FTPD_SessionInfo_t*) task_pool.info = (FTPD_SessionInfo_t*)
malloc(sizeof(FTPD_SessionInfo_t) * count); malloc(sizeof(FTPD_SessionInfo_t) * count);
@@ -485,16 +459,12 @@ static FTPD_SessionInfo_t*
task_pool_obtain(void) task_pool_obtain(void)
{ {
FTPD_SessionInfo_t* info = 0; FTPD_SessionInfo_t* info = 0;
rtems_status_code sc; rtems_counting_semaphore_wait(&task_pool.sem);
sc = rtems_semaphore_obtain(task_pool.sem, RTEMS_NO_WAIT, RTEMS_NO_TIMEOUT); rtems_mutex_lock(&task_pool.mutex);
if (sc == RTEMS_SUCCESSFUL)
{
rtems_semaphore_obtain(task_pool.mutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
info = task_pool.queue[task_pool.head]; info = task_pool.queue[task_pool.head];
if(++task_pool.head >= task_pool.count) if(++task_pool.head >= task_pool.count)
task_pool.head = 0; task_pool.head = 0;
rtems_semaphore_release(task_pool.mutex); rtems_mutex_unlock(&task_pool.mutex);
}
return info; return info;
} }
@@ -513,12 +483,12 @@ task_pool_obtain(void)
static void static void
task_pool_release(FTPD_SessionInfo_t* info) task_pool_release(FTPD_SessionInfo_t* info)
{ {
rtems_semaphore_obtain(task_pool.mutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); rtems_mutex_lock(&task_pool.mutex);
task_pool.queue[task_pool.tail] = info; task_pool.queue[task_pool.tail] = info;
if(++task_pool.tail >= task_pool.count) if(++task_pool.tail >= task_pool.count)
task_pool.tail = 0; task_pool.tail = 0;
rtems_semaphore_release(task_pool.mutex); rtems_mutex_unlock(&task_pool.mutex);
rtems_semaphore_release(task_pool.sem); rtems_counting_semaphore_post(&task_pool.sem);
} }
/* /*