100 lines
1.9 KiB
C
100 lines
1.9 KiB
C
// Copyright (2017) Baidu Inc. All rights reserveed.
|
|
//
|
|
// File: lightduer_session.h
|
|
// Auth: Su Hao (suhao@baidu.com)
|
|
// Desc: Manage the talk session.
|
|
|
|
#include "lightduer_session.h"
|
|
#include "lightduer_log.h"
|
|
#include "lightduer_mutex.h"
|
|
#include "lightduer_random.h"
|
|
|
|
#define DUER_SESSION_START (10000)
|
|
#define DUER_SESSION_TATAL (DUER_SESSION_START * 10)
|
|
|
|
#define DUER_SESSION_INACTIVE (0x80000000)
|
|
|
|
static duer_u32_t g_session;
|
|
static duer_mutex_t g_mutex;
|
|
|
|
static void local_mutex_lock(duer_bool status)
|
|
{
|
|
duer_status_t rs;
|
|
if (status) {
|
|
rs = duer_mutex_lock(g_mutex);
|
|
} else {
|
|
rs = duer_mutex_unlock(g_mutex);
|
|
}
|
|
|
|
if (rs != DUER_OK) {
|
|
DUER_LOGE("lock failed: rs = %d, status = %d", rs, status);
|
|
}
|
|
}
|
|
|
|
void duer_session_initialize(void)
|
|
{
|
|
if (g_mutex == NULL) {
|
|
g_mutex = duer_mutex_create();
|
|
}
|
|
|
|
local_mutex_lock(DUER_TRUE);
|
|
|
|
g_session = DUER_SESSION_START + (duer_u32_t)duer_random() % DUER_SESSION_TATAL;
|
|
|
|
DUER_LOGI("random = %d", g_session);
|
|
|
|
local_mutex_lock(DUER_FALSE);
|
|
}
|
|
|
|
duer_u32_t duer_session_generate(void)
|
|
{
|
|
duer_u32_t rs;
|
|
|
|
local_mutex_lock(DUER_TRUE);
|
|
|
|
g_session &= (~DUER_SESSION_INACTIVE);
|
|
|
|
rs = ++g_session;
|
|
|
|
local_mutex_lock(DUER_FALSE);
|
|
|
|
return rs;
|
|
}
|
|
|
|
duer_bool duer_session_consume(duer_u32_t id)
|
|
{
|
|
duer_bool rs = DUER_FALSE;
|
|
|
|
local_mutex_lock(DUER_TRUE);
|
|
|
|
if (id == g_session) {
|
|
g_session |= DUER_SESSION_INACTIVE;
|
|
rs = DUER_TRUE;
|
|
}
|
|
|
|
local_mutex_lock(DUER_FALSE);
|
|
|
|
return rs;
|
|
}
|
|
|
|
duer_bool duer_session_is_matched(duer_u32_t id)
|
|
{
|
|
duer_bool rs;
|
|
|
|
local_mutex_lock(DUER_TRUE);
|
|
|
|
rs = (g_session == id) ? DUER_TRUE : DUER_FALSE;
|
|
|
|
local_mutex_lock(DUER_FALSE);
|
|
|
|
return rs;
|
|
}
|
|
|
|
void duer_session_finalize(void)
|
|
{
|
|
if (g_mutex != NULL) {
|
|
duer_mutex_destroy(g_mutex);
|
|
g_mutex = NULL;
|
|
}
|
|
}
|