4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: JuHyun Kim <jh8212.kim@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
33 #include <cobject_type.h>
40 cworker::cworker(void)
43 , mutex_lock(PTHREAD_MUTEX_INITIALIZER)
44 , th_cond(PTHREAD_COND_INITIALIZER)
48 for (i = 0; i < ENUM_LAST; i ++) {
52 ret = pthread_mutex_init(&mutex_lock, NULL);
54 ERR("pthread_mutex_init : %s",strerror(errno));
58 ret = pthread_cond_init(&th_cond, NULL);
60 ERR("pthread_cond_init : %s",strerror(errno));
63 DBG("processor worker created\n");
66 cworker::~cworker(void)
68 DBG("----------Processor WORKER TERMINATED--------\n");
70 pthread_mutex_lock(&(mutex_lock));
73 pthread_cond_signal(&th_cond);
75 pthread_mutex_unlock(&(mutex_lock));
77 pthread_cond_destroy(&th_cond);
79 if (m_func[TERMINATE])
80 m_func[TERMINATE](m_context);
82 DBG("processor worker terminated\n");
85 bool cworker::start(void)
89 pthread_mutex_lock(&(mutex_lock));
91 if(m_state == INITIAL)
93 pthread_mutex_unlock(&(mutex_lock));
94 ret = pthread_create(&m_thid, NULL, started, this);
98 pthread_mutex_lock(&(mutex_lock));
100 pthread_mutex_unlock(&(mutex_lock));
101 ERR("thread create fail\n");
106 pthread_detach(m_thid);
109 pthread_mutex_lock(&(mutex_lock));
111 else if (m_state == START) {
112 ERR("Already started\n");
113 pthread_mutex_unlock(&(mutex_lock));
117 ret = pthread_cond_signal(&th_cond);
119 ERR("pthread_cond_wait : %s",strerror(errno));
123 pthread_mutex_unlock(&(mutex_lock));
128 bool cworker::terminate(void)
130 pthread_mutex_lock(&(mutex_lock));
132 pthread_mutex_unlock(&(mutex_lock));
137 void *cworker::started(void *data)
139 cworker *inst = (cworker*)data;
140 worker_state_s state = STOPPED;
144 state = (worker_state_s)(int)inst->m_func[STARTED](inst->m_context);
146 if(state == STOPPED || inst->m_state == STOP)
149 }while(state != TERMINATE);
154 bool cworker::stop(void)
156 pthread_mutex_lock(&(mutex_lock));
157 if (m_state == STOP) {
158 ERR("Already stopped\n");
159 pthread_mutex_unlock(&(mutex_lock));
163 pthread_mutex_unlock(&(mutex_lock));
168 bool cworker::stopped(void)
170 pthread_mutex_lock(&mutex_lock);
171 pthread_cond_wait(&th_cond, &mutex_lock);
172 pthread_mutex_unlock(&mutex_lock);
176 cworker::worker_state_s cworker::state(void)
181 void cworker::set_start(void *(*start)(void *data))
183 m_func[START] = start;
186 void cworker::set_started(void *(*started)(void *data))
188 m_func[STARTED] = started;
191 void cworker::set_stop(void *(*stop)(void *data))
196 void cworker::set_stopped(void *(*stopped)(void *data))
198 m_func[STOPPED] = stopped;
201 void cworker::set_terminate(void *(*term)(void *data))
203 m_func[TERMINATE] = term;
206 void cworker::set_context(void *ctx)