tizen 2.3 release
[framework/connectivity/multirat.git] / src / multirat_poll_thread.c
1 #include "multirat_SB_http.h"
2 #include "multirat_poll_thread.h"
3 #include "multirat_process.h"
4 #include "multirat_conf.h"
5 #include "multirat_watch_dog_thread.h"
6 #include "multirat_libapi.h"
7 #include "multirat_file_manager.h"
8 #include "multirat_file_stream.h"
9
10 PollThread* PollThread_init()
11 {
12         PollThread *PollThrd = malloc(sizeof(PollThread));
13         if(PollThrd == NULL)
14         {
15                 TIZEN_LOGD("Error !!! curl thread allocation failed [%d] [%s]", errno, strerror(errno));
16                 return NULL;
17         }
18         memset(PollThrd,0,sizeof(PollThread));
19         return PollThrd;
20 }
21
22 void PollThread_start(SmartBondingData *SBData)
23 {
24         int32 ECode = 0;
25         pthread_t thread = 0;
26
27         if ((ECode = pthread_create(&thread, NULL, PollThread_entry_function,(void *)SBData)) != 0)
28         {
29                 TIZEN_LOGD("Error !!! creating pthread [%d] [%s]", errno, strerror(errno));
30                 PollThread_exit(SBData->PollThrd);
31                 SBData->PollThrd = NULL;
32         }
33         else
34         {
35                 TIZEN_LOGD("SBData [%p] Poll Thread Started", SBData);
36                 SBData->PollThrd->threadStatus = THREAD_INIT;
37                 SBData->PollThrd->threadId = thread;
38         }
39 }
40
41 void *PollThread_entry_function(void *pArg)
42 {
43         SmartBondingData *SBData = (SmartBondingData *)pArg;
44         if(SBData)
45         {
46                 PollThread_run_thread(SBData);
47         }
48         return NULL;
49 }
50
51 void PollThread_exit(PollThread *PollThrd)
52 {
53         TIZEN_LOGD("Poll Thread Exit called");
54         if(PollThrd != NULL)
55         {
56                 if(PollThrd->threadStatus == THREAD_INIT)
57                         usleep(100000);
58                 PollThrd->threadStatus = THREAD_FINISH;
59
60                 if(0 != PollThrd->threadId)
61                         pthread_join(PollThrd->threadId,NULL);
62                 PollThrd->threadId = 0;
63                 free(PollThrd);
64                 PollThrd = NULL;
65         }
66         TIZEN_LOGD("Poll Thread Exit done");
67 }
68
69 void PollThread_run_thread(SmartBondingData *SBData)
70 {
71         uint32 nbytes = 0;
72         PollThread *PollThrd = SBData->PollThrd;
73         char readbuffer[NOTI_TRIGGER_LENGTH + 1] = "\0";
74
75         TIZEN_LOGD("SBData[%p] Poll Thread Run", SBData);
76         PollThrd->threadStatus = THREAD_RUNNING;
77         /* Poll for the Data on Noti Pipe Fd */
78         while(PollThrd->threadStatus != THREAD_FINISH)
79         {
80                 TIZEN_D_LOGD("SBData[%p] Waiting For Data on Notification Pipe Fd", SBData);
81
82                 PollThread_poll(SBData->noti_pipefd[0], SBData, 1000);
83
84                 if(PollThrd->threadStatus == THREAD_FINISH)
85                 {
86                         TIZEN_LOGD("SBData[%p] Exiting Poll Thread",SBData);
87                         return;
88                 }
89
90         /* Read the Data from the Noti Pipe Fd */
91                 nbytes = read(SBData->noti_pipefd[0], readbuffer, NOTI_TRIGGER_LENGTH);
92                 nbytes = nbytes; /* Just to remove warnings */
93                 TIZEN_D_LOGD("SBData[%p] Read Data from Notification Pipe Fd [%s] Length [%d]",SBData, readbuffer, nbytes);
94
95                 /* Wait on Socket or PIPE fd */
96
97                 if(((SBData->response_body_read < SBData->expectedbytes) || (SBData->expectedbytes == 0) || (SBData->fStreamFileBufferReady == 0)))
98                 {
99                         TIZEN_D_LOGD("SBData[%p] Waiting For Data on Socket", SBData);
100                         PollThread_poll(SBData->socket_fd, SBData, 10);
101                         /* Write Into Trigger Pipe Fd */
102                         TIZEN_D_LOGD("SBData [%p] Write Data to Trigger Pipe Fd [%s]", SBData, NOTI_TRIGGER);
103                         nbytes = write(SBData->trigger_pipefd[1], NOTI_TRIGGER, NOTI_TRIGGER_LENGTH);
104                 }
105                 else
106                 {
107                         TIZEN_D_LOGD("SBData[%p] Waiting For Data on Node", SBData);
108                         PollThread_poll_buffer(SBData);
109                         /* Write Into Trigger Pipe Fd */
110                         TIZEN_D_LOGD("SBData[%p] Write Data to Trigger Pipe Fd [%s]", SBData, NOTI_TRIGGER);
111                         nbytes = write(SBData->trigger_pipefd[1], NOTI_TRIGGER, NOTI_TRIGGER_LENGTH);
112                 }
113         }
114         PollThrd->threadStatus = THREAD_FINISH;
115 }